From 2c35570dc9ced8690ea269d1efab201c361fea98 Mon Sep 17 00:00:00 2001 From: tameraw <9868777+tameraw@users.noreply.github.com> Date: Thu, 16 Jul 2020 14:32:40 -0700 Subject: [PATCH] updated to 6.0.1 and added additional processors/toolchains --- common/inc/tx_api.h | 10 +- .../metaware/example_build/.metadata/.lock | 0 .../metaware/example_build/.metadata/.log | 937 ++ .../.plugins/org.eclipse.cdt.core/.log | 5 + .../sample_threadx.1453229896288.pdom | Bin 0 -> 225280 bytes .../sample_threadx.1592431055026.pdom | Bin 0 -> 262144 bytes .../sample_threadx.language.settings.xml | 4699 ++++++ .../org.eclipse.cdt.core/shareddefaults.xml | 1 + .../tx.1453229702368.pdom | Bin 0 -> 749568 bytes .../tx.language.settings.xml | 6159 ++++++++ .../org.eclipse.cdt.make.core/specs.c | 1 + .../org.eclipse.cdt.make.core/specs.cpp | 1 + .../spec.c | 0 .../spec.cpp | 0 .../org.eclipse.cdt.ui/dialog_settings.xml | 7 + .../sample_threadx/.indexes/properties.index | Bin 0 -> 422 bytes .../.projects/tx/.indexes/properties.index | Bin 0 -> 334 bytes .../.root/.indexes/history.version | 1 + .../.root/.indexes/properties.index | Bin 0 -> 104 bytes .../.root/.indexes/properties.version | 1 + .../org.eclipse.core.resources/.root/5.tree | Bin 0 -> 37707 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 516 bytes ....eclipse.cdt.core.prj-sample_threadx.prefs | 2 + .../org.eclipse.cdt.core.prj-tx.prefs | 2 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../org.eclipse.cdt.launchbar.core.prefs | 5 + .../org.eclipse.cdt.managedbuilder.core.prefs | 5 + .../.settings/org.eclipse.cdt.ui.prefs | 4 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.debug.core.prefs | 5 + .../.settings/org.eclipse.debug.ui.prefs | 8 + .../.settings/org.eclipse.ui.editors.prefs | 2 + .../.settings/org.eclipse.ui.ide.prefs | 5 + .../.settings/org.eclipse.ui.prefs | 2 + .../.settings/org.eclipse.ui.workbench.prefs | 4 + .../.launches/sample_threadx Debug.launch | 441 + .../org.eclipse.debug.ui/dialog_settings.xml | 11 + .../launchConfigurationHistory.xml | 23 + .../dialog_settings.xml | 15 + .../org.eclipse.e4.workbench/workbench.xmi | 1779 +++ .../.workspace/2020/6/25/refactorings.history | 4 + .../.workspace/2020/6/25/refactorings.index | 1 + .../dialog_settings.xml | 7 + .../dialog_settings.xml | 5 + .../org.eclipse.ui.ide/dialog_settings.xml | 14 + .../dialog_settings.xml | 29 + .../org.eclipse.ui.workbench/workingsets.xml | 4 + .../example_build/.metadata/version.ini | 3 + .../example_build/sample_threadx/.cproject | 145 + .../example_build/sample_threadx/.project | 26 + .../.settings/language.settings.xml | 35 + .../sample_threadx/sample_threadx.c | 368 + .../sample_threadx/sample_threadx.cmd | 56 + .../sample_threadx/tx_initialize_low_level.s | 360 + .../example_build/sample_threadx/vectors.s | 29 + .../metaware/example_build/tx/.cproject | 137 + .../arc_em/metaware/example_build/tx/.project | 48 + .../tx/.settings/language.settings.xml | 35 + ports/arc_em/metaware/inc/tx_port.h | 325 + ports/arc_em/metaware/readme_threadx.txt | 219 + .../metaware/src/tx_initialize_low_level.s | 360 + .../metaware/src/tx_thread_context_restore.s | 302 + .../metaware/src/tx_thread_context_save.s | 260 + .../src/tx_thread_interrupt_control.s | 87 + .../arc_em/metaware/src/tx_thread_schedule.s | 238 + .../metaware/src/tx_thread_stack_build.s | 205 + .../metaware/src/tx_thread_system_return.s | 169 + .../arc_em/metaware/src/tx_timer_interrupt.s | 238 + .../metaware/example_build/.metadata/.lock | 0 .../metaware/example_build/.metadata/.log | 2291 +++ .../.plugins/org.eclipse.cdt.core/.log | 16 + .../sample_threadx.1443481736829.pdom | Bin 0 -> 225280 bytes .../sample_threadx.1592441271034.pdom | Bin 0 -> 266240 bytes .../sample_threadx.language.settings.xml | 4753 ++++++ .../org.eclipse.cdt.core/shareddefaults.xml | 1 + .../tx.1443481396650.pdom | Bin 0 -> 749568 bytes .../tx.language.settings.xml | 6213 ++++++++ .../org.eclipse.cdt.make.core/specs.c | 1 + .../org.eclipse.cdt.make.core/specs.cpp | 1 + .../spec.c | 0 .../spec.cpp | 0 .../org.eclipse.cdt.ui/dialog_settings.xml | 7 + .../sample_threadx/.indexes/properties.index | Bin 0 -> 421 bytes .../.projects/tx/.indexes/properties.index | Bin 0 -> 335 bytes .../.root/.indexes/history.version | 1 + .../.root/.indexes/properties.index | Bin 0 -> 104 bytes .../.root/.indexes/properties.version | 1 + .../org.eclipse.core.resources/.root/16.tree | Bin 0 -> 38178 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 517 bytes ....eclipse.cdt.core.prj-sample_threadx.prefs | 2 + .../org.eclipse.cdt.core.prj-tx.prefs | 2 + .../org.eclipse.cdt.debug.core.prefs | 3 + .../.settings/org.eclipse.cdt.debug.ui.prefs | 7 + .../org.eclipse.cdt.launchbar.core.prefs | 5 + .../org.eclipse.cdt.managedbuilder.core.prefs | 5 + .../.settings/org.eclipse.cdt.ui.prefs | 4 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.debug.core.prefs | 5 + .../.settings/org.eclipse.debug.ui.prefs | 10 + .../.settings/org.eclipse.ui.editors.prefs | 2 + .../.settings/org.eclipse.ui.ide.prefs | 5 + .../.settings/org.eclipse.ui.prefs | 2 + .../.settings/org.eclipse.ui.workbench.prefs | 4 + .../.launches/sample_threadx Debug.launch | 457 + .../org.eclipse.debug.ui/dialog_settings.xml | 11 + .../launchConfigurationHistory.xml | 23 + .../dialog_settings.xml | 14 + .../org.eclipse.e4.workbench/workbench.xmi | 1828 +++ .../.workspace/2020/6/25/refactorings.history | 4 + .../.workspace/2020/6/25/refactorings.index | 1 + .../dialog_settings.xml | 7 + .../dialog_settings.xml | 5 + .../org.eclipse.ui.ide/dialog_settings.xml | 22 + .../dialog_settings.xml | 30 + .../org.eclipse.ui.workbench/workingsets.xml | 4 + .../example_build/.metadata/version.ini | 3 + .../example_build/sample_threadx/.bp.args | 3 + .../sample_threadx/.bp.properties | 13 + .../example_build/sample_threadx/.cproject | 143 + .../example_build/sample_threadx/.project | 26 + .../.settings/language.settings.xml | 35 + .../sample_threadx/sample_threadx.c | 370 + .../sample_threadx/sample_threadx.cmd | 54 + .../sample_threadx/tx_initialize_low_level.s | 328 + .../example_build/sample_threadx/vectors.s | 29 + .../metaware/example_build/tx/.cproject | 136 + .../arc_hs/metaware/example_build/tx/.project | 48 + .../tx/.settings/language.settings.xml | 35 + ports/arc_hs/metaware/inc/tx_port.h | 338 + ports/arc_hs/metaware/readme_threadx.txt | 251 + .../src/tx_initialize_fast_interrupt_setup.s | 107 + .../src/tx_thread_context_fast_restore.s | 303 + .../src/tx_thread_context_fast_save.s | 108 + .../metaware/src/tx_thread_context_restore.s | 322 + .../metaware/src/tx_thread_context_save.s | 242 + .../src/tx_thread_interrupt_control.s | 87 + .../src/tx_thread_register_bank_assign.s | 113 + .../arc_hs/metaware/src/tx_thread_schedule.s | 265 + .../metaware/src/tx_thread_stack_build.s | 205 + .../metaware/src/tx_thread_system_return.s | 169 + .../arc_hs/metaware/src/tx_timer_interrupt.s | 238 + .../arm9/ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + ports/arm9/ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 444 + ports/arm9/ac5/inc/tx_port.h | 329 + ports/arm9/ac5/readme_threadx.txt | 518 + .../arm9/ac5/src/tx_thread_context_restore.s | 247 + ports/arm9/ac5/src/tx_thread_context_save.s | 207 + .../ac5/src/tx_thread_fiq_context_restore.s | 259 + .../arm9/ac5/src/tx_thread_fiq_context_save.s | 203 + .../arm9/ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 98 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../arm9/ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/arm9/ac5/src/tx_thread_schedule.s | 172 + ports/arm9/ac5/src/tx_thread_stack_build.s | 156 + ports/arm9/ac5/src/tx_thread_system_return.s | 150 + .../ac5/src/tx_thread_vectored_context_save.s | 209 + ports/arm9/ac5/src/tx_timer_interrupt.s | 258 + .../arm9/gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/arm9/gnu/example_build/crt0.S | 90 + ports/arm9/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/arm9/gnu/example_build/reset.S | 76 + ports/arm9/gnu/example_build/sample_threadx.c | 369 + .../arm9/gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/arm9/gnu/inc/tx_port.h | 316 + ports/arm9/gnu/readme_threadx.txt | 496 + .../arm9/gnu/src/tx_thread_context_restore.S | 241 + ports/arm9/gnu/src/tx_thread_context_save.S | 210 + .../gnu/src/tx_thread_fiq_context_restore.S | 256 + .../arm9/gnu/src/tx_thread_fiq_context_save.S | 204 + .../arm9/gnu/src/tx_thread_fiq_nesting_end.S | 111 + .../gnu/src/tx_thread_fiq_nesting_start.S | 104 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 116 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../arm9/gnu/src/tx_thread_irq_nesting_end.S | 111 + .../gnu/src/tx_thread_irq_nesting_start.S | 104 + ports/arm9/gnu/src/tx_thread_schedule.S | 187 + ports/arm9/gnu/src/tx_thread_stack_build.S | 178 + ports/arm9/gnu/src/tx_thread_system_return.S | 167 + .../gnu/src/tx_thread_vectored_context_save.S | 199 + ports/arm9/gnu/src/tx_timer_interrupt.S | 279 + ports/arm9/iar/example_build/azure_rtos.eww | 13 + ports/arm9/iar/example_build/cstartup.s | 161 + ports/arm9/iar/example_build/sample_threadx.c | 374 + .../arm9/iar/example_build/sample_threadx.dep | 220 + .../arm9/iar/example_build/sample_threadx.ewd | 2974 ++++ .../arm9/iar/example_build/sample_threadx.ewp | 2130 +++ .../arm9/iar/example_build/sample_threadx.ewt | 2791 ++++ .../arm9/iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1686 +++ .../example_build/settings/sample_threadx.dnx | 99 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + ports/arm9/iar/example_build/settings/tx.crun | 13 + .../arm9/iar/example_build/settings/tx.dbgdt | 4 + ports/arm9/iar/example_build/settings/tx.dnx | 58 + ports/arm9/iar/example_build/tx.dep | 9603 +++++++++++++ ports/arm9/iar/example_build/tx.ewd | 2974 ++++ ports/arm9/iar/example_build/tx.ewp | 2766 ++++ ports/arm9/iar/example_build/tx.ewt | 3427 +++++ .../example_build/tx_initialize_low_level.s | 327 + ports/arm9/iar/inc/tx_port.h | 388 + ports/arm9/iar/readme_threadx.txt | 528 + ports/arm9/iar/src/tx_iar.c | 804 ++ .../arm9/iar/src/tx_thread_context_restore.s | 245 + ports/arm9/iar/src/tx_thread_context_save.s | 211 + .../iar/src/tx_thread_fiq_context_restore.s | 257 + .../arm9/iar/src/tx_thread_fiq_context_save.s | 203 + .../arm9/iar/src/tx_thread_fiq_nesting_end.s | 109 + .../iar/src/tx_thread_fiq_nesting_start.s | 102 + .../iar/src/tx_thread_interrupt_control.s | 103 + .../iar/src/tx_thread_interrupt_disable.s | 101 + .../iar/src/tx_thread_interrupt_restore.s | 87 + .../arm9/iar/src/tx_thread_irq_nesting_end.s | 110 + .../iar/src/tx_thread_irq_nesting_start.s | 102 + ports/arm9/iar/src/tx_thread_schedule.s | 171 + ports/arm9/iar/src/tx_thread_stack_build.s | 158 + ports/arm9/iar/src/tx_thread_system_return.s | 149 + .../iar/src/tx_thread_vectored_context_save.s | 195 + ports/arm9/iar/src/tx_timer_interrupt.s | 260 + ports/c667x/ccs/example_build/include/C66XX.h | 150 + .../ccs/example_build/include/C66XX_DEF.hxx | 1678 +++ .../example_build/include/C66XX_FUNCTIONS.hxx | 1693 +++ .../example_build/include/C66XX_MACROS.hxx | 1154 ++ .../ccs/example_build/include/TA66XX_DSP.h | 251 + .../ccs/example_build/include/TA66XX_DSP_BC.h | 121 + .../include/TA66XX_DSP_BC_FUNCTIONS.hxx | 1732 +++ .../ccs/example_build/include/TA66XX_OSAL.h | 649 + .../ccs/example_build/include/TASDK_ERR.h | 87 + .../sample_threadx_c6678evm/.ccsproject | 14 + .../sample_threadx_c6678evm/.cproject | 167 + .../sample_threadx_c6678evm/.project | 89 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../org.eclipse.core.resources.prefs | 6 + .../sample_threadx_c6678evm/board_setup.c | 441 + .../sample_threadx_c6678evm/board_setup.h | 209 + .../sample_threadx_c6678evm/sample_threadx.c | 528 + .../sample_threadx.cmd | 55 + .../targetConfigs/TMS320C6678.ccxml | 17 + .../targetConfigs/readme.txt | 9 + .../tx_initialize_low_level.asm | 405 + .../sample_threadx_ta6678fmc/.ccsproject | 14 + .../sample_threadx_ta6678fmc/.cproject | 168 + .../sample_threadx_ta6678fmc/.project | 89 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../org.eclipse.core.resources.prefs | 6 + .../sample_threadx_ta6678fmc/board_setup.c | 329 + .../sample_threadx_ta6678fmc/board_setup.h | 151 + .../sample_threadx_ta6678fmc/sample_threadx.c | 528 + .../sample_threadx.cmd | 53 + .../targetConfigs/TMS320C6678.ccxml | 17 + .../targetConfigs/readme.txt | 9 + .../tx_initialize_low_level.asm | 406 + ports/c667x/ccs/example_build/tx/.ccsproject | 12 + ports/c667x/ccs/example_build/tx/.cproject | 126 + ports/c667x/ccs/example_build/tx/.project | 105 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../tx/.settings/org.eclipse.cdt.core.prefs | 5 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../org.eclipse.cdt.managedbuilder.core.prefs | 6 + .../org.eclipse.core.resources.prefs | 15 + .../ccs/example_build/tx/Release/ccsObjs.opt | 1 + .../ccs/example_build/tx/Release/objects.mk | 8 + .../ccs/example_build/tx/Release/sources.mk | 110 + .../example_build/tx/Release/subdir_rules.mk | 22 + .../example_build/tx/Release/subdir_vars.mk | 1174 ++ ports/c667x/ccs/inc/tx_port.h | 277 + ports/c667x/ccs/readme_threadx.txt | 248 + .../ccs/src/tx_thread_context_restore.asm | 343 + .../c667x/ccs/src/tx_thread_context_save.asm | 274 + .../ccs/src/tx_thread_interrupt_control.asm | 95 + ports/c667x/ccs/src/tx_thread_schedule.asm | 254 + ports/c667x/ccs/src/tx_thread_stack_build.asm | 257 + .../c667x/ccs/src/tx_thread_system_return.asm | 162 + ports/c667x/ccs/src/tx_timer_interrupt.asm | 300 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_a15/gnu/example_build/crt0.S | 90 + ports/cortex_a15/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_a15/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_a15/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_a15/gnu/inc/tx_port.h | 323 + ports/cortex_a15/gnu/readme_threadx.txt | 513 + .../gnu/src/tx_thread_context_restore.S | 257 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 260 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_a15/gnu/src/tx_thread_schedule.S | 255 + .../gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 180 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_a15/gnu/src/tx_timer_interrupt.S | 279 + .../ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 394 + ports/cortex_a5/ac5/inc/tx_port.h | 334 + ports/cortex_a5/ac5/readme_threadx.txt | 545 + .../ac5/src/tx_thread_context_restore.s | 256 + .../ac5/src/tx_thread_context_save.s | 200 + .../ac5/src/tx_thread_fiq_context_restore.s | 259 + .../ac5/src/tx_thread_fiq_context_save.s | 203 + .../ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 95 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/cortex_a5/ac5/src/tx_thread_schedule.s | 236 + .../cortex_a5/ac5/src/tx_thread_stack_build.s | 164 + .../ac5/src/tx_thread_system_return.s | 159 + .../ac5/src/tx_thread_vectored_context_save.s | 200 + ports/cortex_a5/ac5/src/tx_timer_interrupt.s | 258 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_a5/gnu/example_build/crt0.S | 90 + ports/cortex_a5/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_a5/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_a5/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_a5/gnu/inc/tx_port.h | 323 + ports/cortex_a5/gnu/readme_threadx.txt | 513 + .../gnu/src/tx_thread_context_restore.S | 257 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 260 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_a5/gnu/src/tx_thread_schedule.S | 255 + .../cortex_a5/gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 180 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_a5/gnu/src/tx_timer_interrupt.S | 279 + .../iar/example_build/azure_rtos.eww | 13 + ports/cortex_a5/iar/example_build/cstartup.s | 156 + .../iar/example_build/sample_threadx.c | 374 + .../iar/example_build/sample_threadx.dep | 220 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2130 +++ .../iar/example_build/sample_threadx.ewt | 2791 ++++ .../iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1385 ++ .../example_build/settings/sample_threadx.dnx | 99 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_a5/iar/example_build/tx.dep | 10500 ++++++++++++++ ports/cortex_a5/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_a5/iar/example_build/tx.ewp | 2763 ++++ ports/cortex_a5/iar/example_build/tx.ewt | 3424 +++++ .../example_build/tx_initialize_low_level.s | 327 + ports/cortex_a5/iar/inc/tx_port.h | 397 + ports/cortex_a5/iar/readme_threadx.txt | 544 + ports/cortex_a5/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 261 + .../iar/src/tx_thread_context_save.s | 210 + .../iar/src/tx_thread_fiq_context_restore.s | 272 + .../iar/src/tx_thread_fiq_context_save.s | 203 + .../iar/src/tx_thread_fiq_nesting_end.s | 109 + .../iar/src/tx_thread_fiq_nesting_start.s | 102 + .../iar/src/tx_thread_interrupt_control.s | 103 + .../iar/src/tx_thread_interrupt_disable.s | 101 + .../iar/src/tx_thread_interrupt_restore.s | 87 + .../iar/src/tx_thread_irq_nesting_end.s | 110 + .../iar/src/tx_thread_irq_nesting_start.s | 102 + ports/cortex_a5/iar/src/tx_thread_schedule.s | 243 + .../cortex_a5/iar/src/tx_thread_stack_build.s | 158 + .../iar/src/tx_thread_system_return.s | 164 + .../iar/src/tx_thread_vectored_context_save.s | 195 + ports/cortex_a5/iar/src/tx_timer_interrupt.s | 260 + .../example_build/sample_threadx/.cproject | 118 + .../ac6/example_build/sample_threadx/.project | 26 + .../.settings/language.settings.xml | 25 + .../armv8_aarch64_SystemTimer.S | 431 + .../armv8_aarch64_SystemTimer.h | 206 + .../sample_threadx/el3_vectors.S | 138 + .../example_build/sample_threadx/gic400_gic.c | 419 + .../example_build/sample_threadx/gic400_gic.h | 192 + .../example_build/sample_threadx/hw_setup.c | 104 + .../sample_threadx/sample_threadx.c | 381 + .../sample_threadx/sample_threadx.txt | 15 + .../example_build/sample_threadx/startup.S | 199 + .../cortex_a5x/ac6/example_build/tx/.cproject | 129 + .../cortex_a5x/ac6/example_build/tx/.project | 48 + .../tx/.settings/language.settings.xml | 25 + ports/cortex_a5x/ac6/inc/tx_port.h | 367 + ports/cortex_a5x/ac6/readme_threadx.txt | 255 + .../ac6/src/tx_initialize_low_level.S | 112 + .../ac6/src/tx_thread_context_restore.S | 302 + .../ac6/src/tx_thread_context_save.S | 228 + .../cortex_a5x/ac6/src/tx_thread_fp_disable.c | 95 + .../cortex_a5x/ac6/src/tx_thread_fp_enable.c | 95 + .../ac6/src/tx_thread_interrupt_control.S | 89 + .../ac6/src/tx_thread_interrupt_disable.S | 87 + .../ac6/src/tx_thread_interrupt_restore.S | 85 + ports/cortex_a5x/ac6/src/tx_thread_schedule.S | 240 + .../ac6/src/tx_thread_stack_build.S | 170 + .../ac6/src/tx_thread_system_return.S | 165 + ports/cortex_a5x/ac6/src/tx_timer_interrupt.S | 240 + .../ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 414 + ports/cortex_a7/ac5/inc/tx_port.h | 334 + ports/cortex_a7/ac5/readme_threadx.txt | 544 + .../ac5/src/tx_thread_context_restore.s | 256 + .../ac5/src/tx_thread_context_save.s | 199 + .../ac5/src/tx_thread_fiq_context_restore.s | 258 + .../ac5/src/tx_thread_fiq_context_save.s | 203 + .../ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 95 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/cortex_a7/ac5/src/tx_thread_schedule.s | 236 + .../cortex_a7/ac5/src/tx_thread_stack_build.s | 165 + .../ac5/src/tx_thread_system_return.s | 159 + .../ac5/src/tx_thread_vectored_context_save.s | 200 + ports/cortex_a7/ac5/src/tx_timer_interrupt.s | 258 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_a7/gnu/example_build/crt0.S | 90 + ports/cortex_a7/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_a7/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_a7/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_a7/gnu/inc/tx_port.h | 323 + ports/cortex_a7/gnu/readme_threadx.txt | 513 + .../gnu/src/tx_thread_context_restore.S | 257 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 260 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_a7/gnu/src/tx_thread_schedule.S | 255 + .../cortex_a7/gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 180 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_a7/gnu/src/tx_timer_interrupt.S | 279 + .../iar/example_build/azure_rtos.eww | 13 + ports/cortex_a7/iar/example_build/cstartup.s | 156 + .../iar/example_build/sample_threadx.c | 372 + .../iar/example_build/sample_threadx.dep | 219 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2130 +++ .../iar/example_build/sample_threadx.ewt | 2791 ++++ .../iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1632 +++ .../example_build/settings/sample_threadx.dnx | 99 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_a7/iar/example_build/tx.dep | 10516 ++++++++++++++ ports/cortex_a7/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_a7/iar/example_build/tx.ewp | 2763 ++++ ports/cortex_a7/iar/example_build/tx.ewt | 3424 +++++ .../example_build/tx_initialize_low_level.s | 327 + ports/cortex_a7/iar/inc/tx_port.h | 393 + ports/cortex_a7/iar/readme_threadx.txt | 544 + ports/cortex_a7/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 259 + .../iar/src/tx_thread_context_save.s | 210 + .../iar/src/tx_thread_fiq_context_restore.s | 270 + .../iar/src/tx_thread_fiq_context_save.s | 203 + .../iar/src/tx_thread_fiq_nesting_end.s | 109 + .../iar/src/tx_thread_fiq_nesting_start.s | 102 + .../iar/src/tx_thread_interrupt_control.s | 103 + .../iar/src/tx_thread_interrupt_disable.s | 101 + .../iar/src/tx_thread_interrupt_restore.s | 87 + .../iar/src/tx_thread_irq_nesting_end.s | 110 + .../iar/src/tx_thread_irq_nesting_start.s | 102 + ports/cortex_a7/iar/src/tx_thread_schedule.s | 239 + .../cortex_a7/iar/src/tx_thread_stack_build.s | 158 + .../iar/src/tx_thread_system_return.s | 162 + .../iar/src/tx_thread_vectored_context_save.s | 195 + ports/cortex_a7/iar/src/tx_timer_interrupt.s | 260 + .../ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 394 + ports/cortex_a8/ac5/inc/tx_port.h | 334 + ports/cortex_a8/ac5/readme_threadx.txt | 547 + .../ac5/src/tx_thread_context_restore.s | 256 + .../ac5/src/tx_thread_context_save.s | 200 + .../ac5/src/tx_thread_fiq_context_restore.s | 259 + .../ac5/src/tx_thread_fiq_context_save.s | 203 + .../ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 95 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/cortex_a8/ac5/src/tx_thread_schedule.s | 236 + .../cortex_a8/ac5/src/tx_thread_stack_build.s | 164 + .../ac5/src/tx_thread_system_return.s | 159 + .../ac5/src/tx_thread_vectored_context_save.s | 200 + ports/cortex_a8/ac5/src/tx_timer_interrupt.s | 258 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_a8/gnu/example_build/crt0.S | 90 + ports/cortex_a8/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_a8/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_a8/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_a8/gnu/inc/tx_port.h | 323 + ports/cortex_a8/gnu/readme_threadx.txt | 513 + .../gnu/src/tx_thread_context_restore.S | 257 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 260 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_a8/gnu/src/tx_thread_schedule.S | 255 + .../cortex_a8/gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 180 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_a8/gnu/src/tx_timer_interrupt.S | 279 + .../iar/example_build/azure_rtos.eww | 13 + ports/cortex_a8/iar/example_build/cstartup.s | 161 + .../iar/example_build/sample_threadx.c | 372 + .../iar/example_build/sample_threadx.dep | 222 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2130 +++ .../iar/example_build/sample_threadx.ewt | 2791 ++++ .../iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1385 ++ .../example_build/settings/sample_threadx.dnx | 99 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_a8/iar/example_build/tx.dep | 9603 +++++++++++++ ports/cortex_a8/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_a8/iar/example_build/tx.ewp | 2766 ++++ ports/cortex_a8/iar/example_build/tx.ewt | 3427 +++++ .../example_build/tx_initialize_low_level.s | 327 + ports/cortex_a8/iar/inc/tx_port.h | 397 + ports/cortex_a8/iar/readme_threadx.txt | 544 + ports/cortex_a8/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 259 + .../iar/src/tx_thread_context_save.s | 210 + .../iar/src/tx_thread_fiq_context_restore.s | 270 + .../iar/src/tx_thread_fiq_context_save.s | 203 + .../iar/src/tx_thread_fiq_nesting_end.s | 109 + .../iar/src/tx_thread_fiq_nesting_start.s | 102 + .../iar/src/tx_thread_interrupt_control.s | 103 + .../iar/src/tx_thread_interrupt_disable.s | 101 + .../iar/src/tx_thread_interrupt_restore.s | 87 + .../iar/src/tx_thread_irq_nesting_end.s | 110 + .../iar/src/tx_thread_irq_nesting_start.s | 102 + ports/cortex_a8/iar/src/tx_thread_schedule.s | 239 + .../cortex_a8/iar/src/tx_thread_stack_build.s | 158 + .../iar/src/tx_thread_system_return.s | 162 + .../iar/src/tx_thread_vectored_context_save.s | 195 + ports/cortex_a8/iar/src/tx_timer_interrupt.s | 260 + .../ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 414 + ports/cortex_a9/ac5/inc/tx_port.h | 334 + ports/cortex_a9/ac5/readme_threadx.txt | 545 + .../ac5/src/tx_thread_context_restore.s | 256 + .../ac5/src/tx_thread_context_save.s | 199 + .../ac5/src/tx_thread_fiq_context_restore.s | 258 + .../ac5/src/tx_thread_fiq_context_save.s | 203 + .../ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 95 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/cortex_a9/ac5/src/tx_thread_schedule.s | 236 + .../cortex_a9/ac5/src/tx_thread_stack_build.s | 165 + .../ac5/src/tx_thread_system_return.s | 159 + .../ac5/src/tx_thread_vectored_context_save.s | 200 + ports/cortex_a9/ac5/src/tx_timer_interrupt.s | 258 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_a9/gnu/example_build/crt0.S | 90 + ports/cortex_a9/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_a9/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_a9/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_a9/gnu/inc/tx_port.h | 323 + ports/cortex_a9/gnu/readme_threadx.txt | 513 + .../gnu/src/tx_thread_context_restore.S | 257 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 260 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_a9/gnu/src/tx_thread_schedule.S | 255 + .../cortex_a9/gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 180 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_a9/gnu/src/tx_timer_interrupt.S | 279 + .../iar/example_build/azure_rtos.eww | 13 + ports/cortex_a9/iar/example_build/cstartup.s | 156 + .../iar/example_build/sample_threadx.c | 372 + .../iar/example_build/sample_threadx.dep | 220 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2136 +++ .../iar/example_build/sample_threadx.ewt | 2797 ++++ .../iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1397 ++ .../example_build/settings/sample_threadx.dnx | 100 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_a9/iar/example_build/tx.dep | 9593 +++++++++++++ ports/cortex_a9/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_a9/iar/example_build/tx.ewp | 2766 ++++ ports/cortex_a9/iar/example_build/tx.ewt | 3427 +++++ .../example_build/tx_initialize_low_level.s | 327 + ports/cortex_a9/iar/inc/tx_port.h | 398 + ports/cortex_a9/iar/readme_threadx.txt | 544 + ports/cortex_a9/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 259 + .../iar/src/tx_thread_context_save.s | 210 + .../iar/src/tx_thread_fiq_context_restore.s | 270 + .../iar/src/tx_thread_fiq_context_save.s | 203 + .../iar/src/tx_thread_fiq_nesting_end.s | 109 + .../iar/src/tx_thread_fiq_nesting_start.s | 102 + .../iar/src/tx_thread_interrupt_control.s | 103 + .../iar/src/tx_thread_interrupt_disable.s | 101 + .../iar/src/tx_thread_interrupt_restore.s | 87 + .../iar/src/tx_thread_irq_nesting_end.s | 110 + .../iar/src/tx_thread_irq_nesting_start.s | 102 + ports/cortex_a9/iar/src/tx_thread_schedule.s | 240 + .../cortex_a9/iar/src/tx_thread_stack_build.s | 158 + .../iar/src/tx_thread_system_return.s | 166 + .../iar/src/tx_thread_vectored_context_save.s | 195 + ports/cortex_a9/iar/src/tx_timer_interrupt.s | 260 + .../ac5/example_build/build_threadx.bat | 230 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 284 + ports/cortex_m0/ac5/inc/tx_port.h | 335 + ports/cortex_m0/ac5/readme_threadx.txt | 143 + .../ac5/src/tx_thread_context_restore.s | 101 + .../ac5/src/tx_thread_context_save.s | 101 + .../ac5/src/tx_thread_interrupt_control.s | 87 + .../ac5/src/tx_thread_interrupt_disable.s | 83 + .../ac5/src/tx_thread_interrupt_restore.s | 82 + ports/cortex_m0/ac5/src/tx_thread_schedule.s | 278 + .../cortex_m0/ac5/src/tx_thread_stack_build.s | 146 + .../ac5/src/tx_thread_system_return.s | 97 + ports/cortex_m0/ac5/src/tx_timer_interrupt.s | 274 + .../gnu/example_build/build_threadx.bat | 229 + .../example_build/build_threadx_sample.bat | 7 + .../gnu/example_build/cortexm0_crt0.s | 127 + ports/cortex_m0/gnu/example_build/libgcc.a | Bin 0 -> 1551842 bytes .../gnu/example_build/sample_threadx.c | 372 + .../gnu/example_build/sample_threadx.ld | 206 + .../tx_initialize_low_level.S} | 0 .../tx_vectors.s} | 0 ports/cortex_m0/gnu/readme_threadx.txt | 155 + .../cortex_m0/gnu/src/tx_thread_stack_build.S | 33 +- .../iar/example_build/azure_rtos.eww | 13 + .../cortex_m0/iar/example_build/cstartup_M.s | 73 + .../iar/example_build/sample_threadx.c | 385 + .../iar/example_build/sample_threadx.dep | 118 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2127 +++ .../iar/example_build/sample_threadx.ewt | 2788 ++++ .../iar/example_build/sample_threadx.icf | 33 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1940 +++ .../example_build/settings/sample_threadx.dnx | 100 + .../settings/sample_threadx.reggroups | 1 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_m0/iar/example_build/tx.dep | 11975 ++++++++++++++++ ports/cortex_m0/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_m0/iar/example_build/tx.ewp | 2745 ++++ ports/cortex_m0/iar/example_build/tx.ewt | 3406 +++++ .../example_build/tx_initialize_low_level.s | 190 + ports/cortex_m0/iar/inc/tx_port.h | 365 + ports/cortex_m0/iar/readme_threadx.txt | 158 + ports/cortex_m0/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 106 + .../iar/src/tx_thread_context_save.s | 98 + .../iar/src/tx_thread_interrupt_control.s | 86 + .../iar/src/tx_thread_interrupt_disable.s | 84 + .../iar/src/tx_thread_interrupt_restore.s | 83 + ports/cortex_m0/iar/src/tx_thread_schedule.s | 272 + .../cortex_m0/iar/src/tx_thread_stack_build.s | 145 + .../iar/src/tx_thread_system_return.s | 98 + ports/cortex_m0/iar/src/tx_timer_interrupt.s | 271 + .../ac5/example_build/build_threadx.bat | 230 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 259 + ports/cortex_m3/ac5/inc/tx_port.h | 342 + ports/cortex_m3/ac5/readme_threadx.txt | 145 + .../ac5/src/tx_thread_context_restore.s | 94 + .../ac5/src/tx_thread_context_save.s | 94 + .../ac5/src/tx_thread_interrupt_control.s | 80 + .../ac5/src/tx_thread_interrupt_disable.s | 78 + .../ac5/src/tx_thread_interrupt_restore.s | 77 + ports/cortex_m3/ac5/src/tx_thread_schedule.s | 248 + .../cortex_m3/ac5/src/tx_thread_stack_build.s | 138 + .../ac5/src/tx_thread_system_return.s | 91 + ports/cortex_m3/ac5/src/tx_timer_interrupt.s | 266 + ports/cortex_m3/gnu/CMakeLists.txt | 1 - .../gnu/example_build/build_threadx.bat | 229 + .../example_build/build_threadx_sample.bat | 7 + .../gnu/example_build/cortexm3_crt0.s | 127 + ports/cortex_m3/gnu/example_build/libc.a | Bin 0 -> 743432 bytes .../gnu/example_build/sample_threadx.c | 370 + .../gnu/example_build/sample_threadx.ld | 206 + .../tx_initialize_low_level.S} | 13 +- .../tx_simulator_startup.s} | 0 ports/cortex_m3/gnu/readme_threadx.txt | 153 + .../cortex_m3/gnu/src/tx_thread_stack_build.S | 13 +- .../iar/example_build/azure_rtos.eww | 13 + .../cortex_m3/iar/example_build/cstartup_M.s | 73 + .../iar/example_build/sample_threadx.c | 385 + .../iar/example_build/sample_threadx.dep | 128 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2127 +++ .../iar/example_build/sample_threadx.ewt | 2788 ++++ .../iar/example_build/sample_threadx.icf | 34 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1623 +++ .../example_build/settings/sample_threadx.dnx | 99 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_m3/iar/example_build/tx.dep | 9780 +++++++++++++ ports/cortex_m3/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_m3/iar/example_build/tx.ewp | 2743 ++++ ports/cortex_m3/iar/example_build/tx.ewt | 3403 +++++ .../example_build/tx_initialize_low_level.s | 181 + ports/cortex_m3/iar/inc/tx_port.h | 375 + ports/cortex_m3/iar/readme_threadx.txt | 158 + ports/cortex_m3/iar/src/tx_iar.c | 804 ++ ports/cortex_m3/iar/src/tx_misra.s | 1003 ++ .../iar/src/tx_thread_context_restore.s | 97 + .../iar/src/tx_thread_context_save.s | 96 + .../iar/src/tx_thread_interrupt_control.s | 86 + .../iar/src/tx_thread_interrupt_disable.s | 84 + .../iar/src/tx_thread_interrupt_restore.s | 83 + ports/cortex_m3/iar/src/tx_thread_schedule.s | 250 + .../cortex_m3/iar/src/tx_thread_stack_build.s | 144 + .../iar/src/tx_thread_system_return.s | 98 + ports/cortex_m3/iar/src/tx_timer_interrupt.s | 268 + .../keil/example_build/ThreadX_Demo.uvopt | 300 + .../keil/example_build/ThreadX_Demo.uvproj | 573 + .../keil/example_build/ThreadX_Library.plg | 9 + .../keil/example_build/ThreadX_Library.uvopt | 2664 ++++ .../keil/example_build/ThreadX_Library.uvproj | 1550 ++ .../keil/example_build/sample_threadx.c | 262 + .../example_build/tx_initialize_low_level.s | 266 + ports/cortex_m3/keil/inc/tx_port.h | 346 + ports/cortex_m3/keil/readme_threadx.txt | 152 + .../keil/src/tx_thread_context_restore.s | 99 + .../keil/src/tx_thread_context_save.s | 99 + .../keil/src/tx_thread_interrupt_control.s | 85 + .../keil/src/tx_thread_interrupt_disable.s | 83 + .../keil/src/tx_thread_interrupt_restore.s | 82 + ports/cortex_m3/keil/src/tx_thread_schedule.s | 253 + .../keil/src/tx_thread_stack_build.s | 143 + .../keil/src/tx_thread_system_return.s | 96 + ports/cortex_m3/keil/src/tx_timer_interrupt.s | 271 + .../ac5/example_build/build_threadx.bat | 230 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 267 + ports/cortex_m4/ac5/inc/tx_port.h | 471 + ports/cortex_m4/ac5/readme_threadx.txt | 207 + .../ac5/src/tx_thread_context_restore.s | 94 + .../ac5/src/tx_thread_context_save.s | 94 + .../ac5/src/tx_thread_interrupt_control.s | 80 + .../ac5/src/tx_thread_interrupt_disable.s | 78 + .../ac5/src/tx_thread_interrupt_restore.s | 77 + ports/cortex_m4/ac5/src/tx_thread_schedule.s | 293 + .../cortex_m4/ac5/src/tx_thread_stack_build.s | 138 + .../ac5/src/tx_thread_system_return.s | 91 + ports/cortex_m4/ac5/src/tx_timer_interrupt.s | 266 + ports/cortex_m4/gnu/CMakeLists.txt | 1 - .../gnu/example_build/build_threadx.bat | 229 + .../example_build/build_threadx_sample.bat | 7 + .../gnu/example_build/cortexm4_crt0.s | 127 + ports/cortex_m4/gnu/example_build/libc.a | Bin 0 -> 743432 bytes .../gnu/example_build/sample_threadx.c | 370 + .../gnu/example_build/sample_threadx.ld | 206 + .../tx_initialize_low_level.S} | 13 +- .../tx_simulator_startup.s} | 0 ports/cortex_m4/gnu/readme_threadx.txt | 218 + .../cortex_m4/gnu/src/tx_thread_stack_build.S | 13 +- .../iar/example_build/azure_rtos.eww | 13 + .../cortex_m4/iar/example_build/cstartup_M.s | 73 + .../iar/example_build/sample_threadx.c | 389 + .../iar/example_build/sample_threadx.dep | 112 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2137 +++ .../iar/example_build/sample_threadx.ewt | 2788 ++++ .../iar/example_build/sample_threadx.icf | 42 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1701 +++ .../example_build/settings/sample_threadx.dnx | 100 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_m4/iar/example_build/tx.dep | 8968 ++++++++++++ ports/cortex_m4/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_m4/iar/example_build/tx.ewp | 2752 ++++ ports/cortex_m4/iar/example_build/tx.ewt | 3403 +++++ .../example_build/tx_initialize_low_level.s | 176 + ports/cortex_m4/iar/inc/tx_port.h | 493 + ports/cortex_m4/iar/readme_threadx.txt | 224 + ports/cortex_m4/iar/src/tx_iar.c | 804 ++ ports/cortex_m4/iar/src/tx_misra.s | 1074 ++ .../iar/src/tx_thread_context_restore.s | 98 + .../iar/src/tx_thread_context_save.s | 95 + .../iar/src/tx_thread_interrupt_control.s | 86 + .../iar/src/tx_thread_interrupt_disable.s | 84 + .../iar/src/tx_thread_interrupt_restore.s | 83 + ports/cortex_m4/iar/src/tx_thread_schedule.s | 291 + .../cortex_m4/iar/src/tx_thread_stack_build.s | 144 + .../iar/src/tx_thread_system_return.s | 98 + ports/cortex_m4/iar/src/tx_timer_interrupt.s | 268 + .../keil/example_build/ThreadX_Demo.uvopt | 305 + .../keil/example_build/ThreadX_Demo.uvproj | 573 + .../keil/example_build/ThreadX_Library.plg | 203 + .../keil/example_build/ThreadX_Library.uvopt | 2664 ++++ .../keil/example_build/ThreadX_Library.uvproj | 1481 ++ .../keil/example_build/demo_threadx.c | 262 + .../example_build/tx_initialize_low_level.s | 271 + ports/cortex_m4/keil/inc/tx_port.h | 471 + ports/cortex_m4/keil/readme_threadx.txt | 208 + .../keil/src/tx_thread_context_restore.s | 99 + .../keil/src/tx_thread_context_save.s | 99 + .../keil/src/tx_thread_interrupt_control.s | 85 + .../keil/src/tx_thread_interrupt_disable.s | 83 + .../keil/src/tx_thread_interrupt_restore.s | 82 + ports/cortex_m4/keil/src/tx_thread_schedule.s | 298 + .../keil/src/tx_thread_stack_build.s | 143 + .../keil/src/tx_thread_system_return.s | 96 + ports/cortex_m4/keil/src/tx_timer_interrupt.s | 271 + .../ac5/example_build/build_threadx.bat | 230 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 272 + ports/cortex_m7/ac5/inc/tx_port.h | 471 + ports/cortex_m7/ac5/readme_threadx.txt | 207 + .../ac5/src/tx_thread_context_restore.s | 99 + .../ac5/src/tx_thread_context_save.s | 99 + .../ac5/src/tx_thread_interrupt_control.s | 85 + .../ac5/src/tx_thread_interrupt_disable.s | 83 + .../ac5/src/tx_thread_interrupt_restore.s | 82 + ports/cortex_m7/ac5/src/tx_thread_schedule.s | 298 + .../cortex_m7/ac5/src/tx_thread_stack_build.s | 143 + .../ac5/src/tx_thread_system_return.s | 96 + ports/cortex_m7/ac5/src/tx_timer_interrupt.s | 271 + ports/cortex_m7/gnu/CMakeLists.txt | 1 - .../gnu/example_build/build_threadx.bat | 229 + .../example_build/build_threadx_sample.bat | 7 + .../gnu/example_build/cortexm7_crt0.s | 127 + ports/cortex_m7/gnu/example_build/libc.a | Bin 0 -> 743432 bytes .../gnu/example_build/sample_threadx.c | 370 + .../gnu/example_build/sample_threadx.ld | 206 + .../tx_initialize_low_level.S} | 13 +- .../tx_simulator_startup.s} | 0 ports/cortex_m7/gnu/readme_threadx.txt | 151 + .../cortex_m7/gnu/src/tx_thread_stack_build.S | 13 +- .../iar/example_build/azure_rtos.eww | 13 + .../cortex_m7/iar/example_build/cstartup_M.s | 73 + .../iar/example_build/sample_threadx.c | 381 + .../iar/example_build/sample_threadx.dep | 113 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2127 +++ .../iar/example_build/sample_threadx.ewt | 2788 ++++ .../iar/example_build/sample_threadx.icf | 42 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 13 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1356 ++ .../example_build/settings/sample_threadx.dnx | 99 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 13 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_m7/iar/example_build/tx.dep | 8055 +++++++++++ ports/cortex_m7/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_m7/iar/example_build/tx.ewp | 2742 ++++ ports/cortex_m7/iar/example_build/tx.ewt | 3403 +++++ .../example_build/tx_initialize_low_level.s | 177 + ports/cortex_m7/iar/inc/tx_port.h | 499 + ports/cortex_m7/iar/readme_threadx.txt | 216 + ports/cortex_m7/iar/src/tx_iar.c | 804 ++ ports/cortex_m7/iar/src/tx_misra.s | 1074 ++ .../iar/src/tx_thread_context_restore.s | 105 + .../iar/src/tx_thread_context_save.s | 97 + .../iar/src/tx_thread_interrupt_control.s | 86 + .../iar/src/tx_thread_interrupt_disable.s | 84 + .../iar/src/tx_thread_interrupt_restore.s | 83 + ports/cortex_m7/iar/src/tx_thread_schedule.s | 291 + .../cortex_m7/iar/src/tx_thread_stack_build.s | 144 + .../iar/src/tx_thread_system_return.s | 97 + ports/cortex_m7/iar/src/tx_timer_interrupt.s | 268 + .../ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 394 + ports/cortex_r4/ac5/inc/tx_port.h | 335 + ports/cortex_r4/ac5/readme_threadx.txt | 549 + .../ac5/src/tx_thread_context_restore.s | 255 + .../ac5/src/tx_thread_context_save.s | 199 + .../ac5/src/tx_thread_fiq_context_restore.s | 258 + .../ac5/src/tx_thread_fiq_context_save.s | 203 + .../ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 95 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/cortex_r4/ac5/src/tx_thread_schedule.s | 234 + .../cortex_r4/ac5/src/tx_thread_stack_build.s | 164 + .../ac5/src/tx_thread_system_return.s | 158 + .../ac5/src/tx_thread_vectored_context_save.s | 200 + ports/cortex_r4/ac5/src/tx_timer_interrupt.s | 258 + .../example_build/sample_threadx/.cproject | 134 + .../ac6/example_build/sample_threadx/.project | 26 + .../.settings/language.settings.xml | 25 + .../sample_threadx/cortex-r4_tx.launch | 288 + .../ac6/example_build/sample_threadx/gic.c | 239 + .../ac6/example_build/sample_threadx/gic.h | 360 + .../sample_threadx/sample_threadx.c | 373 + .../sample_threadx/sample_threadx.scat | 39 + .../example_build/sample_threadx/startup.S | 249 + .../ac6/example_build/sample_threadx/timer.c | 28 + .../ac6/example_build/sample_threadx/timer.h | 4 + .../cortex_r4/ac6/example_build/tx/.cproject | 135 + ports/cortex_r4/ac6/example_build/tx/.project | 48 + .../tx/.settings/language.settings.xml | 25 + ports/cortex_r4/ac6/inc/tx_port.h | 341 + ports/cortex_r4/ac6/readme_threadx.txt | 392 + .../ac6/src/tx_initialize_low_level.S | 326 + .../ac6/src/tx_thread_context_restore.S | 252 + .../ac6/src/tx_thread_context_save.S | 202 + .../ac6/src/tx_thread_fiq_context_restore.S | 260 + .../ac6/src/tx_thread_fiq_context_save.S | 209 + .../ac6/src/tx_thread_fiq_nesting_end.S | 108 + .../ac6/src/tx_thread_fiq_nesting_start.S | 96 + .../ac6/src/tx_thread_interrupt_control.S | 102 + .../ac6/src/tx_thread_interrupt_disable.S | 96 + .../ac6/src/tx_thread_interrupt_restore.S | 90 + .../ac6/src/tx_thread_irq_nesting_end.S | 105 + .../ac6/src/tx_thread_irq_nesting_start.S | 96 + ports/cortex_r4/ac6/src/tx_thread_schedule.S | 230 + .../cortex_r4/ac6/src/tx_thread_stack_build.S | 164 + .../ac6/src/tx_thread_system_return.S | 162 + .../ac6/src/tx_thread_vectored_context_save.S | 193 + ports/cortex_r4/ac6/src/tx_timer_interrupt.S | 257 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_r4/gnu/example_build/crt0.S | 90 + ports/cortex_r4/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_r4/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_r4/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_r4/gnu/inc/tx_port.h | 316 + ports/cortex_r4/gnu/readme_threadx.txt | 496 + .../gnu/src/tx_thread_context_restore.S | 256 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 247 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_r4/gnu/src/tx_thread_schedule.S | 250 + .../cortex_r4/gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 177 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_r4/gnu/src/tx_timer_interrupt.S | 279 + .../iar/example_build/azure_rtos.eww | 13 + ports/cortex_r4/iar/example_build/cstartup.s | 163 + .../iar/example_build/sample_threadx.c | 376 + .../iar/example_build/sample_threadx.dep | 253 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2140 +++ .../iar/example_build/sample_threadx.ewt | 2791 ++++ .../iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 15 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1797 +++ .../example_build/settings/sample_threadx.dnx | 130 + .../settings/sample_threadx.reggroups | 1 + .../sample_threadx_Debug_xds100board.dat | 32 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 15 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_r4/iar/example_build/tx.dep | 10488 ++++++++++++++ ports/cortex_r4/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_r4/iar/example_build/tx.ewp | 2764 ++++ ports/cortex_r4/iar/example_build/tx.ewt | 3415 +++++ .../example_build/tx_initialize_low_level.s | 277 + ports/cortex_r4/iar/inc/tx_port.h | 380 + ports/cortex_r4/iar/readme_threadx.txt | 426 + ports/cortex_r4/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 247 + .../iar/src/tx_thread_context_save.s | 198 + .../iar/src/tx_thread_interrupt_control.s | 97 + .../iar/src/tx_thread_interrupt_disable.s | 89 + .../iar/src/tx_thread_interrupt_restore.s | 84 + .../iar/src/tx_thread_irq_nesting_end.s | 99 + .../iar/src/tx_thread_irq_nesting_start.s | 96 + ports/cortex_r4/iar/src/tx_thread_schedule.s | 220 + .../cortex_r4/iar/src/tx_thread_stack_build.s | 151 + .../iar/src/tx_thread_system_return.s | 155 + .../iar/src/tx_thread_vectored_context_save.s | 184 + ports/cortex_r4/iar/src/tx_timer_interrupt.s | 256 + .../ac5/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 4 + .../ac5/example_build/sample_threadx.c | 369 + .../example_build/tx_initialize_low_level.s | 394 + ports/cortex_r5/ac5/inc/tx_port.h | 327 + ports/cortex_r5/ac5/readme_threadx.txt | 529 + .../ac5/src/tx_thread_context_restore.s | 255 + .../ac5/src/tx_thread_context_save.s | 199 + .../ac5/src/tx_thread_fiq_context_restore.s | 245 + .../ac5/src/tx_thread_fiq_context_save.s | 203 + .../ac5/src/tx_thread_fiq_nesting_end.s | 111 + .../ac5/src/tx_thread_fiq_nesting_start.s | 104 + .../ac5/src/tx_thread_interrupt_control.s | 102 + .../ac5/src/tx_thread_interrupt_disable.s | 95 + .../ac5/src/tx_thread_interrupt_restore.s | 87 + .../ac5/src/tx_thread_irq_nesting_end.s | 110 + .../ac5/src/tx_thread_irq_nesting_start.s | 104 + ports/cortex_r5/ac5/src/tx_thread_schedule.s | 233 + .../cortex_r5/ac5/src/tx_thread_stack_build.s | 164 + .../ac5/src/tx_thread_system_return.s | 158 + .../ac5/src/tx_thread_vectored_context_save.s | 200 + ports/cortex_r5/ac5/src/tx_timer_interrupt.s | 258 + .../gnu/example_build/build_threadx.bat | 238 + .../example_build/build_threadx_sample.bat | 6 + ports/cortex_r5/gnu/example_build/crt0.S | 90 + ports/cortex_r5/gnu/example_build/libc.a | Bin 0 -> 2447586 bytes ports/cortex_r5/gnu/example_build/libgcc.a | Bin 0 -> 260152 bytes ports/cortex_r5/gnu/example_build/reset.S | 76 + .../gnu/example_build/sample_threadx.c | 369 + .../gnu/example_build/sample_threadx.ld | 239 + .../example_build/tx_initialize_low_level.S | 347 + ports/cortex_r5/gnu/inc/tx_port.h | 316 + ports/cortex_r5/gnu/readme_threadx.txt | 496 + .../gnu/src/tx_thread_context_restore.S | 256 + .../gnu/src/tx_thread_context_save.S | 203 + .../gnu/src/tx_thread_fiq_context_restore.S | 247 + .../gnu/src/tx_thread_fiq_context_save.S | 204 + .../gnu/src/tx_thread_fiq_nesting_end.S | 116 + .../gnu/src/tx_thread_fiq_nesting_start.S | 108 + .../gnu/src/tx_thread_interrupt_control.S | 115 + .../gnu/src/tx_thread_interrupt_disable.S | 113 + .../gnu/src/tx_thread_interrupt_restore.S | 104 + .../gnu/src/tx_thread_irq_nesting_end.S | 115 + .../gnu/src/tx_thread_irq_nesting_start.S | 108 + ports/cortex_r5/gnu/src/tx_thread_schedule.S | 250 + .../cortex_r5/gnu/src/tx_thread_stack_build.S | 178 + .../gnu/src/tx_thread_system_return.S | 177 + .../gnu/src/tx_thread_vectored_context_save.S | 190 + ports/cortex_r5/gnu/src/tx_timer_interrupt.S | 279 + .../iar/example_build/azure_rtos.eww | 13 + ports/cortex_r5/iar/example_build/cstartup.s | 163 + .../iar/example_build/sample_threadx.c | 376 + .../iar/example_build/sample_threadx.dep | 253 + .../iar/example_build/sample_threadx.ewd | 2974 ++++ .../iar/example_build/sample_threadx.ewp | 2140 +++ .../iar/example_build/sample_threadx.ewt | 2791 ++++ .../iar/example_build/sample_threadx.icf | 49 + .../example_build/settings/azure_rtos.wsdt | 535 + .../settings/sample_threadx.Debug.cspy.bat | 40 + .../settings/sample_threadx.Debug.cspy.ps1 | 31 + .../settings/sample_threadx.Debug.driver.xcl | 15 + .../settings/sample_threadx.Debug.general.xcl | 11 + .../settings/sample_threadx.crun | 13 + .../settings/sample_threadx.dbgdt | 1797 +++ .../example_build/settings/sample_threadx.dnx | 130 + .../settings/sample_threadx.reggroups | 1 + .../sample_threadx_Debug_xds100board.dat | 32 + .../example_build/settings/tx.Debug.cspy.bat | 40 + .../example_build/settings/tx.Debug.cspy.ps1 | 31 + .../settings/tx.Debug.driver.xcl | 15 + .../settings/tx.Debug.general.xcl | 11 + .../iar/example_build/settings/tx.crun | 13 + .../iar/example_build/settings/tx.dbgdt | 4 + .../iar/example_build/settings/tx.dnx | 58 + ports/cortex_r5/iar/example_build/tx.dep | 10476 ++++++++++++++ ports/cortex_r5/iar/example_build/tx.ewd | 2974 ++++ ports/cortex_r5/iar/example_build/tx.ewp | 2764 ++++ ports/cortex_r5/iar/example_build/tx.ewt | 3415 +++++ .../example_build/tx_initialize_low_level.s | 277 + ports/cortex_r5/iar/inc/tx_port.h | 384 + ports/cortex_r5/iar/readme_threadx.txt | 426 + ports/cortex_r5/iar/src/tx_iar.c | 804 ++ .../iar/src/tx_thread_context_restore.s | 247 + .../iar/src/tx_thread_context_save.s | 198 + .../iar/src/tx_thread_interrupt_control.s | 97 + .../iar/src/tx_thread_interrupt_disable.s | 89 + .../iar/src/tx_thread_interrupt_restore.s | 84 + .../iar/src/tx_thread_irq_nesting_end.s | 99 + .../iar/src/tx_thread_irq_nesting_start.s | 96 + ports/cortex_r5/iar/src/tx_thread_schedule.s | 220 + .../cortex_r5/iar/src/tx_thread_stack_build.s | 151 + .../iar/src/tx_thread_system_return.s | 155 + .../iar/src/tx_thread_vectored_context_save.s | 184 + ports/cortex_r5/iar/src/tx_timer_interrupt.s | 256 + ports/linux/gnu/example_build/file_list.mk | 201 + .../linux/gnu/example_build/sample_threadx.c | 380 + ports/linux/gnu/inc/tx_port.h | 575 + ports/linux/gnu/readme_threadx.txt | 155 + ports/linux/gnu/src/tx_initialize_low_level.c | 443 + .../linux/gnu/src/tx_thread_context_restore.c | 163 + ports/linux/gnu/src/tx_thread_context_save.c | 107 + .../gnu/src/tx_thread_interrupt_control.c | 183 + ports/linux/gnu/src/tx_thread_schedule.c | 264 + ports/linux/gnu/src/tx_thread_stack_build.c | 153 + ports/linux/gnu/src/tx_thread_system_return.c | 207 + ports/linux/gnu/src/tx_timer_interrupt.c | 153 + .../vs_2019/example_build/azure_rtos.sln | 46 + .../sample_threadx/sample_threadx.c | 381 + .../sample_threadx/sample_threadx.vcxproj | 139 + .../sample_threadx.vcxproj.filters | 29 + .../win32/vs_2019/example_build/tx/tx.vcxproj | 339 + .../example_build/tx/tx.vcxproj.filters | 633 + ports/win32/vs_2019/inc/tx_port.h | 453 + ports/win32/vs_2019/readme_threadx.txt | 155 + .../vs_2019/src/tx_initialize_low_level.c | 307 + .../vs_2019/src/tx_thread_context_restore.c | 132 + .../vs_2019/src/tx_thread_context_save.c | 113 + .../vs_2019/src/tx_thread_interrupt_control.c | 213 + ports/win32/vs_2019/src/tx_thread_schedule.c | 291 + .../win32/vs_2019/src/tx_thread_stack_build.c | 157 + .../vs_2019/src/tx_thread_system_return.c | 212 + ports/win32/vs_2019/src/tx_timer_interrupt.c | 153 + 1285 files changed, 550383 insertions(+), 50 deletions(-) create mode 100644 ports/arc_em/metaware/example_build/.metadata/.lock create mode 100644 ports/arc_em/metaware/example_build/.metadata/.log create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1453229896288.pdom create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592431055026.pdom create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1453229702368.pdom create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 ports/arc_em/metaware/example_build/.metadata/version.ini create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/.cproject create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/.project create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s create mode 100644 ports/arc_em/metaware/example_build/sample_threadx/vectors.s create mode 100644 ports/arc_em/metaware/example_build/tx/.cproject create mode 100644 ports/arc_em/metaware/example_build/tx/.project create mode 100644 ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml create mode 100644 ports/arc_em/metaware/inc/tx_port.h create mode 100644 ports/arc_em/metaware/readme_threadx.txt create mode 100644 ports/arc_em/metaware/src/tx_initialize_low_level.s create mode 100644 ports/arc_em/metaware/src/tx_thread_context_restore.s create mode 100644 ports/arc_em/metaware/src/tx_thread_context_save.s create mode 100644 ports/arc_em/metaware/src/tx_thread_interrupt_control.s create mode 100644 ports/arc_em/metaware/src/tx_thread_schedule.s create mode 100644 ports/arc_em/metaware/src/tx_thread_stack_build.s create mode 100644 ports/arc_em/metaware/src/tx_thread_system_return.s create mode 100644 ports/arc_em/metaware/src/tx_timer_interrupt.s create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.lock create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.log create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1443481736829.pdom create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592441271034.pdom create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1443481396650.pdom create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/16.tree create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 ports/arc_hs/metaware/example_build/.metadata/version.ini create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/.bp.args create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/.cproject create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/.project create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s create mode 100644 ports/arc_hs/metaware/example_build/sample_threadx/vectors.s create mode 100644 ports/arc_hs/metaware/example_build/tx/.cproject create mode 100644 ports/arc_hs/metaware/example_build/tx/.project create mode 100644 ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml create mode 100644 ports/arc_hs/metaware/inc/tx_port.h create mode 100644 ports/arc_hs/metaware/readme_threadx.txt create mode 100644 ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_context_fast_save.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_context_restore.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_context_save.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_interrupt_control.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_schedule.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_stack_build.s create mode 100644 ports/arc_hs/metaware/src/tx_thread_system_return.s create mode 100644 ports/arc_hs/metaware/src/tx_timer_interrupt.s create mode 100644 ports/arm9/ac5/example_build/build_threadx.bat create mode 100644 ports/arm9/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/arm9/ac5/example_build/sample_threadx.c create mode 100644 ports/arm9/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/arm9/ac5/inc/tx_port.h create mode 100644 ports/arm9/ac5/readme_threadx.txt create mode 100644 ports/arm9/ac5/src/tx_thread_context_restore.s create mode 100644 ports/arm9/ac5/src/tx_thread_context_save.s create mode 100644 ports/arm9/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/arm9/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/arm9/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/arm9/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/arm9/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/arm9/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/arm9/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/arm9/ac5/src/tx_thread_schedule.s create mode 100644 ports/arm9/ac5/src/tx_thread_stack_build.s create mode 100644 ports/arm9/ac5/src/tx_thread_system_return.s create mode 100644 ports/arm9/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/arm9/ac5/src/tx_timer_interrupt.s create mode 100644 ports/arm9/gnu/example_build/build_threadx.bat create mode 100644 ports/arm9/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/arm9/gnu/example_build/crt0.S create mode 100644 ports/arm9/gnu/example_build/libgcc.a create mode 100644 ports/arm9/gnu/example_build/reset.S create mode 100644 ports/arm9/gnu/example_build/sample_threadx.c create mode 100644 ports/arm9/gnu/example_build/sample_threadx.ld create mode 100644 ports/arm9/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/arm9/gnu/inc/tx_port.h create mode 100644 ports/arm9/gnu/readme_threadx.txt create mode 100644 ports/arm9/gnu/src/tx_thread_context_restore.S create mode 100644 ports/arm9/gnu/src/tx_thread_context_save.S create mode 100644 ports/arm9/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/arm9/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/arm9/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/arm9/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/arm9/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/arm9/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/arm9/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/arm9/gnu/src/tx_thread_schedule.S create mode 100644 ports/arm9/gnu/src/tx_thread_stack_build.S create mode 100644 ports/arm9/gnu/src/tx_thread_system_return.S create mode 100644 ports/arm9/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/arm9/gnu/src/tx_timer_interrupt.S create mode 100644 ports/arm9/iar/example_build/azure_rtos.eww create mode 100644 ports/arm9/iar/example_build/cstartup.s create mode 100644 ports/arm9/iar/example_build/sample_threadx.c create mode 100644 ports/arm9/iar/example_build/sample_threadx.dep create mode 100644 ports/arm9/iar/example_build/sample_threadx.ewd create mode 100644 ports/arm9/iar/example_build/sample_threadx.ewp create mode 100644 ports/arm9/iar/example_build/sample_threadx.ewt create mode 100644 ports/arm9/iar/example_build/sample_threadx.icf create mode 100644 ports/arm9/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/arm9/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/arm9/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/arm9/iar/example_build/settings/tx.crun create mode 100644 ports/arm9/iar/example_build/settings/tx.dbgdt create mode 100644 ports/arm9/iar/example_build/settings/tx.dnx create mode 100644 ports/arm9/iar/example_build/tx.dep create mode 100644 ports/arm9/iar/example_build/tx.ewd create mode 100644 ports/arm9/iar/example_build/tx.ewp create mode 100644 ports/arm9/iar/example_build/tx.ewt create mode 100644 ports/arm9/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/arm9/iar/inc/tx_port.h create mode 100644 ports/arm9/iar/readme_threadx.txt create mode 100644 ports/arm9/iar/src/tx_iar.c create mode 100644 ports/arm9/iar/src/tx_thread_context_restore.s create mode 100644 ports/arm9/iar/src/tx_thread_context_save.s create mode 100644 ports/arm9/iar/src/tx_thread_fiq_context_restore.s create mode 100644 ports/arm9/iar/src/tx_thread_fiq_context_save.s create mode 100644 ports/arm9/iar/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/arm9/iar/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/arm9/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/arm9/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/arm9/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/arm9/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/arm9/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/arm9/iar/src/tx_thread_schedule.s create mode 100644 ports/arm9/iar/src/tx_thread_stack_build.s create mode 100644 ports/arm9/iar/src/tx_thread_system_return.s create mode 100644 ports/arm9/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/arm9/iar/src/tx_timer_interrupt.s create mode 100644 ports/c667x/ccs/example_build/include/C66XX.h create mode 100644 ports/c667x/ccs/example_build/include/C66XX_DEF.hxx create mode 100644 ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx create mode 100644 ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx create mode 100644 ports/c667x/ccs/example_build/include/TA66XX_DSP.h create mode 100644 ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h create mode 100644 ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx create mode 100644 ports/c667x/ccs/example_build/include/TA66XX_OSAL.h create mode 100644 ports/c667x/ccs/example_build/include/TASDK_ERR.h create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt create mode 100644 ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt create mode 100644 ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm create mode 100644 ports/c667x/ccs/example_build/tx/.ccsproject create mode 100644 ports/c667x/ccs/example_build/tx/.cproject create mode 100644 ports/c667x/ccs/example_build/tx/.project create mode 100644 ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs create mode 100644 ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs create mode 100644 ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt create mode 100644 ports/c667x/ccs/example_build/tx/Release/objects.mk create mode 100644 ports/c667x/ccs/example_build/tx/Release/sources.mk create mode 100644 ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk create mode 100644 ports/c667x/ccs/example_build/tx/Release/subdir_vars.mk create mode 100644 ports/c667x/ccs/inc/tx_port.h create mode 100644 ports/c667x/ccs/readme_threadx.txt create mode 100644 ports/c667x/ccs/src/tx_thread_context_restore.asm create mode 100644 ports/c667x/ccs/src/tx_thread_context_save.asm create mode 100644 ports/c667x/ccs/src/tx_thread_interrupt_control.asm create mode 100644 ports/c667x/ccs/src/tx_thread_schedule.asm create mode 100644 ports/c667x/ccs/src/tx_thread_stack_build.asm create mode 100644 ports/c667x/ccs/src/tx_thread_system_return.asm create mode 100644 ports/c667x/ccs/src/tx_timer_interrupt.asm create mode 100644 ports/cortex_a15/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_a15/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a15/gnu/example_build/crt0.S create mode 100644 ports/cortex_a15/gnu/example_build/libc.a create mode 100644 ports/cortex_a15/gnu/example_build/libgcc.a create mode 100644 ports/cortex_a15/gnu/example_build/reset.S create mode 100644 ports/cortex_a15/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_a15/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_a15/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_a15/gnu/inc/tx_port.h create mode 100644 ports/cortex_a15/gnu/readme_threadx.txt create mode 100644 ports/cortex_a15/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_a15/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_a5/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_a5/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a5/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a5/ac5/inc/tx_port.h create mode 100644 ports/cortex_a5/ac5/readme_threadx.txt create mode 100644 ports/cortex_a5/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a5/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a5/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_a5/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a5/gnu/example_build/crt0.S create mode 100644 ports/cortex_a5/gnu/example_build/libc.a create mode 100644 ports/cortex_a5/gnu/example_build/libgcc.a create mode 100644 ports/cortex_a5/gnu/example_build/reset.S create mode 100644 ports/cortex_a5/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_a5/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_a5/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_a5/gnu/inc/tx_port.h create mode 100644 ports/cortex_a5/gnu/readme_threadx.txt create mode 100644 ports/cortex_a5/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_a5/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_a5/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_a5/iar/example_build/cstartup.s create mode 100644 ports/cortex_a5/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_a5/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_a5/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_a5/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_a5/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_a5/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_a5/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_a5/iar/example_build/tx.dep create mode 100644 ports/cortex_a5/iar/example_build/tx.ewd create mode 100644 ports/cortex_a5/iar/example_build/tx.ewp create mode 100644 ports/cortex_a5/iar/example_build/tx.ewt create mode 100644 ports/cortex_a5/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a5/iar/inc/tx_port.h create mode 100644 ports/cortex_a5/iar/readme_threadx.txt create mode 100644 ports/cortex_a5/iar/src/tx_iar.c create mode 100644 ports/cortex_a5/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a5/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/.project create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt create mode 100644 ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S create mode 100644 ports/cortex_a5x/ac6/example_build/tx/.cproject create mode 100644 ports/cortex_a5x/ac6/example_build/tx/.project create mode 100644 ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml create mode 100644 ports/cortex_a5x/ac6/inc/tx_port.h create mode 100644 ports/cortex_a5x/ac6/readme_threadx.txt create mode 100644 ports/cortex_a5x/ac6/src/tx_initialize_low_level.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_context_restore.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_context_save.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_schedule.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_stack_build.S create mode 100644 ports/cortex_a5x/ac6/src/tx_thread_system_return.S create mode 100644 ports/cortex_a5x/ac6/src/tx_timer_interrupt.S create mode 100644 ports/cortex_a7/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_a7/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a7/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a7/ac5/inc/tx_port.h create mode 100644 ports/cortex_a7/ac5/readme_threadx.txt create mode 100644 ports/cortex_a7/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a7/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a7/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_a7/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a7/gnu/example_build/crt0.S create mode 100644 ports/cortex_a7/gnu/example_build/libc.a create mode 100644 ports/cortex_a7/gnu/example_build/libgcc.a create mode 100644 ports/cortex_a7/gnu/example_build/reset.S create mode 100644 ports/cortex_a7/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_a7/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_a7/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_a7/gnu/inc/tx_port.h create mode 100644 ports/cortex_a7/gnu/readme_threadx.txt create mode 100644 ports/cortex_a7/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_a7/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_a7/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_a7/iar/example_build/cstartup.s create mode 100644 ports/cortex_a7/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_a7/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_a7/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_a7/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_a7/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_a7/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_a7/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_a7/iar/example_build/tx.dep create mode 100644 ports/cortex_a7/iar/example_build/tx.ewd create mode 100644 ports/cortex_a7/iar/example_build/tx.ewp create mode 100644 ports/cortex_a7/iar/example_build/tx.ewt create mode 100644 ports/cortex_a7/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a7/iar/inc/tx_port.h create mode 100644 ports/cortex_a7/iar/readme_threadx.txt create mode 100644 ports/cortex_a7/iar/src/tx_iar.c create mode 100644 ports/cortex_a7/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a7/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a8/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_a8/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a8/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a8/ac5/inc/tx_port.h create mode 100644 ports/cortex_a8/ac5/readme_threadx.txt create mode 100644 ports/cortex_a8/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a8/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a8/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_a8/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a8/gnu/example_build/crt0.S create mode 100644 ports/cortex_a8/gnu/example_build/libc.a create mode 100644 ports/cortex_a8/gnu/example_build/libgcc.a create mode 100644 ports/cortex_a8/gnu/example_build/reset.S create mode 100644 ports/cortex_a8/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_a8/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_a8/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_a8/gnu/inc/tx_port.h create mode 100644 ports/cortex_a8/gnu/readme_threadx.txt create mode 100644 ports/cortex_a8/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_a8/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_a8/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_a8/iar/example_build/cstartup.s create mode 100644 ports/cortex_a8/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_a8/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_a8/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_a8/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_a8/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_a8/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_a8/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_a8/iar/example_build/tx.dep create mode 100644 ports/cortex_a8/iar/example_build/tx.ewd create mode 100644 ports/cortex_a8/iar/example_build/tx.ewp create mode 100644 ports/cortex_a8/iar/example_build/tx.ewt create mode 100644 ports/cortex_a8/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a8/iar/inc/tx_port.h create mode 100644 ports/cortex_a8/iar/readme_threadx.txt create mode 100644 ports/cortex_a8/iar/src/tx_iar.c create mode 100644 ports/cortex_a8/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a8/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a9/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_a9/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a9/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a9/ac5/inc/tx_port.h create mode 100644 ports/cortex_a9/ac5/readme_threadx.txt create mode 100644 ports/cortex_a9/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a9/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_a9/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_a9/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_a9/gnu/example_build/crt0.S create mode 100644 ports/cortex_a9/gnu/example_build/libc.a create mode 100644 ports/cortex_a9/gnu/example_build/libgcc.a create mode 100644 ports/cortex_a9/gnu/example_build/reset.S create mode 100644 ports/cortex_a9/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_a9/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_a9/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_a9/gnu/inc/tx_port.h create mode 100644 ports/cortex_a9/gnu/readme_threadx.txt create mode 100644 ports/cortex_a9/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_a9/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_a9/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_a9/iar/example_build/cstartup.s create mode 100644 ports/cortex_a9/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_a9/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_a9/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_a9/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_a9/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_a9/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_a9/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_a9/iar/example_build/tx.dep create mode 100644 ports/cortex_a9/iar/example_build/tx.ewd create mode 100644 ports/cortex_a9/iar/example_build/tx.ewp create mode 100644 ports/cortex_a9/iar/example_build/tx.ewt create mode 100644 ports/cortex_a9/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_a9/iar/inc/tx_port.h create mode 100644 ports/cortex_a9/iar/readme_threadx.txt create mode 100644 ports/cortex_a9/iar/src/tx_iar.c create mode 100644 ports/cortex_a9/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_a9/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m0/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_m0/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m0/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m0/ac5/inc/tx_port.h create mode 100644 ports/cortex_m0/ac5/readme_threadx.txt create mode 100644 ports/cortex_m0/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m0/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_m0/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m0/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_m0/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m0/gnu/example_build/cortexm0_crt0.s create mode 100644 ports/cortex_m0/gnu/example_build/libgcc.a create mode 100644 ports/cortex_m0/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_m0/gnu/example_build/sample_threadx.ld rename ports/cortex_m0/gnu/{src/tx_initialize_low_level_sample.S => example_build/tx_initialize_low_level.S} (100%) mode change 100755 => 100644 rename ports/cortex_m0/gnu/{src/tx_vector_table_sample.S => example_build/tx_vectors.s} (100%) create mode 100644 ports/cortex_m0/gnu/readme_threadx.txt create mode 100644 ports/cortex_m0/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_m0/iar/example_build/cstartup_M.s create mode 100644 ports/cortex_m0/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_m0/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_m0/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_m0/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_m0/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_m0/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_m0/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_m0/iar/example_build/tx.dep create mode 100644 ports/cortex_m0/iar/example_build/tx.ewd create mode 100644 ports/cortex_m0/iar/example_build/tx.ewp create mode 100644 ports/cortex_m0/iar/example_build/tx.ewt create mode 100644 ports/cortex_m0/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m0/iar/inc/tx_port.h create mode 100644 ports/cortex_m0/iar/readme_threadx.txt create mode 100644 ports/cortex_m0/iar/src/tx_iar.c create mode 100644 ports/cortex_m0/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m0/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_m0/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m3/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_m3/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m3/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m3/ac5/inc/tx_port.h create mode 100644 ports/cortex_m3/ac5/readme_threadx.txt create mode 100644 ports/cortex_m3/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m3/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_m3/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m3/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_m3/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m3/gnu/example_build/cortexm3_crt0.s create mode 100644 ports/cortex_m3/gnu/example_build/libc.a create mode 100644 ports/cortex_m3/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_m3/gnu/example_build/sample_threadx.ld rename ports/cortex_m3/gnu/{src/tx_initialize_low_level_sample.S => example_build/tx_initialize_low_level.S} (95%) rename ports/cortex_m3/gnu/{src/tx_vector_table_sample.S => example_build/tx_simulator_startup.s} (100%) create mode 100644 ports/cortex_m3/gnu/readme_threadx.txt create mode 100644 ports/cortex_m3/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_m3/iar/example_build/cstartup_M.s create mode 100644 ports/cortex_m3/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_m3/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_m3/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_m3/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_m3/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_m3/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_m3/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_m3/iar/example_build/tx.dep create mode 100644 ports/cortex_m3/iar/example_build/tx.ewd create mode 100644 ports/cortex_m3/iar/example_build/tx.ewp create mode 100644 ports/cortex_m3/iar/example_build/tx.ewt create mode 100644 ports/cortex_m3/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m3/iar/inc/tx_port.h create mode 100644 ports/cortex_m3/iar/readme_threadx.txt create mode 100644 ports/cortex_m3/iar/src/tx_iar.c create mode 100644 ports/cortex_m3/iar/src/tx_misra.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m3/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_m3/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt create mode 100644 ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj create mode 100644 ports/cortex_m3/keil/example_build/ThreadX_Library.plg create mode 100644 ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt create mode 100644 ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj create mode 100644 ports/cortex_m3/keil/example_build/sample_threadx.c create mode 100644 ports/cortex_m3/keil/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m3/keil/inc/tx_port.h create mode 100644 ports/cortex_m3/keil/readme_threadx.txt create mode 100644 ports/cortex_m3/keil/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_context_save.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_schedule.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m3/keil/src/tx_thread_system_return.s create mode 100644 ports/cortex_m3/keil/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m4/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_m4/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m4/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m4/ac5/inc/tx_port.h create mode 100644 ports/cortex_m4/ac5/readme_threadx.txt create mode 100644 ports/cortex_m4/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m4/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_m4/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m4/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_m4/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m4/gnu/example_build/cortexm4_crt0.s create mode 100644 ports/cortex_m4/gnu/example_build/libc.a create mode 100644 ports/cortex_m4/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_m4/gnu/example_build/sample_threadx.ld rename ports/cortex_m4/gnu/{src/tx_initialize_low_level_sample.S => example_build/tx_initialize_low_level.S} (95%) rename ports/cortex_m4/gnu/{src/tx_vector_table_sample.S => example_build/tx_simulator_startup.s} (100%) create mode 100644 ports/cortex_m4/gnu/readme_threadx.txt create mode 100644 ports/cortex_m4/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_m4/iar/example_build/cstartup_M.s create mode 100644 ports/cortex_m4/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_m4/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_m4/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_m4/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_m4/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_m4/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_m4/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_m4/iar/example_build/tx.dep create mode 100644 ports/cortex_m4/iar/example_build/tx.ewd create mode 100644 ports/cortex_m4/iar/example_build/tx.ewp create mode 100644 ports/cortex_m4/iar/example_build/tx.ewt create mode 100644 ports/cortex_m4/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m4/iar/inc/tx_port.h create mode 100644 ports/cortex_m4/iar/readme_threadx.txt create mode 100644 ports/cortex_m4/iar/src/tx_iar.c create mode 100644 ports/cortex_m4/iar/src/tx_misra.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m4/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_m4/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt create mode 100644 ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj create mode 100644 ports/cortex_m4/keil/example_build/ThreadX_Library.plg create mode 100644 ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt create mode 100644 ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj create mode 100644 ports/cortex_m4/keil/example_build/demo_threadx.c create mode 100644 ports/cortex_m4/keil/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m4/keil/inc/tx_port.h create mode 100644 ports/cortex_m4/keil/readme_threadx.txt create mode 100644 ports/cortex_m4/keil/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_context_save.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_schedule.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m4/keil/src/tx_thread_system_return.s create mode 100644 ports/cortex_m4/keil/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m7/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_m7/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m7/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m7/ac5/inc/tx_port.h create mode 100644 ports/cortex_m7/ac5/readme_threadx.txt create mode 100644 ports/cortex_m7/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m7/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_m7/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_m7/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_m7/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_m7/gnu/example_build/cortexm7_crt0.s create mode 100644 ports/cortex_m7/gnu/example_build/libc.a create mode 100644 ports/cortex_m7/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_m7/gnu/example_build/sample_threadx.ld rename ports/cortex_m7/gnu/{src/tx_initialize_low_level_sample.S => example_build/tx_initialize_low_level.S} (95%) mode change 100755 => 100644 rename ports/cortex_m7/gnu/{src/tx_vector_table_sample.S => example_build/tx_simulator_startup.s} (100%) create mode 100644 ports/cortex_m7/gnu/readme_threadx.txt create mode 100644 ports/cortex_m7/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_m7/iar/example_build/cstartup_M.s create mode 100644 ports/cortex_m7/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_m7/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_m7/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_m7/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_m7/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_m7/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_m7/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_m7/iar/example_build/tx.dep create mode 100644 ports/cortex_m7/iar/example_build/tx.ewd create mode 100644 ports/cortex_m7/iar/example_build/tx.ewp create mode 100644 ports/cortex_m7/iar/example_build/tx.ewt create mode 100644 ports/cortex_m7/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_m7/iar/inc/tx_port.h create mode 100644 ports/cortex_m7/iar/readme_threadx.txt create mode 100644 ports/cortex_m7/iar/src/tx_iar.c create mode 100644 ports/cortex_m7/iar/src/tx_misra.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_m7/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_m7/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_r4/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_r4/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_r4/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_r4/ac5/inc/tx_port.h create mode 100644 ports/cortex_r4/ac5/readme_threadx.txt create mode 100644 ports/cortex_r4/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_r4/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/.cproject create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/.project create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/gic.c create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/gic.h create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/startup.S create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/timer.c create mode 100644 ports/cortex_r4/ac6/example_build/sample_threadx/timer.h create mode 100644 ports/cortex_r4/ac6/example_build/tx/.cproject create mode 100644 ports/cortex_r4/ac6/example_build/tx/.project create mode 100644 ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml create mode 100644 ports/cortex_r4/ac6/inc/tx_port.h create mode 100644 ports/cortex_r4/ac6/readme_threadx.txt create mode 100644 ports/cortex_r4/ac6/src/tx_initialize_low_level.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_context_restore.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_context_save.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_schedule.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_stack_build.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_system_return.S create mode 100644 ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_r4/ac6/src/tx_timer_interrupt.S create mode 100644 ports/cortex_r4/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_r4/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_r4/gnu/example_build/crt0.S create mode 100644 ports/cortex_r4/gnu/example_build/libc.a create mode 100644 ports/cortex_r4/gnu/example_build/libgcc.a create mode 100644 ports/cortex_r4/gnu/example_build/reset.S create mode 100644 ports/cortex_r4/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_r4/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_r4/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_r4/gnu/inc/tx_port.h create mode 100644 ports/cortex_r4/gnu/readme_threadx.txt create mode 100644 ports/cortex_r4/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_r4/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_r4/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_r4/iar/example_build/cstartup.s create mode 100644 ports/cortex_r4/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_r4/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_r4/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_r4/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_r4/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_r4/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups create mode 100644 ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_r4/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_r4/iar/example_build/tx.dep create mode 100644 ports/cortex_r4/iar/example_build/tx.ewd create mode 100644 ports/cortex_r4/iar/example_build/tx.ewp create mode 100644 ports/cortex_r4/iar/example_build/tx.ewt create mode 100644 ports/cortex_r4/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_r4/iar/inc/tx_port.h create mode 100644 ports/cortex_r4/iar/readme_threadx.txt create mode 100644 ports/cortex_r4/iar/src/tx_iar.c create mode 100644 ports/cortex_r4/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_r4/iar/src/tx_timer_interrupt.s create mode 100644 ports/cortex_r5/ac5/example_build/build_threadx.bat create mode 100644 ports/cortex_r5/ac5/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_r5/ac5/example_build/sample_threadx.c create mode 100644 ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_r5/ac5/inc/tx_port.h create mode 100644 ports/cortex_r5/ac5/readme_threadx.txt create mode 100644 ports/cortex_r5/ac5/src/tx_thread_context_restore.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_context_save.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_schedule.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_stack_build.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_system_return.s create mode 100644 ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_r5/ac5/src/tx_timer_interrupt.s create mode 100644 ports/cortex_r5/gnu/example_build/build_threadx.bat create mode 100644 ports/cortex_r5/gnu/example_build/build_threadx_sample.bat create mode 100644 ports/cortex_r5/gnu/example_build/crt0.S create mode 100644 ports/cortex_r5/gnu/example_build/libc.a create mode 100644 ports/cortex_r5/gnu/example_build/libgcc.a create mode 100644 ports/cortex_r5/gnu/example_build/reset.S create mode 100644 ports/cortex_r5/gnu/example_build/sample_threadx.c create mode 100644 ports/cortex_r5/gnu/example_build/sample_threadx.ld create mode 100644 ports/cortex_r5/gnu/example_build/tx_initialize_low_level.S create mode 100644 ports/cortex_r5/gnu/inc/tx_port.h create mode 100644 ports/cortex_r5/gnu/readme_threadx.txt create mode 100644 ports/cortex_r5/gnu/src/tx_thread_context_restore.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_context_save.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_schedule.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_stack_build.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_system_return.S create mode 100644 ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S create mode 100644 ports/cortex_r5/gnu/src/tx_timer_interrupt.S create mode 100644 ports/cortex_r5/iar/example_build/azure_rtos.eww create mode 100644 ports/cortex_r5/iar/example_build/cstartup.s create mode 100644 ports/cortex_r5/iar/example_build/sample_threadx.c create mode 100644 ports/cortex_r5/iar/example_build/sample_threadx.dep create mode 100644 ports/cortex_r5/iar/example_build/sample_threadx.ewd create mode 100644 ports/cortex_r5/iar/example_build/sample_threadx.ewp create mode 100644 ports/cortex_r5/iar/example_build/sample_threadx.ewt create mode 100644 ports/cortex_r5/iar/example_build/sample_threadx.icf create mode 100644 ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.crun create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups create mode 100644 ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.crun create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.dbgdt create mode 100644 ports/cortex_r5/iar/example_build/settings/tx.dnx create mode 100644 ports/cortex_r5/iar/example_build/tx.dep create mode 100644 ports/cortex_r5/iar/example_build/tx.ewd create mode 100644 ports/cortex_r5/iar/example_build/tx.ewp create mode 100644 ports/cortex_r5/iar/example_build/tx.ewt create mode 100644 ports/cortex_r5/iar/example_build/tx_initialize_low_level.s create mode 100644 ports/cortex_r5/iar/inc/tx_port.h create mode 100644 ports/cortex_r5/iar/readme_threadx.txt create mode 100644 ports/cortex_r5/iar/src/tx_iar.c create mode 100644 ports/cortex_r5/iar/src/tx_thread_context_restore.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_context_save.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_interrupt_control.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_schedule.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_stack_build.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_system_return.s create mode 100644 ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s create mode 100644 ports/cortex_r5/iar/src/tx_timer_interrupt.s create mode 100644 ports/linux/gnu/example_build/file_list.mk create mode 100644 ports/linux/gnu/example_build/sample_threadx.c create mode 100644 ports/linux/gnu/inc/tx_port.h create mode 100644 ports/linux/gnu/readme_threadx.txt create mode 100644 ports/linux/gnu/src/tx_initialize_low_level.c create mode 100644 ports/linux/gnu/src/tx_thread_context_restore.c create mode 100644 ports/linux/gnu/src/tx_thread_context_save.c create mode 100644 ports/linux/gnu/src/tx_thread_interrupt_control.c create mode 100644 ports/linux/gnu/src/tx_thread_schedule.c create mode 100644 ports/linux/gnu/src/tx_thread_stack_build.c create mode 100644 ports/linux/gnu/src/tx_thread_system_return.c create mode 100644 ports/linux/gnu/src/tx_timer_interrupt.c create mode 100644 ports/win32/vs_2019/example_build/azure_rtos.sln create mode 100644 ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c create mode 100644 ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj create mode 100644 ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters create mode 100644 ports/win32/vs_2019/example_build/tx/tx.vcxproj create mode 100644 ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters create mode 100644 ports/win32/vs_2019/inc/tx_port.h create mode 100644 ports/win32/vs_2019/readme_threadx.txt create mode 100644 ports/win32/vs_2019/src/tx_initialize_low_level.c create mode 100644 ports/win32/vs_2019/src/tx_thread_context_restore.c create mode 100644 ports/win32/vs_2019/src/tx_thread_context_save.c create mode 100644 ports/win32/vs_2019/src/tx_thread_interrupt_control.c create mode 100644 ports/win32/vs_2019/src/tx_thread_schedule.c create mode 100644 ports/win32/vs_2019/src/tx_thread_stack_build.c create mode 100644 ports/win32/vs_2019/src/tx_thread_system_return.c create mode 100644 ports/win32/vs_2019/src/tx_timer_interrupt.c diff --git a/common/inc/tx_api.h b/common/inc/tx_api.h index 4ca000be..75b443d2 100644 --- a/common/inc/tx_api.h +++ b/common/inc/tx_api.h @@ -26,7 +26,7 @@ /* APPLICATION INTERFACE DEFINITION RELEASE */ /* */ /* tx_api.h PORTABLE C */ -/* 6.0 */ +/* 6.0.1 */ /* AUTHOR */ /* */ /* William E. Lamie, Microsoft Corporation */ @@ -44,6 +44,9 @@ /* DATE NAME DESCRIPTION */ /* */ /* 05-19-2020 William E. Lamie Initial Version 6.0 */ +/* 06-30-2020 William E. Lamie Modified comment(s), and */ +/* updated product constants, */ +/* resulting in version 6.0.1 */ /* */ /**************************************************************************/ @@ -73,10 +76,13 @@ extern "C" { /* Define the major/minor version information that can be used by the application and the ThreadX source as well. */ -#define EL_PRODUCT_THREADX +#define AZURE_RTOS_THREADX #define THREADX_MAJOR_VERSION 6 #define THREADX_MINOR_VERSION 0 +#define THREADX_PATCH_VERSION 1 +/* Define the following symbol for backward compatibility */ +#define EL_PRODUCT_THREADX /* API input parameters and general constants. */ diff --git a/ports/arc_em/metaware/example_build/.metadata/.lock b/ports/arc_em/metaware/example_build/.metadata/.lock new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_em/metaware/example_build/.metadata/.log b/ports/arc_em/metaware/example_build/.metadata/.log new file mode 100644 index 00000000..9119491b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.log @@ -0,0 +1,937 @@ +!SESSION 2016-01-19 10:53:52.024 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.cdt.core 1 0 2016-01-19 10:55:02.458 +!MESSAGE Indexed 'tx' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.cdt.core 1 0 2016-01-19 10:58:16.298 +!MESSAGE Indexed 'sample_threadx' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2016-01-19 10:59:20.668 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt". +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.access$0(OpenWorkspaceAction.java:274) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$WorkspaceMRUAction.run(OpenWorkspaceAction.java:103) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more + +!ENTRY org.eclipse.e4.ui.workbench 4 0 2016-01-19 10:59:20.678 +!MESSAGE Exception occurred while unrendering: org.eclipse.e4.ui.model.application.ui.basic.impl.TrimmedWindowImpl@4d7f76 (elementId: IDEWindow, tags: [topLevel], contributorURI: platform:/plugin/org.eclipse.ui.workbench) (widget: null, renderer: null, toBeRendered: true, onTop: false, visible: true, containerData: null, accessibilityPhrase: null) (label: %trimmedwindow.label.eclipseSDK, iconURI: null, tooltip: null, context: null, variables: [], x: 250, y: 250, width: 1024, height: 768) +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.access$0(OpenWorkspaceAction.java:274) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$WorkspaceMRUAction.run(OpenWorkspaceAction.java:103) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more +!SESSION 2020-06-17 14:55:11.959 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 14:55:28.047 +!MESSAGE Could not run processor +!STACK 0 +org.eclipse.e4.core.di.InjectionException: java.lang.NullPointerException + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:259) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:107) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessor(ModelAssembler.java:335) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessors(ModelAssembler.java:297) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.processModel(ModelAssembler.java:98) + at org.eclipse.e4.ui.internal.workbench.ResourceHandler.loadMostRecentModel(ResourceHandler.java:197) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.loadApplicationModel(E4Application.java:377) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:252) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:632) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.NullPointerException + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectLaunchBar(LaunchBarInjector.java:109) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectIntoAll(LaunchBarInjector.java:84) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.execute(LaunchBarInjector.java:46) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 26 more + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 14:55:34.531 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 14:55:34.556 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:55:34.558 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:55:34.558 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 14:55:34.575 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:55:34.576 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 14:55:34.888 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. +!SESSION 2020-06-17 14:57:04.375 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.core.resources 4 567 2020-06-17 14:57:08.841 +!MESSAGE Workspace restored, but some problems occurred. +!SUBENTRY 1 org.eclipse.core.resources 4 567 2020-06-17 14:57:08.841 +!MESSAGE Could not read metadata for 'demo_threadx'. +!STACK 1 +org.eclipse.core.internal.resources.ResourceException: The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + at org.eclipse.core.internal.localstore.FileSystemResourceManager.read(FileSystemResourceManager.java:907) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:904) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:884) + at org.eclipse.core.internal.resources.SaveManager.restore(SaveManager.java:735) + at org.eclipse.core.internal.resources.SaveManager.startup(SaveManager.java:1587) + at org.eclipse.core.internal.resources.Workspace.startup(Workspace.java:2399) + at org.eclipse.core.internal.resources.Workspace.open(Workspace.java:2156) + at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:464) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:36) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:419) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +!SUBENTRY 2 org.eclipse.core.resources 4 567 2020-06-17 14:57:08.842 +!MESSAGE The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 14:57:12.158 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 14:57:12.190 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:57:12.191 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:57:12.191 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 14:57:12.213 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:57:12.214 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 14:57:12.604 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. + +!ENTRY org.eclipse.cdt.core 1 0 2020-06-17 14:57:35.283 +!MESSAGE Indexed 'sample_threadx' (1 sources, 0 headers) in 0.24 sec: 60 declarations; 165 references; 1 unresolved inclusions; 0 syntax errors; 105 unresolved names (32%) diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 00000000..42f9bd76 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -0,0 +1,5 @@ +*** SESSION Jan 19, 2016 10:54:21.49 ------------------------------------------- +*** SESSION Jan 19, 2016 11:01:03.18 ------------------------------------------- +*** SESSION Feb 12, 2016 17:04:55.37 ------------------------------------------- +*** SESSION Jun 17, 2020 14:55:32.91 ------------------------------------------- +*** SESSION Jun 17, 2020 14:57:11.20 ------------------------------------------- diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1453229896288.pdom b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1453229896288.pdom new file mode 100644 index 0000000000000000000000000000000000000000..b8b101eb07b3be9a45288a653cf1c69d8f209fa2 GIT binary patch literal 225280 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%0AQTKX37MVa$pB3y5yU~SH<92oaAW0qJOC5p?o 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 S&2Qp%zxEFF4)hNET?c**8hWw- literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592431055026.pdom b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592431055026.pdom new file mode 100644 index 0000000000000000000000000000000000000000..067cf79f531c70c2ad8deeccd57ecc8222b141a6 GIT binary patch literal 262144 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 {tJE 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 literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml new file mode 100644 index 00000000..1e6dfc06 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml @@ -0,0 +1,4699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml new file mode 100644 index 00000000..c4b91cfa --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1453229702368.pdom b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1453229702368.pdom new file mode 100644 index 0000000000000000000000000000000000000000..15347ccef7658727156b699d9baae3a67ebde907 GIT binary patch literal 749568 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 {o;8Yjr@ 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 z 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 *FGor}2S(zZCb;se#D13Iw>uhuIU%egpZNsj!9q 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 KTL1gU{`@~63iuHK literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml new file mode 100644 index 00000000..38f79520 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml @@ -0,0 +1,6159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 00000000..c552249b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,7 @@ + +

+
+
+
+
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..199f702413e0da40873175d838422875db724986 GIT binary patch literal 422 zcmZvY%TB{E5Je{`LaeG*DhpPqKQJUINnl;U5>@2`kY!I3izK$jE;N5n9$mB%3om@< z_-L*J00_Ht8^X$Pfg~$!9idbnrD1|Qt4#eNYJ#;BwXNvOmrO#PFiu~S=S>`?X_REx zV<9|D9kuxGWWDH7X(!DOF{w`}nud65nu9Lhbwz`JIq^Fg!u&ded$epUv2W3eg0LiA zlpb#4Xp;v+mDPm!)ykIx@G=6632=g0mPh~3T9_qC2Fs`GHBdqjLVnrxs8KhbxDgdH n720`jaZk=1S<;)*-thh$!+gB&&P`x_De6DIlhN=5wyFB5cs+BB!FV)K{&Pc%1x`)?4rO;gF+45lGNQvy1 z(IHT}hJ0{Gi|0-89E<>wC)i=1Voxbwu-A^TC3bCwZL_cEDrN9W@XI#0g*X5Fe#Ix) Ns>3ovz?xka_6MfYVn+Y~ literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 00000000..25cb955b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..bb2b32afa658f1391499f1ee1e521cb9127b5258 GIT binary patch literal 104 zcmZQ%U|?WmVAN+|Vq%cWFG|--P0q>$;?eHE=kNSVBj@0wKOm_HZ!p_H8wT}0JgLo@&Et; literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 00000000..6b2aaa76 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree new file mode 100644 index 0000000000000000000000000000000000000000..6419697671e2b52871322fe03b82ff6a79de7d7c GIT binary patch literal 37707 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 WHr>w%X^te>i)2s6h2mrW<9`7}Lkc(m literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000000000000000000000000000000000000..860287ad3e90a2f702c9c76246ba291ac311b3c4 GIT binary patch literal 516 zcmZ?R*xjhShe1S2b=vdAllRFf=Oz}Hq!uZZBqrsg@^UGMr=}=)mF6iJnkyKZS{a&I z85t-9xP&Me85kMxawX@aCKkD*=9DDH=NF~xr6%WO78IxIC8w0=CFd8V+LjcR0u8~T zDkU|kG+nPW(>5(Jrx>U#1!RtEML}j!Vo7Fx9(EHAO)ZT~jExK}3=B*S2^fv!1bw}d nqSRDdQ(mqE5x+l!JskMCr+Rn!F$bCk0Mu&(8Uj!^;0^)+H^8&i literal 0 HcmV?d00001 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..aa2411de --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs new file mode 100644 index 00000000..c002721a --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs @@ -0,0 +1,5 @@ +activeConfigDesc=sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default +configDescList=[sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default] +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchMode=debug +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchTarget=org.eclipse.cdt.launchbar.core.target.local +eclipse.preferences.version=1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 00000000..c71aa03b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2em.exeProject.666673635/com.arc.cdt.toolchain.av2em.exeDebugConfig.1217165695=com.arc.cdt.toolchain.arc.archiver.887646463\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.asmDebugExe.502330268\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeDebugConfig.1217165695\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeLinkerDebug.994503969\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeToolChainDebug.687487123\=rebuildState\\\=false\\r\\n\r\nav2em.exe.debug.exeCompilerDebug.670850607\=rebuildState\\\=false\\r\\n\r\n +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2em.exeProject.666673635/com.arc.cdt.toolchain.av2em.exeReleaseConfig.2022621224=com.arc.cdt.toolchain.av2em.asmReleaseExe.714380962\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.archiver.1360196687\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exelinkerRelease.1145338994\=rebuildState\\\=true\\r\\n\r\narc.cdt.toolchain.av2em.exeCompilerRelease.93257878\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeReleaseToolChain.1354693166\=rebuildState\\\=true\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2em.libProject.1936758151/com.arc.cdt.toolchain.av2em.libDebugConfig.732975342=av2em.lib.debug.libCompiler.557728458\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libDebugConfig.732975342\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.1782192981\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libDebugToolChain.1845103261\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.ArDebug.448807496\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libDebugAsm.1772833895\=rebuildState\\\=false\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2em.libProject.1936758151/com.arc.cdt.toolchain.av2em.libReleaseConfig.1738957053=com.arc.cdt.toolchain.av2em.libReleaseToolChain.637077717\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.ArRelease.50929117\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libReleaseAsm.1659783437\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.1430136995\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libCompilerRelease.267590455\=rebuildState\\\=true\\r\\n\r\n diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 00000000..5e2da66d --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..dffc6b51 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 00000000..47236716 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,5 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.localCLaunch=org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +eclipse.preferences.version=1 +prefWatchExpressions=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 00000000..45b0d108 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +org.eclipse.debug.ui.user_view_bindings=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=\r\n +pref_state_memento.org.eclipse.debug.ui.ExpressionView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.VariableView=\r\n\r\n\r\n +preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane| +preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 00000000..61f3bb8b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 00000000..76ce67b9 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,5 @@ +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1590536495337 +quickStart=true +tipsAndTricks=true diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 00000000..08076f23 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 00000000..60e7be60 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,4 @@ +//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false +UIActivities.com.arc.cdt.debug.seecode.ui.activity1=true +UIActivities.org.eclipse.cdt.debug.cdigdbActivity=true +eclipse.preferences.version=1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch new file mode 100644 index 00000000..943da6ac --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 00000000..360c49ad --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,11 @@ + +
+
+ + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 00000000..c22cfeb5 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml new file mode 100644 index 00000000..919834a6 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml @@ -0,0 +1,15 @@ + +
+
+ + + + + + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 00000000..2c2508c6 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,1779 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.SearchActionSet + persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.ui.CView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.TaskList + persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard1 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard2 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView + persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet + persp.actionSet:org.eclipse.cdt.ui.OpenActionSet + persp.actionSet:org.eclipse.cdt.ui.CodingActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation + persp.showIn:org.eclipse.cdt.ui.includeBrowser + persp.showIn:org.eclipse.cdt.ui.CView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.cdt.ui.includeBrowser + persp.actionSet:org.eclipse.debug.ui.debugActionSet + + + newtablook + active + + + + + + + + + + newtablook + + + + + + + + newtablook + Debug + + + + + + + + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.viewSC:org.eclipse.debug.ui.DebugView + persp.viewSC:org.eclipse.debug.ui.VariableView + persp.viewSC:org.eclipse.debug.ui.BreakpointView + persp.viewSC:org.eclipse.debug.ui.ExpressionView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.disasm + persp.viewSC:com.arc.cdt.debug.seecode.ui.command + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.memsearch + persp.viewSC:com.arc.cdt.seecode.errorlog + persp.viewSC:org.eclipse.cdt.debug.ui.SignalsView + persp.viewSC:org.eclipse.cdt.debug.ui.RegisterView + persp.viewSC:org.eclipse.debug.ui.ModuleView + persp.viewSC:org.eclipse.debug.ui.MemoryView + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.debug.ui.executablesView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSet + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt + persp.viewSC:org.eclipse.cdt.dsf.gdb.ui.tracecontrol.view + persp.viewSC:org.eclipse.cdt.dsf.debug.ui.disassembly.view + persp.perspSC:org.eclipse.cdt.ui.CPerspective + persp.viewSC:org.eclipse.cdt.visualizer.view + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt2 + + + + + + newtablook + org.eclipse.e4.primaryNavigationStack + + + + + newtablook + + + + + newtablook + + + + + + + + + + + + + + + + + + newtablook + + + + + + newtablook + org.eclipse.e4.secondaryNavigationStack + + + + + + + + + Standalone + + + + + + + newtablook + org.eclipse.e4.secondaryDataStack + + + + + + + + + + newtablook + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Help + + + + newtablook + org.eclipse.e4.primaryDataStack + EditorStack + + + + + View + categoryTag:General + active + activeOnClose + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:&C/C++ + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Make + + + View + categoryTag:Terminal + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history new file mode 100644 index 00000000..023aad6a --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index new file mode 100644 index 00000000..b1d64d87 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index @@ -0,0 +1 @@ +1592431039575 Delete resource 'demo_threadx' diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 00000000..aa267842 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+ + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 00000000..50f1edb3 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 00000000..dba32153 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,14 @@ + +
+
+ + + + + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 00000000..6c7a5b44 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,29 @@ + +
+
+ + + + + + + + + + +
+
+ + + + +
+
+ + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 00000000..1ad3c528 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/version.ini b/ports/arc_em/metaware/example_build/.metadata/version.ini new file mode 100644 index 00000000..824cbfda --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/version.ini @@ -0,0 +1,3 @@ +#Wed Jun 17 14:57:08 PDT 2020 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.6.3.v20170301-0400 diff --git a/ports/arc_em/metaware/example_build/sample_threadx/.cproject b/ports/arc_em/metaware/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..e14337b5 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/.cproject @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/sample_threadx/.project b/ports/arc_em/metaware/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml b/ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..02e19444 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..24d05100 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,368 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); + + return(0); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd new file mode 100644 index 00000000..aced0777 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd @@ -0,0 +1,56 @@ +// +// This is the linker script example (SRV3-style). +// (c) Synopsys, 2013 +// +// + +//number of exceptions and interrupts +NUMBER_OF_EXCEPTIONS = 16;//it is fixed (16) +NUMBER_OF_INTERRUPTS = 5;//depends on HW configuration + +//define Interrupt Vector Table size +IVT_SIZE_ITEMS = (NUMBER_OF_EXCEPTIONS + NUMBER_OF_INTERRUPTS);//the total IVT size (in "items") +IVT_SIZE_BYTES = IVT_SIZE_ITEMS * 4;//in bytes + +//define ICCM and DCCM locations +MEMORY { + + ICCM: ORIGIN = 0x00000000, LENGTH = 128K + DCCM: ORIGIN = 0x80000000, LENGTH = 128K +} + +//define sections and groups +SECTIONS { + GROUP: { + .ivt (TEXT) : # Interrupt table + { + ___ivt1 = .; + * (.ivt) + ___ivt2 = .; + // Make the IVT at least IVT_SIZE_BYTES + . += (___ivt2 - ___ivt1 < IVT_SIZE_BYTES) ? (IVT_SIZE_BYTES - (___ivt2 - ___ivt1)) : 0; + } + .ivh (TEXT) : // Interrupt handlers + + //TEXT sections + .text? : { *('.text$crt*') } + * (TEXT): {} + //Literals + * (LIT): {} + } > ICCM + + GROUP: { + //data sections + .sdata?: {} + .sbss?: {} + *(DATA): {} + *(BSS): {} + //stack + .stack_top: {} + .stack ALIGN(4) SIZE(DEFINED _STACKSIZE?_STACKSIZE:4096): {} + .stack_base: {} + //heap (empty) + .heap? ALIGN(4) SIZE(DEFINED _HEAPSIZE?_HEAPSIZE:0): {} + .free_memory: {} + } > DCCM + } diff --git a/ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s b/ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s new file mode 100644 index 00000000..8b75bf9f --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s @@ -0,0 +1,360 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; + .equ IRQ_SELECT, 0x40B + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +; +; /* Define section for placement after all linker allocated RAM memory. This +; is used to calculate the first free address that is passed to +; tx_appication_define, soley for the ThreadX application's use. */ +; + .section ".free_memory","aw" + .align 4 + .global _tx_first_free_address +_tx_first_free_address: + .space 4 +; +; /* Define section for placement before the main stack area for setting +; up the STACK_TOP address for hardware stack checking. */ +; + .section ".stack_top","aw" + .align 4 + .global _tx_system_stack_top_address +_tx_system_stack_top_address: + .space 4 +; +; /* Define section for placement after the main stack area for setting +; up the STACK_BASE address for hardware stack checking. */ +; + .section ".stack_base","aw" + .align 4 + .global _tx_system_stack_base_address +_tx_system_stack_base_address: + .space 4 +; +; + .text +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + + .ifdef TX_ENABLE_HW_STACK_CHECKING + mov r0, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r0, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r0, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r0, [KSTACK_BASE] ; Setup KSTACK_BASE + lr r0, [status32] ; Pickup current STATUS32 + or r0, r0, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r0 ; Enable hardware stack checking + .endif +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + st sp, [gp, _tx_thread_system_stack_ptr@sda] ; Save system stack pointer +; +; +; /* Pickup the first available memory address. */ +; + mov r0, _tx_first_free_address ; Pickup first free memory address +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) _end; +; + st r0, [gp, _tx_initialize_unused_memory@sda] +; +; +; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */ +; + mov r0, 0 ; Disable additional ISR reg saving/restoring + sr r0, [AUX_IRQ_CTRL] ; + + mov r0, 16 ; Select timer 0 + sr r0, [IRQ_SELECT] ; + mov r0, 15 ; Set timer 0 to priority 15 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10000 ; Setup timer period + sr r0, [LIMIT0] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT0] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL0] ; + + .ifdef TX_TIMER_1_SETUP + mov r0, 17 ; Select timer 1 + sr r0, [IRQ_SELECT] ; + mov r0, 2 ; Set timer 1 to priority 14 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10020 ; Setup timer period + sr r0, [LIMIT1] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT1] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL1] ; + .endif +; +; /* Done, return to caller. */ +; + j_s.d [blink] ; Return to caller + nop +;} +; +; +; /* Define default vector table entries. */ +; + .global _tx_memory_error +_tx_memory_error: + flag 1 + nop + nop + nop + b _tx_memory_error + + .global _tx_instruction_error +_tx_instruction_error: + flag 1 + nop + nop + nop + b _tx_instruction_error + + .global _tx_ev_machine_check +_tx_ev_machine_check: + flag 1 + nop + nop + nop + b _tx_ev_machine_check + + .global _tx_ev_tblmiss_inst +_tx_ev_tblmiss_inst: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_inst + + .global _tx_ev_tblmiss_data +_tx_ev_tblmiss_data: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_data + + .global _tx_ev_protection_viol +_tx_ev_protection_viol: + flag 1 + nop + nop + nop + b _tx_ev_protection_viol + + .global _tx_ev_privilege_viol +_tx_ev_privilege_viol: + flag 1 + nop + nop + nop + b _tx_ev_privilege_viol + + .global _tx_ev_software_int +_tx_ev_software_int: + flag 1 + nop + nop + nop + b _tx_ev_software_int + + .global _tx_ev_trap +_tx_ev_trap: + flag 1 + nop + nop + nop + b _tx_ev_trap + + .global _tx_ev_extension +_tx_ev_extension: + flag 1 + nop + nop + nop + b _tx_ev_extension + + .global _tx_ev_divide_by_zero +_tx_ev_divide_by_zero: + flag 1 + nop + nop + nop + b _tx_ev_divide_by_zero + + .global _tx_ev_dc_error +_tx_ev_dc_error: + flag 1 + nop + nop + nop + b _tx_ev_dc_error + + .global _tx_ev_maligned +_tx_ev_maligned: + flag 1 + nop + nop + nop + b _tx_ev_maligned + + .global _tx_unsued_0 +_tx_unsued_0: + flag 1 + nop + nop + nop + b _tx_unsued_0 + + .global _tx_unused_1 +_tx_unused_1: + flag 1 + nop + nop + nop + b _tx_unused_1 + + .global _tx_timer_0 +_tx_timer_0: +; +; /* By default, setup Timer 0 as the ThreadX timer interrupt. */ +; + sub sp, sp, 160 ; Allocate an interrupt stack frame + st r0, [sp, 0] ; Save r0 + st r1, [sp, 4] ; Save r1 + st r2, [sp, 8] ; Save r2 + mov r0, 3 + sr r0, [CONTROL0] + + b _tx_timer_interrupt ; Jump to generic ThreadX timer interrupt + ; handler +; flag 1 +; nop +; nop +; nop +; b _tx_timer_0 + + .global _tx_timer_1 +_tx_timer_1: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Call context save +; +; /* ISR processing goes here. If the applications wishes to re-enable +; interrupts, the SETI instruction can be used here. Also note that +; register usage in assembly code must be confined to the compiler +; scratch registers. */ +; + mov r0, 3 + sr r0, [CONTROL1] +; + b _tx_thread_context_restore ; Call context restore + +; flag 1 +; nop +; nop +; nop +; b _tx_timer_1 + + .global _tx_undefined_0 +_tx_undefined_0: + flag 1 + nop + nop + nop + b _tx_undefined_0 + + .global _tx_undefined_1 +_tx_undefined_1: + flag 1 + nop + nop + nop + b _tx_undefined_1 + + .global _tx_undefined_2 +_tx_undefined_2: + flag 1 + nop + nop + nop + b _tx_undefined_2 + + .end diff --git a/ports/arc_em/metaware/example_build/sample_threadx/vectors.s b/ports/arc_em/metaware/example_build/sample_threadx/vectors.s new file mode 100644 index 00000000..c6cbc893 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/vectors.s @@ -0,0 +1,29 @@ + +.file "vectors.s" +.section .ivt,text +;; This directive forces this section to stay resident even if stripped out by the -zpurgetext linker option +.sectflag .ivt,include + +;// handler's name type number name offset in IVT (hex/dec) +.long _start ; exception 0 program entry point offset 0x0 0 +.long _tx_memory_error ; exception 1 memory_error offset 0x4 4 +.long _tx_instruction_error ; exception 2 instruction_error offset 0x8 8 +.long _tx_ev_machine_check ; exception 3 EV_MachineCheck offset 0xC 12 +.long _tx_ev_tblmiss_inst ; exception 4 EV_TLBMissI offset 0x10 16 +.long _tx_ev_tblmiss_data ; exception 5 EV_TLBMissD offset 0x14 20 +.long _tx_ev_protection_viol ; exception 6 EV_ProtV offset 0x18 24 +.long _tx_ev_privilege_viol ; exception 7 EV_PrivilegeV offset 0x1C 28 +.long _tx_ev_software_int ; exception 8 EV_SWI offset 0x20 32 +.long _tx_ev_trap ; exception 9 EV_Trap offset 0x24 36 +.long _tx_ev_extension ; exception 10 EV_Extension offset 0x28 40 +.long _tx_ev_divide_by_zero ; exception 11 EV_DivZero offset 0x2C 44 +.long _tx_ev_dc_error ; exception 12 EV_DCError offset 0x30 48 +.long _tx_ev_maligned ; exception 13 EV_Maligned offset 0x34 52 +.long _tx_unsued_0 ; exception 14 unused offset 0x38 56 +.long _tx_unused_1 ; exception 15 unused offset 0x3C 60 +.long _tx_timer_0 ; IRQ 16 Timer 0 offset 0x40 64 +.long _tx_timer_1 ; IRQ 17 Timer 1 offset 0x44 68 +.long _tx_undefined_0 ; IRQ 18 offset 0x48 72 +.long _tx_undefined_1 ; IRQ 19 offset 0x4C 76 +.long _tx_undefined_2 ; IRQ 20 offset 0x50 80 + diff --git a/ports/arc_em/metaware/example_build/tx/.cproject b/ports/arc_em/metaware/example_build/tx/.cproject new file mode 100644 index 00000000..ce329051 --- /dev/null +++ b/ports/arc_em/metaware/example_build/tx/.cproject @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/tx/.project b/ports/arc_em/metaware/example_build/tx/.project new file mode 100644 index 00000000..863ca5cb --- /dev/null +++ b/ports/arc_em/metaware/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml b/ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..a0e8c9c5 --- /dev/null +++ b/ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/inc/tx_port.h b/ports/arc_em/metaware/inc/tx_port.h new file mode 100644 index 00000000..0a197ab6 --- /dev/null +++ b/ports/arc_em/metaware/inc/tx_port.h @@ -0,0 +1,325 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARCv2_EM/MetaWare */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Remove volatile for ThreadX source on the ARC. This is because the ARC + compiler generates different non-cache r/w access when using volatile + that is different from the assembly language access of the same + global variables in ThreadX. */ + +#ifdef TX_SOURCE_CODE +#define volatile +#else +#ifdef NX_SOURCE_CODE +#define volatile +#else +#ifdef FX_SOURCE_CODE +#define volatile +#else +#ifdef UX_SOURCE_CODE +#define volatile +#endif +#endif +#endif +#endif + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 800 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 2048 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARCv2 EM port. */ + +#define TX_INT_ENABLE 0x0000001F /* Enable all interrupts */ +#define TX_INT_DISABLE_MASK 0x00000000 /* Disable all interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 VOID *__mw_threadx_tls; \ + int __mw_errnum; \ + VOID (*__mw_thread_exit)(struct TX_THREAD_STRUCT *); +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + +#if __HIGHC__ + +/* The MetaWare thread safe C/C++ runtime library needs space to + store thread specific information. In addition, a function pointer + is also supplied so that certain thread-specific resources may be + released upon thread termination and/or thread completion. */ + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) \ + thread_ptr -> __mw_threadx_tls = 0; \ + thread_ptr -> __mw_errnum = 0; \ + thread_ptr -> __mw_thread_exit = TX_NULL; +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); + +#else + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _clri(); +#define TX_RESTORE _seti(interrupt_save); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARCv2_EM/MetaWare Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/arc_em/metaware/readme_threadx.txt b/ports/arc_em/metaware/readme_threadx.txt new file mode 100644 index 00000000..dcba11a8 --- /dev/null +++ b/ports/arc_em/metaware/readme_threadx.txt @@ -0,0 +1,219 @@ + Microsoft's Azure RTOS ThreadX for ARC EM + + Using the MetaWare Tools + +1. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace, which is located inside the "example_build" directory. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply select the ThreadX library project +file "tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the MetaWare ARCv2 EM +simulation. The instructions that follow describe how to get the ThreadX +demonstration running. + +Building the demonstration is easy; simply select the demonstration project file +"sample_threadx." At this point, select the build button and observe the +compilation, assembly, and linkage of the ThreadX demonstration application. + +After the demonstration is built, click on the "Debug" button and it will +automatically launch a pre-configured connection to the ARCv2 EM simulator. + +You are now ready to execute the ThreadX demonstration system. Select +breakpoints and data watches to observe the execution of the sample_threadx.c +application. + + +4. System Initialization + +The system entry point using the MetaWare tools is at the label _start. +This is defined within the crt1.s file supplied by MetaWare. In addition, +this is where all static and global preset C variable initialization +processing is called from. + +After the MetaWare startup function completes, ThreadX initialization is +called. The main initialization function is _tx_initialize_low_level and +is located in the file tx_initialize_low_level.s. This function is +responsible for setting up various system data structures, and interrupt +vectors. + +By default free memory is assumed to start at the section .free_memory +which is referenced in tx_initialize_low_level.s and located in the +linker control file after all the linker defined RAM addresses. This is +the address passed to the application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The ARC compiler assumes that registers r0-r12 are scratch registers for +each function. All other registers used by a C function must be preserved +by the function. ThreadX takes advantage of this in situations where a +context switch happens as a result of making a ThreadX service call (which +is itself a C function). In such cases, the saved context of a thread is +only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 LP_START blink + 0x08 LP_END fp + 0x0C LP_COUNT r26 + 0x10 blink r25 + 0x14 ilink r24 + 0x18 fp r23 + 0x1C r26 r22 + 0x20 r25 r21 + 0x24 r24 r20 + 0x28 r23 r19 + 0x2C r22 r18 + 0x30 r21 r17 + 0x34 r20 r16 + 0x38 r19 r15 + 0x3C r18 r14 + 0x40 r17 r13 + 0x44 r16 STATUS32 + 0x48 r15 r30 + 0x4C r14 + 0x50 r13 + 0x54 r12 + 0x58 r11 + 0x5C r10 + 0x60 r9 + 0x64 r8 + 0x68 r7 + 0x6C r6 + 0x70 r5 + 0x74 r4 + 0x78 r3 + 0x7C r2 + 0x80 r1 + 0x84 r0 + 0x88 r30 + 0x8C r58 (if TX_ENABLE_ACC defined) + 0x90 r59 (if TX_ENABLE_ACC defined) + 0x94 reserved + 0x98 reserved + 0x9C bta + 0xA0 point of interrupt + 0xA4 STATUS32 + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat +file to remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for the +ARCv2 EM processor. The following template should be used for interrupts +managed by ThreadX: + + .global _tx_interrupt_x +_tx_interrupt_x: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink (blink must be saved before _tx_thread_context_save) + bl _tx_thread_context_save ; Save interrupt context +; +; /* Application ISR processing goes here! Your ISR can be written in +; assembly language or in C. If it is written in C, you must allocate +; 16 bytes of stack space before it is called. This must also be +; recovered once your C ISR return. An example of this is shown below. +; +; If the ISR is written in assembly language, only the compiler scratch +; registers are available for use without saving/restoring (r0-r12). +; If use of additional registers are required they must be saved and +; restored. */ +; + bl.d your_ISR_written_in_C ; Call an ISR written in C + sub sp, sp, 16 ; Allocate stack space (delay slot) + add sp, sp, 16 ; Recover stack space + +; + b _tx_thread_context_restore ; Restore interrupt context + + +The application handle interrupts directly, which necessitates all register +preservation by the application's ISR. ISRs that do not use the ThreadX +_tx_thread_context_save and _tx_thread_context_restore routines are not +allowed access to the ThreadX API. In addition, custom application ISRs +should be higher priority than all ThreadX-managed ISRs. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +By default, the ThreadX timer interrupt is mapped to the ARCv2 EM auxiliary +timer 0, which generates low priority interrupts on interrupt vector 16. +It is easy to change the timer interrupt source and priority by changing the +setup code in tx_initialize_low_level.s. + + +9. Hardware Stack Checking + +ThreadX optionally supports the ARCv2 EM hardware stack checking feature. When enabled, +the KSTACK_TOP and KSTACK_BASE registers are loaded with the stack top/bottom before +each thread's execution. In addition, the SC bit of STATUS32 is set to enable the stack +checking feature. During initialization, idle, or interrupt processing, the hardware +stack checking on the system stack is performed, when enabled. + +To enable ThreadX support for hardware stack checking, simply build the ThreadX library +and application assembly code with TX_ENABLE_HW_STACK_CHECKING defined. This will enable +the stack checking logic in ThreadX. + +For the system stack checking to function properly, there are two sections that must +be located around the .stack section, which defines the system stack location and size. +The new sections are .stack_top and .stack_base. The .stack_top section should be placed +immediately BEFORE the .stack section and .stack_base should be placed immediately AFTER +the .stack section. Please see the sample_threadx.cmd linker control file for an example. + +When/if a stack exception occurs, the hardware will fetch the _tx_ev_protection_viol +exception defined in tx_initialize_low_level.s. Processing for this exception is +application specific. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 for ARCv2 EM using MetaWare tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arc_em/metaware/src/tx_initialize_low_level.s b/ports/arc_em/metaware/src/tx_initialize_low_level.s new file mode 100644 index 00000000..8b75bf9f --- /dev/null +++ b/ports/arc_em/metaware/src/tx_initialize_low_level.s @@ -0,0 +1,360 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; + .equ IRQ_SELECT, 0x40B + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +; +; /* Define section for placement after all linker allocated RAM memory. This +; is used to calculate the first free address that is passed to +; tx_appication_define, soley for the ThreadX application's use. */ +; + .section ".free_memory","aw" + .align 4 + .global _tx_first_free_address +_tx_first_free_address: + .space 4 +; +; /* Define section for placement before the main stack area for setting +; up the STACK_TOP address for hardware stack checking. */ +; + .section ".stack_top","aw" + .align 4 + .global _tx_system_stack_top_address +_tx_system_stack_top_address: + .space 4 +; +; /* Define section for placement after the main stack area for setting +; up the STACK_BASE address for hardware stack checking. */ +; + .section ".stack_base","aw" + .align 4 + .global _tx_system_stack_base_address +_tx_system_stack_base_address: + .space 4 +; +; + .text +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + + .ifdef TX_ENABLE_HW_STACK_CHECKING + mov r0, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r0, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r0, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r0, [KSTACK_BASE] ; Setup KSTACK_BASE + lr r0, [status32] ; Pickup current STATUS32 + or r0, r0, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r0 ; Enable hardware stack checking + .endif +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + st sp, [gp, _tx_thread_system_stack_ptr@sda] ; Save system stack pointer +; +; +; /* Pickup the first available memory address. */ +; + mov r0, _tx_first_free_address ; Pickup first free memory address +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) _end; +; + st r0, [gp, _tx_initialize_unused_memory@sda] +; +; +; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */ +; + mov r0, 0 ; Disable additional ISR reg saving/restoring + sr r0, [AUX_IRQ_CTRL] ; + + mov r0, 16 ; Select timer 0 + sr r0, [IRQ_SELECT] ; + mov r0, 15 ; Set timer 0 to priority 15 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10000 ; Setup timer period + sr r0, [LIMIT0] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT0] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL0] ; + + .ifdef TX_TIMER_1_SETUP + mov r0, 17 ; Select timer 1 + sr r0, [IRQ_SELECT] ; + mov r0, 2 ; Set timer 1 to priority 14 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10020 ; Setup timer period + sr r0, [LIMIT1] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT1] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL1] ; + .endif +; +; /* Done, return to caller. */ +; + j_s.d [blink] ; Return to caller + nop +;} +; +; +; /* Define default vector table entries. */ +; + .global _tx_memory_error +_tx_memory_error: + flag 1 + nop + nop + nop + b _tx_memory_error + + .global _tx_instruction_error +_tx_instruction_error: + flag 1 + nop + nop + nop + b _tx_instruction_error + + .global _tx_ev_machine_check +_tx_ev_machine_check: + flag 1 + nop + nop + nop + b _tx_ev_machine_check + + .global _tx_ev_tblmiss_inst +_tx_ev_tblmiss_inst: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_inst + + .global _tx_ev_tblmiss_data +_tx_ev_tblmiss_data: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_data + + .global _tx_ev_protection_viol +_tx_ev_protection_viol: + flag 1 + nop + nop + nop + b _tx_ev_protection_viol + + .global _tx_ev_privilege_viol +_tx_ev_privilege_viol: + flag 1 + nop + nop + nop + b _tx_ev_privilege_viol + + .global _tx_ev_software_int +_tx_ev_software_int: + flag 1 + nop + nop + nop + b _tx_ev_software_int + + .global _tx_ev_trap +_tx_ev_trap: + flag 1 + nop + nop + nop + b _tx_ev_trap + + .global _tx_ev_extension +_tx_ev_extension: + flag 1 + nop + nop + nop + b _tx_ev_extension + + .global _tx_ev_divide_by_zero +_tx_ev_divide_by_zero: + flag 1 + nop + nop + nop + b _tx_ev_divide_by_zero + + .global _tx_ev_dc_error +_tx_ev_dc_error: + flag 1 + nop + nop + nop + b _tx_ev_dc_error + + .global _tx_ev_maligned +_tx_ev_maligned: + flag 1 + nop + nop + nop + b _tx_ev_maligned + + .global _tx_unsued_0 +_tx_unsued_0: + flag 1 + nop + nop + nop + b _tx_unsued_0 + + .global _tx_unused_1 +_tx_unused_1: + flag 1 + nop + nop + nop + b _tx_unused_1 + + .global _tx_timer_0 +_tx_timer_0: +; +; /* By default, setup Timer 0 as the ThreadX timer interrupt. */ +; + sub sp, sp, 160 ; Allocate an interrupt stack frame + st r0, [sp, 0] ; Save r0 + st r1, [sp, 4] ; Save r1 + st r2, [sp, 8] ; Save r2 + mov r0, 3 + sr r0, [CONTROL0] + + b _tx_timer_interrupt ; Jump to generic ThreadX timer interrupt + ; handler +; flag 1 +; nop +; nop +; nop +; b _tx_timer_0 + + .global _tx_timer_1 +_tx_timer_1: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Call context save +; +; /* ISR processing goes here. If the applications wishes to re-enable +; interrupts, the SETI instruction can be used here. Also note that +; register usage in assembly code must be confined to the compiler +; scratch registers. */ +; + mov r0, 3 + sr r0, [CONTROL1] +; + b _tx_thread_context_restore ; Call context restore + +; flag 1 +; nop +; nop +; nop +; b _tx_timer_1 + + .global _tx_undefined_0 +_tx_undefined_0: + flag 1 + nop + nop + nop + b _tx_undefined_0 + + .global _tx_undefined_1 +_tx_undefined_1: + flag 1 + nop + nop + nop + b _tx_undefined_1 + + .global _tx_undefined_2 +_tx_undefined_2: + flag 1 + nop + nop + nop + b _tx_undefined_2 + + .end diff --git a/ports/arc_em/metaware/src/tx_thread_context_restore.s b/ports/arc_em/metaware/src/tx_thread_context_restore.s new file mode 100644 index 00000000..8bc31394 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_context_restore.s @@ -0,0 +1,302 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, @function +_tx_thread_context_restore: +; +; /* Note: it is assumed that the stack pointer is in the same position now as +; it was after the last context save call. */ +; +; /* Lockout interrupts. */ +; + clri ; Disable interrupts + nop ; Delay for interrupts to really be disabled + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + bl.d _tx_execution_isr_exit ; Call the ISR exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state contents + sub r0, r0, 1 ; Decrement the system state + st r0, [gp, _tx_thread_system_state@sda] ; Store the new system state + breq r0, 0, __tx_thread_not_nested_restore ; If zero, not a nested interrupt +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + +__tx_thread_nested_restore: + + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; +; } +__tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + ld r2, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable flag + sub.f 0, r0, 0 ; Set condition codes + beq.d __tx_thread_idle_system_restore ; If NULL, idle system was interrupted + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + brne.d r4, r5, __tx_thread_no_preempt_restore ; If more interrupts, just return to the point of interrupt + ld r4, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + brne r2, 0, __tx_thread_no_preempt_restore ; If set, don't preempt executing thread + brne r0, r4, __tx_thread_preempt_restore ; Not equal, preempt executing thread +; +; +__tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; + +; /* Recover the saved context and return to the point of interrupt. */ +; + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + ld r3, [r0, 12] ; Pickup the top of the thread's stack (lowest address) + sr r3, [KSTACK_TOP] ; Setup KSTACK_TOP + ld r3, [r0, 16] ; Pickup the base of the thread's stack (highest address) + sr r3, [KSTACK_BASE] ; Setup KSTACK_BASE + .endif + + ld sp, [r0, 8] ; Switch back to thread's stack + + .ifdef TX_ENABLE_HW_STACK_CHECKING + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r2 ; Enable hardware stack checking + .endif + + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; } +; else +; { +__tx_thread_preempt_restore: +; + ld r7, [r0, 8] ; Pickup stack pointer + mov r6, 1 ; Build interrupt stack type + st r6, [r7, 0] ; Setup interrupt stack type + st fp, [r7, 24] ; Save fp + st gp, [r7, 28] ; Save gp + st r25, [r7, 32] ; Save r25 + st r24, [r7, 36] ; Save r24 + st r23, [r7, 40] ; Save r23 + st r22, [r7, 44] ; Save r22 + st r21, [r7, 48] ; Save r21 + st r20, [r7, 52] ; Save r20 + st r19, [r7, 56] ; Save r19 + st r18, [r7, 60] ; Save r18 + st r17, [r7, 64] ; Save r17 + st r16, [r7, 68] ; Save r16 + st r15, [r7, 72] ; Save r15 + st r14, [r7, 76] ; Save r14 + st r13, [r7, 80] ; Save r13 + st r30, [r7, 136] ; Save r30 +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup time-slice contents + mov r7, 0 ; Build clear/NULL value + breq r2, 0, __tx_thread_dont_save_ts ; No time-slice, don't need to save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r2, [r0, 24] ; If set, save remaining time-slice + st r7, [gp, _tx_timer_time_slice@sda] ; If set, clear time slice +; +; } +__tx_thread_dont_save_ts: +; +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + st r7, [gp, _tx_thread_current_ptr@sda] ; Set current thread ptr to NULL + + sub sp, sp, 8 ; Allocate a small stack frame on the system stack + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +; } +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; +__tx_thread_idle_system_restore: + + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + sub.f 0, r4, r5 ; Set condition codes + bne __tx_thread_nested_restore ; If more interrupts, just return to the point of interrupt + + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +;} + .end + diff --git a/ports/arc_em/metaware/src/tx_thread_context_save.s b/ports/arc_em/metaware/src/tx_thread_context_save.s new file mode 100644 index 00000000..e60bc856 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_context_save.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + .global _tx_thread_context_save + .type _tx_thread_context_save, @function +_tx_thread_context_save: +; +; /* Upon entry to this routine, it is assumed that an interrupt stack frame +; has already been allocated, and the interrupted blink register is already saved. */ +; + clri ; Disable interrupts + st r1, [sp, 128] ; Save r1 + st r0, [sp, 132] ; Save r0 +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state + st r3, [sp, 120] ; Save r3 + st r2, [sp, 124] ; Save r2 + breq r0, 0, __tx_thread_not_nested_save ; If 0, we are not in a nested + ; condition +; +; /* Nested interrupt condition. */ +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; +__tx_thread_nested_save: ; Label is for special nested interrupt case from idle system save below + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r6 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + +; +; /* Return to the ISR. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; + + j.d [blink] ; Return to Level 1 ISR + st ilink, [sp, 20] ; Save ilink +; +__tx_thread_not_nested_save: +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state + ld r1, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + breq r1, 0, __tx_thread_idle_system_save ; If no thread is running, idle system was + ; interrupted. +; +; /* Save minimal context of interrupted thread. */ +; + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r4 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + st ilink, [sp, 20] ; Save ilink + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; + st sp, [r1, 8] ; Save thread's stack pointer + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + mov r1, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r1, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r1, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r1, [KSTACK_BASE] ; Setup KSTACK_BASE + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + j_s.d [blink] ; Return to calling ISR + kflag r2 ; Enable hardware stack checking + .else +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + j_s.d [blink] ; Return to calling ISR + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + .endif +; +; } +; else +; { +; +__tx_thread_idle_system_save: +; +; /* Interrupt occurred in the scheduling loop. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; +; /* See if we have a special nesting condition. This happens when the higher priority +; interrupt occurs before the nested interrupt logic is valid. */ +; + lr r0, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r1, r0 ; Negate + and r1, r0, r1 ; See if there are any other interrupts present + brne r0, r1, __tx_thread_nested_save ; If more interrupts, go into the nested interrupt save logic +; +; /* Not much to do here, just adjust the stack pointer, and return to +; ISR processing. */ +; + j_s.d [blink] ; Return to ISR + add sp, sp, 160 ; Recover stack space +; +; } +;} + .end diff --git a/ports/arc_em/metaware/src/tx_thread_interrupt_control.s b/ports/arc_em/metaware/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..5bdf3ccb --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_interrupt_control.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, @function +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + clri r1 ; Get current interrupt state +; +; /* Apply the new interrupt posture. */ +; + seti r0 ; Set desired interrupt state + j_s.d [blink] ; Return to caller with delay slot + mov r0, r1 ; Return previous mask value. Return value is TX_INT_DISABLE or TX_INT_ENABLE. +; +;} + .end diff --git a/ports/arc_em/metaware/src/tx_thread_schedule.s b/ports/arc_em/metaware/src/tx_thread_schedule.s new file mode 100644 index 00000000..2a310a16 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_schedule.s @@ -0,0 +1,238 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; + .equ BTA, 0x412 + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + .global _tx_thread_schedule + .type _tx_thread_schedule, @function +_tx_thread_schedule: +; +; /* Enable interrupts. */ +; + mov r0, 0x1F ; Build enable interrupt value + seti r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { +; +__tx_thread_schedule_loop: +; + ld r0, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + breq r0, 0, __tx_thread_schedule_loop ; If NULL, keep looking +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + clri ; Lockout interrupts + nop ; Delay for interrupts to really be disabled +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + st r0, [gp, _tx_thread_current_ptr@sda] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + ld r3, [r0, 4] ; Pickup run counter + ld r4, [r0, 24] ; Pickup time-slice for this thread + add r3, r3, 1 ; Increment run counter + st r3, [r0, 4] ; Store the new run counter + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + ld r3, [r0, 12] ; Pickup the top of the thread's stack (lowest address) + sr r3, [KSTACK_TOP] ; Setup KSTACK_TOP + ld r3, [r0, 16] ; Pickup the base of the thread's stack (highest address) + sr r3, [KSTACK_BASE] ; Setup KSTACK_BASE + .endif +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + ld sp, [r0, 8] ; Switch to thread's stack + + .ifdef TX_ENABLE_HW_STACK_CHECKING + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r2 ; Enable hardware stack checking + .endif + + st r4, [gp, _tx_timer_time_slice@sda] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + bl.d _tx_execution_thread_enter ; Call the thread execution enter function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + ld r1, [sp, 0] ; Pickup the stack type + brne r1, 0, __tx_thread_schedule_int_ret ; Compare to solicited stack type. If not, thread was interrupted + ld blink, [sp, 4] ; Recover blink + ld fp, [sp, 8] ; Recover fp + ld gp, [sp, 12] ; Recover gp + ld r25, [sp, 16] ; Recover r25 + ld r24, [sp, 20] ; Recover r24 + ld r23, [sp, 24] ; Recover r23 + ld r22, [sp, 28] ; Recover r22 + ld r21, [sp, 32] ; Recover r21 + ld r20, [sp, 36] ; Recover r20 + ld r19, [sp, 40] ; Recover r19 + ld r18, [sp, 44] ; Recover r18 + ld r17, [sp, 48] ; Recover r17 + ld r16, [sp, 52] ; Recover r16 + ld r15, [sp, 56] ; Recover r15 + ld r14, [sp, 60] ; Recover r14 + ld r13, [sp, 64] ; Recover r13 + ld r1, [sp, 68] ; Pickup status32 + ld r30, [sp, 72] ; Recover r30 + add sp, sp, 76 ; Recover solicited stack frame + j_s.d [blink] ; Return to thread and restore flags + seti r1 ; Recover STATUS32 +; +__tx_thread_schedule_int_ret: +; + mov r0, 0x2 ; Pretend level 1 interrupt is returning + sr r0, [AUX_IRQ_ACT] ; + + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + ld r0, [sp, 156] ; Pickup saved BTA + sr r0, [BTA] ; Recover BTA + ld blink, [sp, 16] ; Recover blink + ld ilink, [sp, 20] ; Recover ilink + ld fp, [sp, 24] ; Recover fp + ld gp, [sp, 28] ; Recover gp + ld r25, [sp, 32] ; Recover r25 + ld r24, [sp, 36] ; Recover r24 + ld r23, [sp, 40] ; Recover r23 + ld r22, [sp, 44] ; Recover r22 + ld r21, [sp, 48] ; Recover r21 + ld r20, [sp, 52] ; Recover r20 + ld r19, [sp, 56] ; Recover r19 + ld r18, [sp, 60] ; Recover r18 + ld r17, [sp, 64] ; Recover r17 + ld r16, [sp, 68] ; Recover r16 + ld r15, [sp, 72] ; Recover r15 + ld r14, [sp, 76] ; Recover r14 + ld r13, [sp, 80] ; Recover r13 + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + ld r30, [sp, 136] ; Recover r30 + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt + +; +;} +; + .end + diff --git a/ports/arc_em/metaware/src/tx_thread_stack_build.s b/ports/arc_em/metaware/src/tx_thread_stack_build.s new file mode 100644 index 00000000..ecda6a4d --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_stack_build.s @@ -0,0 +1,205 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + .equ LONG_ALIGN_MASK, 0xFFFFFFFC + .equ INT_ENABLE_BITS, 0x8000001E +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, @function +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARCv2 EM should look like the following after it is built. +; Note that the extension registers are always assigned space here. +; +; Stack Top: 1 Interrupt stack frame type +; LP_START Initial loop start +; LP_END Initial loop end +; LP_COUNT Initial loop count +; blink Initial blink value +; ilink Initial ilink (point of interrupt) +; fp (r27) Initial fp (0) +; gp Initial gp +; r25 Initial r25 +; r24 Initial r24 +; r23 Initial r23 +; r22 Initial r22 +; r21 Initial r21 +; r20 Initial r20 +; r19 Initial r19 +; r18 Initial r18 +; r17 Initial r17 +; r16 Initial r16 +; r15 Initial r15 +; r14 Initial r14 +; r13 Initial r13 +; r12 Initial r12 +; r11 Initial r11 +; r10 Initial r10 +; r9 Initial r9 +; r8 Initial r8 +; r7 Initial r7 +; r6 Initial r6 +; r5 Initial r5 +; r4 Initial r4 +; r3 Initial r3 +; r2 Initial r2 +; r1 Initial r1 +; r0 Initial r0 +; r30 Initial r30 +; r58 Initial r58 +; r59 Initial r59 +; 0 Reserved +; 0 Reserved +; 0 Initial BTA +; 0 Point of Interrupt (thread entry point) +; 0 Initial STATUS32 +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; +; *: these registers will only be saved and restored if flag -Xxmac_d16 is passed to hcac +; +; Stack Bottom: (higher memory address) */ +; + ld r3, [r0, 16] ; Pickup end of stack area + and r3, r3, LONG_ALIGN_MASK ; Ensure long-word alignment + sub r3, r3, 196 ; Allocate an interrupt stack frame (ARCv2 EM) +; +; /* Actually build the stack frame. */ +; + st 1, [r3, 0] ; Store interrupt stack type on the + ; top of the stack + mov r5, 0 ; Build initial clear value + st r5, [r3, 4] ; Store initial LP_START + st r5, [r3, 8] ; Store initial LP_END + st r5, [r3, 12] ; Store initial LP_COUNT + st r5, [r3, 16] ; Store initial blink + st r1, [r3, 20] ; Store initial ilink + st r5, [r3, 24] ; Store initial fp (0 for backtrace) + st gp, [r3, 28] ; Store current gp + st r5, [r3, 32] ; Store initial r25 + st r5, [r3, 36] ; Store initial r24 + st r5, [r3, 40] ; Store initial r23 + st r5, [r3, 44] ; Store initial r22 + st r5, [r3, 48] ; Store initial r21 + st r5, [r3, 52] ; Store initial r20 + st r5, [r3, 56] ; Store initial r19 + st r5, [r3, 60] ; Store initial r18 + st r5, [r3, 64] ; Store initial r17 + st r5, [r3, 68] ; Store initial r16 + st r5, [r3, 72] ; Store initial r15 + st r5, [r3, 76] ; Store initial r14 + st r5, [r3, 80] ; Store initial r13 + st r5, [r3, 84] ; Store initial r12 + st r5, [r3, 88] ; Store initial r11 + st r5, [r3, 92] ; Store initial r10 + st r5, [r3, 96] ; Store initial r9 + st r5, [r3, 100] ; Store initial r8 + st r5, [r3, 104] ; Store initial r7 + st r5, [r3, 108] ; Store initial r6 + st r5, [r3, 112] ; Store initial r5 + st r5, [r3, 116] ; Store initial r4 + st r5, [r3, 120] ; Store initial r3 + st r5, [r3, 124] ; Store initial r2 + st r5, [r3, 128] ; Store initial r1 + st r5, [r3, 132] ; Store initial r0 + st r5, [r3, 136] ; Store initial r30 + st r5, [r3, 140] ; Store initial r58 + st r5, [r3, 144] ; Store initial r59 + st r5, [r3, 148] ; Reserved + st r5, [r3, 152] ; Reserved + st r5, [r3, 156] ; Store initial BTA + st r1, [r3, 160] ; Store initial point of entry + lr r6, [status32] ; Pickup STATUS32 + or r6, r6, INT_ENABLE_BITS ; Make sure interrupts are enabled + st r6, [r3, 164] ; Store initial STATUS32 + st r5, [r3, 168] ; Backtrace 0 + st r5, [r3, 172] ; Backtrace 0 + st r5, [r3, 176] ; Backtrace 0 + st r5, [r3, 180] ; Backtrace 0 +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r3; +; + j_s.d [blink] ; Return to caller + st r3, [r0, 8] ; Save stack pointer in thread's + ; control block +;} + .end + + diff --git a/ports/arc_em/metaware/src/tx_thread_system_return.s b/ports/arc_em/metaware/src/tx_thread_system_return.s new file mode 100644 index 00000000..61120d49 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_system_return.s @@ -0,0 +1,169 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + .global _tx_thread_system_return + .type _tx_thread_system_return, @function +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; +; /* Lockout interrupts. */ +; + clri r2 ; Disable interrupts + sub sp, sp, 76 ; Allocate a solicited stack frame + mov r3, 0 ; Build a solicited stack type + st r3, [sp, 0] ; Store stack type on the top + st blink, [sp, 4] ; Save return address and flags + st fp, [sp, 8] ; Save fp + st r26, [sp, 12] ; Save r26 + st r25, [sp, 16] ; Save r25 + st r24, [sp, 20] ; Save r24 + st r23, [sp, 24] ; Save r23 + st r22, [sp, 28] ; Save r22 + st r21, [sp, 32] ; Save r21 + st r20, [sp, 36] ; Save r20 + st r19, [sp, 40] ; Save r19 + st r18, [sp, 44] ; Save r18 + st r17, [sp, 48] ; Save r17 + st r16, [sp, 52] ; Save r16 + st r15, [sp, 56] ; Save r15 + st r14, [sp, 60] ; Save r14 + st r13, [sp, 64] ; Save r13 + st r2, [sp, 68] ; Save status32 + st r30, [sp, 72] ; Save r30 +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + bl.d _tx_execution_thread_exit ; Call the thread exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + mov r3, 0 ; Build clear value + .endif +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + st sp, [r0, 8] ; Save thread's stack pointer + ld r5, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + mov r1, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r1, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r1, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r1, [KSTACK_BASE] ; Setup KSTACK_BASE + .endif + + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + + .ifdef TX_ENABLE_HW_STACK_CHECKING + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r2 ; Enable hardware stack checking + .endif +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + breq r5, 0, __tx_thread_dont_save_ts ; If not, skip save processing +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r3, [gp, _tx_timer_time_slice@sda] ; Clear time-slice variable + st r5, [r0, 24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts: +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + b.d _tx_thread_schedule ; Return to scheduler.. + st r3, [gp, _tx_thread_current_ptr@sda] ; ..clearing current thread pointer +; +;} + .end + + diff --git a/ports/arc_em/metaware/src/tx_timer_interrupt.s b/ports/arc_em/metaware/src/tx_timer_interrupt.s new file mode 100644 index 00000000..4c5e241c --- /dev/null +++ b/ports/arc_em/metaware/src/tx_timer_interrupt.s @@ -0,0 +1,238 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Process timer expiration */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* _tx_thread_context_save Save interrupt context */ +;/* _tx_thread_context_restore Restore interrupt context */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, @function +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed the interrupt stack frame has +; already been allocated and registers r0, r1, and r2 have already been saved +; at offsets 0, 4, and 8 respectively. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + clri ; Lockout interrupts + ld r0, [gp,_tx_timer_system_clock@sda] ; Pickup current system clock + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + add r0, r0, 1 ; Increment the system clock + st r0, [gp,_tx_timer_system_clock@sda] ; Store system clock back in memory + +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + mov r1, 0 ; Clear expiration flag + breq r2, 0, __tx_timer_no_time_slice ; If zero, no time-slice is active +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + sub r2, r2, 1 ; Decrement time-slice + st r2, [gp, _tx_timer_time_slice@sda] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + brne r2, 0, __tx_timer_no_time_slice ; If non-zero, skip over expiration +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + mov r1, 1 ; Set register flag + st r1, [gp, _tx_timer_expired_time_slice@sda] ; Set the time-slice expired flag + +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + ld r0, [gp, _tx_timer_current_ptr@sda] ; Pickup current timer pointer + ld r2, [r0, 0] ; Pickup examine actual list entry + breq r2, 0, __tx_timer_no_timer ; + ; If NULL, no timer has expired, just move to the next entry +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + mov r1, 1 ; Build expiration value + b.d __tx_timer_done ; Skip moving the timer pointer + st r1, [gp, _tx_timer_expired@sda] ; Set the expired value +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ld r2, [gp, _tx_timer_list_end@sda] ; Pickup end of list + add r0, r0, 4 ; Move to next timer entry +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + st r0, [gp, _tx_timer_current_ptr@sda] ; Store the current timer + brne r0, r2, __tx_timer_skip_wrap ; If not equal, don't wrap the list +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + ld r2, [gp, _tx_timer_list_start@sda] ; Pickup start of timer list + st r2, [gp, _tx_timer_current_ptr@sda] ; Set current timer to the start +; +__tx_timer_skip_wrap: +; +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + breq r1, 0, __tx_timer_nothing_expired ; If 0, nothing has expired +; +__tx_something_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Save interrupted context +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + ld r2, [gp, _tx_timer_expired@sda] ; Pickup timer expired flag + ld r4, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable + breq r2, 0, __tx_timer_dont_activate ; If not set, skip expiration processing +; +; /* Process the timer expiration. */ +; /* _tx_timer_expiration_process(); */ + bl.d _tx_timer_expiration_process ; Call the timer expiration handling routine + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + ld r2, [gp, _tx_timer_expired_time_slice@sda] ; Pickup expired time-slice flag + breq r2, 0, __tx_timer_not_ts_expiration ; If not set, skip time-slice +; +; /* Time slice interrupted thread. */ +; /* _tx_thread_time_slice(); */ + + bl.d _tx_thread_time_slice ; Call time-slice processing + sub sp, sp, 16 ; ..allocating some stack space + add sp, sp, 16 ; Recover stack space +; +; } +; +__tx_timer_not_ts_expiration: +; + st 0, [gp, _tx_timer_expired_time_slice@sda] + b _tx_thread_context_restore ; Go restore interrupt context.. + ; ..clearing time-slice expired flag + ; Note that we don't return from + ; this function. +; +; } +; +__tx_timer_nothing_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt +; +;} + .end + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.lock b/ports/arc_hs/metaware/example_build/.metadata/.lock new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_hs/metaware/example_build/.metadata/.log b/ports/arc_hs/metaware/example_build/.metadata/.log new file mode 100644 index 00000000..7c78bb33 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.log @@ -0,0 +1,2291 @@ +!SESSION 2015-09-28 16:00:20.788 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 -data C:\temp1663\tesp + +!ENTRY org.eclipse.cdt.core 1 0 2015-09-28 16:03:16.758 +!MESSAGE Indexed 'tx' (0 sources, 0 headers) in 0.003 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.cdt.core 1 0 2015-09-28 16:08:56.869 +!MESSAGE Indexed 'sample_threadx' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.debug.core 4 5012 2015-09-28 16:13:02.280 +!MESSAGE org.xml.sax.SAXParseException; lineNumber: 438; columnNumber: 1; Content is not allowed in trailing section. occurred while reading launch configuration file: C:\temp1663\tesp\.metadata\.plugins\org.eclipse.debug.core\.launches\sample_threadx Debug.launch. +!STACK 0 +org.xml.sax.SAXParseException; lineNumber: 438; columnNumber: 1; Content is not allowed in trailing section. + at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) + at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) + at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441) + at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) + at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436) + at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next(XMLDocumentScannerImpl.java:1433) + at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) + at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) + at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) + at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) + at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) + at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) + at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348) + at org.eclipse.debug.internal.core.LaunchManager.createInfoFromXML(LaunchManager.java:954) + at org.eclipse.debug.internal.core.LaunchManager.getInfo(LaunchManager.java:1372) + at org.eclipse.debug.internal.core.LaunchConfiguration.getInfo(LaunchConfiguration.java:470) + at org.eclipse.debug.internal.core.LaunchConfiguration.getAttribute(LaunchConfiguration.java:416) + at org.eclipse.debug.ui.RefreshTab.getRefreshScope(RefreshTab.java:431) + at org.eclipse.cdt.launch.AbstractCLaunchDelegate$CLaunch.refresh(AbstractCLaunchDelegate.java:109) + at org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin.launchesTerminated(LaunchUIPlugin.java:225) + at org.eclipse.debug.internal.core.LaunchManager$LaunchesNotifier.run(LaunchManager.java:318) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.internal.core.LaunchManager$LaunchesNotifier.notify(LaunchManager.java:270) + at org.eclipse.debug.internal.core.LaunchManager.fireUpdate(LaunchManager.java:1055) + at org.eclipse.debug.core.Launch.fireTerminate(Launch.java:405) + at org.eclipse.debug.core.Launch.handleDebugEvents(Launch.java:577) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2015-09-28 16:13:17.470 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt". +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.run(OpenWorkspaceAction.java:264) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$OpenDialogAction.run(OpenWorkspaceAction.java:70) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more + +!ENTRY org.eclipse.e4.ui.workbench 4 0 2015-09-28 16:13:17.470 +!MESSAGE Exception occurred while unrendering: org.eclipse.e4.ui.model.application.ui.basic.impl.TrimmedWindowImpl@74d228 (elementId: IDEWindow, tags: [topLevel], contributorURI: platform:/plugin/org.eclipse.ui.workbench) (widget: null, renderer: null, toBeRendered: true, onTop: false, visible: true, containerData: null, accessibilityPhrase: null) (label: %trimmedwindow.label.eclipseSDK, iconURI: null, tooltip: null, context: null, variables: [], x: 369, y: 52, width: 1024, height: 775) +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.run(OpenWorkspaceAction.java:264) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$OpenDialogAction.run(OpenWorkspaceAction.java:70) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more +!SESSION 2015-10-02 16:29:55.871 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b69ccb, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b69ccb, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@9f0360, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@9f0360, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@112b637, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@112b637, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ea0b48, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ea0b48, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1eb8e9a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1eb8e9a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15d1204, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15d1204, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@184a296, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@184a296, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1ea4b65, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1ea4b65, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@f6839c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@f6839c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) + +!ENTRY org.eclipse.debug.core 4 2 2015-10-02 17:42:00.298 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.core". +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.debug.core 4 125 2015-10-02 17:42:00.298 +!MESSAGE An exception occurred while dispatching debug events. +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-05 13:04:20.828 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3cdce6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3cdce6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15453dc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15453dc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8e1f7, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8e1f7, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7edea3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7edea3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ffee26, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ffee26, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1149b96, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1149b96, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7c6dda, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7c6dda, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3d31b0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3d31b0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@12a690f, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@12a690f, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SESSION 2015-10-06 09:33:14.510 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8206aa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8206aa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@e8535e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@e8535e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1f4742b, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1f4742b, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b3de87, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b3de87, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@132284d, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@132284d, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15ae856, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15ae856, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15b83fa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15b83fa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3b3ab0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3b3ab0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@55167a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@55167a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SESSION 2015-10-08 14:32:52.274 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 -data C:\temp1663\working_base_hs + +!ENTRY org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d85a18, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d85a18, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1575bad, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1575bad, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1e89472, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1e89472, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1965d0c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1965d0c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@182d1bc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@182d1bc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8d7592, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8d7592, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@19737f5, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@19737f5, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@aa73f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@aa73f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15e422e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15e422e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) + +!ENTRY org.eclipse.cdt.debug.core 4 1000 2015-10-08 15:24:49.427 +!MESSAGE Internal error logged from CDI Debug: +!STACK 0 +org.eclipse.cdt.debug.core.cdi.TargetInvocationException: Can't load "C:\temp1663\working_base_hs\sample_threadx\Debug\sample_threadx.elf"[] + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.loadProgram(Target.java:1289) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.confirmLoaded(Target.java:945) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.getRegisterGroups(Target.java:1816) + at org.eclipse.cdt.debug.internal.core.CRegisterManager.initialize(CRegisterManager.java:138) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.getRegisterManager(CDebugTarget.java:1808) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initializeRegisters(CDebugTarget.java:425) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initialize(CDebugTarget.java:319) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.(CDebugTarget.java:301) + at org.eclipse.cdt.debug.core.CDIDebugModel$1.run(CDIDebugModel.java:133) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2295) + at org.eclipse.cdt.debug.core.CDIDebugModel.newDebugTarget(CDIDebugModel.java:138) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchLocalDebugSession(LocalCDILaunchDelegate.java:213) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchDebugger(LocalCDILaunchDelegate.java:136) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launch(LocalCDILaunchDelegate.java:80) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:885) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:739) + at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1039) + at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1256) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.cdt.debug.core 4 1000 2015-10-08 15:25:33.059 +!MESSAGE Internal error logged from CDI Debug: +!STACK 0 +org.eclipse.cdt.debug.core.cdi.TargetInvocationException: Can't load "C:\temp1663\working_base_hs\sample_threadx\Debug\sample_threadx.elf"[] + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.loadProgram(Target.java:1289) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.confirmLoaded(Target.java:945) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.getRegisterGroups(Target.java:1816) + at org.eclipse.cdt.debug.internal.core.CRegisterManager.initialize(CRegisterManager.java:138) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.getRegisterManager(CDebugTarget.java:1808) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initializeRegisters(CDebugTarget.java:425) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initialize(CDebugTarget.java:319) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.(CDebugTarget.java:301) + at org.eclipse.cdt.debug.core.CDIDebugModel$1.run(CDIDebugModel.java:133) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2295) + at org.eclipse.cdt.debug.core.CDIDebugModel.newDebugTarget(CDIDebugModel.java:138) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchLocalDebugSession(LocalCDILaunchDelegate.java:213) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchDebugger(LocalCDILaunchDelegate.java:136) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launch(LocalCDILaunchDelegate.java:80) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:885) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:739) + at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1039) + at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1256) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-09 15:41:22.142 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.debug.ui 4 2 2015-10-09 16:32:33.850 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.ui". +!STACK 0 +java.lang.NullPointerException + at org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer.getSourceContainers(CompositeSourceContainer.java:134) + at org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils.getCompilationPath(SourceUtils.java:205) + at org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector.getCompilationPath(CSourceLookupDirector.java:181) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.convertPath(RunToLineAdapter.java:171) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.canRunToLine(RunToLineAdapter.java:141) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction.canPerformAction(RetargetRunToLineAction.java:95) + at org.eclipse.debug.internal.ui.actions.RetargetAction.isTargetEnabled(RetargetAction.java:245) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.contextActivated(RetargetRunToLineAction.java:51) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.debugContextChanged(RetargetRunToLineAction.java:57) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService$1.run(DebugWindowContextService.java:223) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:220) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:195) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.debugContextChanged(DebugWindowContextService.java:436) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$ContextProviderProxy.debugContextChanged(LaunchView.java:518) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.possibleChange(LaunchView.java:404) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider$Visitor.visit(LaunchView.java:326) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:401) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.accept(ModelDelta.java:397) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.modelChanged(LaunchView.java:434) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.doModelChanged(TreeModelContentProvider.java:427) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.access$0(TreeModelContentProvider.java:413) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider$2.run(TreeModelContentProvider.java:401) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4147) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3764) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) + +!ENTRY org.eclipse.debug.ui 4 120 2015-10-09 16:32:33.881 +!MESSAGE Error logged from Debug UI: +!STACK 0 +java.lang.NullPointerException + at org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer.getSourceContainers(CompositeSourceContainer.java:134) + at org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils.getCompilationPath(SourceUtils.java:205) + at org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector.getCompilationPath(CSourceLookupDirector.java:181) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.convertPath(RunToLineAdapter.java:171) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.canRunToLine(RunToLineAdapter.java:141) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction.canPerformAction(RetargetRunToLineAction.java:95) + at org.eclipse.debug.internal.ui.actions.RetargetAction.isTargetEnabled(RetargetAction.java:245) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.contextActivated(RetargetRunToLineAction.java:51) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.debugContextChanged(RetargetRunToLineAction.java:57) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService$1.run(DebugWindowContextService.java:223) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:220) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:195) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.debugContextChanged(DebugWindowContextService.java:436) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$ContextProviderProxy.debugContextChanged(LaunchView.java:518) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.possibleChange(LaunchView.java:404) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider$Visitor.visit(LaunchView.java:326) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:401) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.accept(ModelDelta.java:397) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.modelChanged(LaunchView.java:434) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.doModelChanged(TreeModelContentProvider.java:427) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.access$0(TreeModelContentProvider.java:413) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider$2.run(TreeModelContentProvider.java:401) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4147) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3764) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) + +!ENTRY org.eclipse.debug.core 4 2 2015-10-09 17:50:18.411 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.core". +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.debug.core 4 125 2015-10-09 17:50:18.411 +!MESSAGE An exception occurred while dispatching debug events. +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-12 11:12:05.433 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1a045bd, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1a045bd, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@fada78, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@fada78, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@cc9674, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@cc9674, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@120387e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@120387e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d8100a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d8100a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d925b3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d925b3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d46f2a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d46f2a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@754906, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@754906, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@db5482, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@db5482, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) + +!ENTRY org.eclipse.debug.core 4 2 2015-10-12 13:31:22.583 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.core". +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.debug.core 4 125 2015-10-12 13:31:22.583 +!MESSAGE An exception occurred while dispatching debug events. +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-12 13:33:52.888 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@906078, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@906078, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1d5c7f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1d5c7f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@124ab90, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@124ab90, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ef1934, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ef1934, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@11522f1, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@11522f1, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5eba52, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5eba52, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@34f8e2, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@34f8e2, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@2a7429, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@2a7429, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8c837, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8c837, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SESSION 2020-06-17 17:46:26.532 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 17:46:42.545 +!MESSAGE Could not run processor +!STACK 0 +org.eclipse.e4.core.di.InjectionException: java.lang.NullPointerException + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:259) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:107) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessor(ModelAssembler.java:335) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessors(ModelAssembler.java:297) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.processModel(ModelAssembler.java:98) + at org.eclipse.e4.ui.internal.workbench.ResourceHandler.loadMostRecentModel(ResourceHandler.java:197) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.loadApplicationModel(E4Application.java:377) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:252) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:632) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.NullPointerException + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectLaunchBar(LaunchBarInjector.java:109) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectIntoAll(LaunchBarInjector.java:84) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.execute(LaunchBarInjector.java:46) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 26 more + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 17:46:47.752 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 17:46:47.787 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:46:47.787 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:46:47.787 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 17:46:47.806 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:46:47.807 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 17:46:48.173 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. +!SESSION 2020-06-17 17:47:25.082 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.core.resources 4 567 2020-06-17 17:47:30.736 +!MESSAGE Workspace restored, but some problems occurred. +!SUBENTRY 1 org.eclipse.core.resources 4 567 2020-06-17 17:47:30.736 +!MESSAGE Could not read metadata for 'demo_threadx'. +!STACK 1 +org.eclipse.core.internal.resources.ResourceException: The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + at org.eclipse.core.internal.localstore.FileSystemResourceManager.read(FileSystemResourceManager.java:907) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:904) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:884) + at org.eclipse.core.internal.resources.SaveManager.restore(SaveManager.java:735) + at org.eclipse.core.internal.resources.SaveManager.startup(SaveManager.java:1587) + at org.eclipse.core.internal.resources.Workspace.startup(Workspace.java:2399) + at org.eclipse.core.internal.resources.Workspace.open(Workspace.java:2156) + at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:464) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:36) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:419) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +!SUBENTRY 2 org.eclipse.core.resources 4 567 2020-06-17 17:47:30.738 +!MESSAGE The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 17:47:33.892 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 17:47:33.922 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:47:33.922 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:47:33.922 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 17:47:33.942 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:47:33.942 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 17:47:34.252 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. + +!ENTRY org.eclipse.cdt.core 1 0 2020-06-17 17:47:51.232 +!MESSAGE Indexed 'sample_threadx' (1 sources, 0 headers) in 0.18 sec: 60 declarations; 165 references; 1 unresolved inclusions; 0 syntax errors; 105 unresolved names (32%) diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 00000000..8cdd960c --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -0,0 +1,16 @@ +*** SESSION Sep 28, 2015 16:00:26.42 ------------------------------------------- +*** SESSION Sep 28, 2015 16:24:47.48 ------------------------------------------- +*** SESSION Sep 28, 2015 16:43:36.06 ------------------------------------------- +*** SESSION Oct 01, 2015 14:52:43.41 ------------------------------------------- +*** SESSION Oct 01, 2015 16:50:35.31 ------------------------------------------- +*** SESSION Oct 02, 2015 16:30:04.53 ------------------------------------------- +*** SESSION Oct 05, 2015 13:04:34.94 ------------------------------------------- +*** SESSION Oct 05, 2015 17:02:39.29 ------------------------------------------- +*** SESSION Oct 06, 2015 09:33:29.71 ------------------------------------------- +*** SESSION Oct 08, 2015 14:32:58.71 ------------------------------------------- +*** SESSION Oct 09, 2015 15:42:00.42 ------------------------------------------- +*** SESSION Oct 12, 2015 11:13:19.78 ------------------------------------------- +*** SESSION Oct 12, 2015 13:34:17.27 ------------------------------------------- +*** SESSION Oct 12, 2015 13:59:21.03 ------------------------------------------- +*** SESSION Jun 17, 2020 17:46:46.45 ------------------------------------------- +*** SESSION Jun 17, 2020 17:47:32.95 ------------------------------------------- diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1443481736829.pdom b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1443481736829.pdom new file mode 100644 index 0000000000000000000000000000000000000000..ffd8c301ee2edc6e93a98e243042325dfa390832 GIT binary patch literal 225280 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 literal 0 HcmV?d00001 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592441271034.pdom b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592441271034.pdom new file mode 100644 index 0000000000000000000000000000000000000000..7bd45dd91c760c4ad8004b76ede45ebd99e3dca3 GIT binary patch literal 266240 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
>SE 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Ð#ra%;; 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 T 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 literal 0 HcmV?d00001 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml new file mode 100644 index 00000000..36c65ec2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml @@ -0,0 +1,4753 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml new file mode 100644 index 00000000..c4b91cfa --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1443481396650.pdom b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1443481396650.pdom new file mode 100644 index 0000000000000000000000000000000000000000..82293280e086b25ad314df45265cf14f14cb7f53 GIT binary patch literal 749568 zcmeFa2bfjW^)|kz_dZN7cV<8V5fpoc0Y-WWMKDpX!!Q&XW^iUe?1K?Y?A_S08%vCu z*rV7&G{&w(lXx{6v7;hYod5gowa+>GoO|!!_xqXu^L)>j4X4am?_PVYckOo0Jw@HE zkOq9H)Pze_!h-u$!r09!A@pyRFr!^140uc>OkIKf$5q1O@01#Rgi5HN!yGDM$)kF! znhJ63FqIH`63c6H4C{m?AL#vr(2edfXD4CtYRIoq35z1mq5q?8!s4#~Bm7SVPFOV3 zrz+uC-=F{e+*jY_%8$hW#GRI{Fj0Mrx@s6+uPgwYDedSp{*@#i^QcyrF*FAUZMHy z-GG?|_7c;C-rgSU=U^EifB*lz*7m;@v_F>LovmHVmb7a7YhmxM#{LcPfBXFAwysuv zpm&|;LE=#0_K?4;j!|mg*|>6Yru^N@e7&PxaMa%qyCPM32K4+K%RyKYa7ks-xBG4$ ziS4wKeWsRve%6FnR_%Ir#?^yo{a*4Uf#AeZvajR%`oT?eW*$0!QCsVQ!$u!Cta1A2 zVUt_Cn`bw7whn9VY#Fwwy=B<^*5>YI@NwuuosoXpsdqiXmIA$)B_@tlYSRNsy^W=J zJ>2*v96qe6aptV)O*6vd!eQoPTvJX`2}#Iv`Fy2*R-;riBzs(-RM#(+O8ywjMy1wF zRO<9QfxR5d4Oj*%HR@Em1vj3p^ zK?fmTRvdej`u07QP=lP>zwc1))M<9HN|$?zRqol?zl0^}yejcomBoEs?x(?WJC^D~ zDYwhL5P88_n^P`$9n~~;{FLyRrqPpTP@R-}o>lIZ*uPPWbl#+28D3fcV)12{cb!t- zVEN0do}W!q##p79@~*bZyA}KQNO{bgbf58)<;CL3F7Ga-zTT?TiDl5scD~ir8^^CZ zta9$hzB%h+o}|}R8cXf7UOuGM5uYk`#jZyG=5V;ZqrH7uTbuCqpy*G02HQVkc|rVO zo@AvmwElIl>-})Jxx2e_(cER-t>N&%fv%cxIJ6=(2u)q=|6#=t(SW~gKi4X?Azi79 z&NsO2;qdXxIyF?+o9Dz19!Pu{%e$h5d6ExcZ-RUrKi2u|2+@$^n>*XX%i5Q9wayE( z=WXi_hiQXolYerLe{EVri4>&-|(B*&Um7gSsxz>48Hkp1yk4JmD(%y*V zNkZ#pKgzydr*zYAT6QGq8l}`VPCeKX4v(EOYcx4<_4GsCPF1R8Z=>fvg<3$nz5Xak zM?xi}k2L~g=+TXS zyXv8*9Lv#yP5R8(6*2xJZzA|3$4n{n4PUn1Y$!-aK5y*a5Dw3nIYyg3WBk-9nui|5 zdOx%kw8ccU&*USNDrMV01q=H1|8&yh@tsNy{F73H4pC}VzEb0U3!7IfwcAFF%eyEw z4DE9d^vlC<#P-jAixMX&)i4nGKU4{2u)BG%QoB5?66#PlhOJU+%%#Y41-1i}+Ote4 zC(Mo(H*V9wHOflDmMP`e3YLJk2zVHd5<37sxwD|UA*IYe#T7SVOG4D#* zm-+3FnE!PxIc2#()rh%iPcz2}dbCk(6*ZkF)(`ppIn!16%YNsZV102+L-r z((cD`wBz*CmD+W>QaOmtPn~)rp3l^sbRGIhX`=}PRBEClPkJ0O#G&8y#)8|u{>+UH z_#?+Uy=?e;SpH0&i+X+@bi9QH`b~X1;M%K9ecPw8^0bz}T~_|;)q{^Pbu4)=U`_jy z@%%^Bw{UwiPc{0iZ*QP4`ar3VSRdGbZx2stWMxCr^$qhmwo#@e^j%57GBJ;uYUUSx z)whUJpRZ>QqkjkV%b%hjv8Mi{ud!gvPue0v=1HtldMNF^4|YA;x`OA)p>VkSgr%(= z^D&p={3*2JpwN*ynHkMpO9s{-**$bYTgTkywj;aiLk%lJ^+&cldxwO11e0?l?Pr|% zR?;TeJ63GaxJ}{NO^p-7hs~NYTJ!O(*qfY#ehRSUBEd2b#+gk1Ww*EF0_a1X*2k}c zAGa7kI$Lon*gg}!gxZ^zw1%2H7j(h7z+Cb8*5<{Wl!=p}P;};SLxY=Ndx!FQe)5@D zzz_n4uz(?A2jjenaUMN==J?6ev|l@nU+CYG%diMk+m1Pa_;n-l-DWa5riAH2$NYoC zp@xRgibEL>=M1H}ZBcXAz!gJ6BEuGaOyjIcGsCl{jA@!aWAxPNP2p+N(eKO|KV|Ho zgZhd~GWwEFP(L(}W*$1OafSqE#u1Z8O`SA@ek60;drEN0-c(EHO|CQZQ2O8N340^P zcl2#ZuS#3c8b+G>ZH;JkhhP&9GUo%fp3x#Z zZ>G_+J={2R=HB`s`@ux^4;VB1-G}8S>;qSVbJs+kKcSQ6JdeKqCz8tt#`WZpO3_B9 zq`$=A<47$^=m%SL{J_W58R1cl)0 zs~I#Q<#?TZfxt>H!hR2y+z>v_Q{Ml7EOKo>cLaZSecA*FL{OJ z)z@p@_!0f*3Y=s#x3!wfHGTG@$rzi~AEneQXg}sWf6k<-qZ=nR;cAT(tNXj;6JZDX zWTxa*vgMk2Rkb<)4c5g%{V$`QJ#F3 zIBpyLLI?{#m#Q)c)sJ?oymwk$Y!>QPq@ zz9wI={mA!ivak7m^GERA)jh9m(Oie_zWK)a|Ho*nC;!f^cQ_rGG=3DuF5M5@f$}k* zWJ+KZJf@yizB9ZQ{8hJbU!G#_9G%Ntg4WRSxDW$6 z=1ut0%&Yq<=UJsbOjhcvFN_~soO1B@I_O(t>3Nqm3j^S$I(l=|R1oWH|1 zT`#{0j~Rcs?S(1lC952k`<|4;yh%fMejP9QA2@&eIp(eCLv=m;e#)##lSGI1;~h)? zhuDX|Ow5x!Ru847-3%PKykpV4(BMIPpt|eii_51 zj?;dO6>j{$K|R(ZnB+}9-JD+r+nL=zW6l{_YxL>sU%H$bvqq0@nlZy1?*TWM=Ov@A zm7=a+x=g9_wQ{-<7RUN?GvrsToTQYnSDCtqj#xrbZ4&1Xt6 z{KSN8^+?0#1`N*Qbxn6q2v|-^fmKcw{%$bkAa6?lo!9de^ic0TtrCi$NBVU$kANDj zALoTmyix{2=P=QaJSyduonNm@*&X^@C6DNDYwPal>h5&(54QC04V`AL#5@@xM?as@}(u2NWTkD0Ijnq2Zwsp}mIhx9@(T z14G02+jB}`lrXQNpy1cbBJYCO&yO>Fr!#RiPw^J6O9Agvn=B4bs zA4+Lg>YekInvD9d=fPiur5u?Kcj*bXu~3(Xw(6F5Jj%OBgw&B&r;4;)a=qU_H*d$U zb)3Nmu3M&@itBjWm6`%SG>oYyF8%p7SYE%6+bxr zx_7-W1^&KQHdmq6hxvsQ4{hJQqK|nho1^ESDR*Pu@`+$X-;%j)t*8V@ zTHl?bFXbWl`T!Pi%)~rZ4;X!n@4uJK?d~|fW#GW$TNXBVhPycc4GDD(3AGOrzq^LC z50SjSdi}UkFK;%-$LtSz8zYP6vX{^pO=*Az>F5iItxt9JdqJKQvyVj5T=<0tL z`adxCBhMiBdXu()A9R5_`RtD<_0m>zT=y$l|6x-aCyV`X&W()_gl~@bgewBKUOY@u?~LxH@^fQrpm$LW%8ur7|TUUTBuUwJOF)e>Yi9& zd#X2INy4y`+WQL1&yeG()jFTX${yD%6TE$tr~8THmUVQ?QC@#aJ;W@fkoRC8+f>Z` zQqj*2_ypIo55fYjQ}@BL5X&|A`_D@4lZk8L$0&8+RJ(-#-M-7m2+>1ZOiG%qk`sOY z!Y-y%gO$Hx_`9RCb%_Y!Kk&6?fj@3}Xj4q|(WInimE^A%<3#f2xk_zipmbur*kzsO zbz7TTF?{vH@RNGD$znFCb7Rzt{R8#F!p>AcEyNUFVLn^xu7n%Jee_{$4tUc(NOu}XLKwM4|$!RT^-)A~7#^v#5?bp^eH!!}qoG#eZbDTWp@5`g(a=>2u z`P-|>le%0fmWzZ-u;@o3rk}YIe!%urolE3*;!n5!;&|$%`nXC3)=MiJM|yw6Zm%~Z zFBh~=x4c^=6OWmc^sF5hmbcnq3|9V%QC=`Emm@D1w0pO_`;0CeGb!nfU|jAM$xR^# z!tKgNhDgU{i*r6>>3vMFsUXYb!|7tWza3)SX1b|A+QhrEAJDt3eG#V$mfn{Hm-?XO z!(S;m)Vmh_C;C*~f8+YVs{I^&))ozA)Y1WK5)%72CYr<2UYff*=F0&+uI7LvjLE4u zzjTtuZNrTPOZDlF$KU&c;O{7=%#>c0oZz!(ol+N|{Y53%le(6j*gG&@k|_rUwdq#g zyCH4Bnnqe|<-?xIHKgI?OL8*TGFup%?rl-r@qkVrLurelJiv;EJ zwHes2-JDV{V(^t_#y#3^%1mty^7R9LU!LLVa`$M@m*9(WHV57Kx$~2>0qCKk_)5z{ zwiH*BQ*Xnq?ela*o%WD6QZW2I%-Dct?T=?#p;A|yIfADVdoXJJK-yRAw{IKHk-Ixg zJTsc40w(H+I{c-LLAG*FoAwL8^Skz$xN97`#IzE@M#a5HsoZ@0c6Yy0MIT_<1kMoq z!d-BVj5udiU@_yLSK3dv*NgH~p)RKq*JR#6XL=pBn0u8igUzU~_2_30ISX@+Ph{?v zg}*Zo^~z7W1=kAD7IVJBZ;;pEx5y(^LIbwtci|fSiMaO=(5n_Gbg2+>Nbi{eym>W?g)M;CyTPF_V7G_xrI`*GJvK^lr#( zlKv%8JL1+y#3gO9r_Hf%ZnNAV>cgRLOEcqoRK1NDKQ0noY4F?Fns%B>^Yue%r{G>N z)310XV=oE)_B8r&n%@s;SGwi*Zpdzxb`L)=b#(2!4B5``w8iyIA|}4Zk2LUOd`e#$j4#If`Fo2V-x~dT z+70ygF~7gtISlIX!VmWABcuCu`tg*fEy|CGvF}~M@E!+aLk4aH_SZkmElxAzrKb^l zY)7}yzL)*>+1D{Qq&FcDu&_~Qb$KR#Z+P0G>~rcBaeu>tzM3ft7cqWp)nb(fzm2UK zBUHNIkAGwA+AcWXn)T{V`oTga>H2H>1Fv3@XMep)2R!WyPg|6I#t)7A2G~y>{azmK zIlO2b#@ICU^ZIzOo<_vq^fHli>@YrMEMdLk?*&_QKgQcd-DJM%@SUfNLMdr1a4mVsP*u^UR*aSw?sVYBVL3stj=$}#ZTeb+ zqb~z#SXWO?neW+Q3?Hh z`p5xwyu#=6b9O- zCf2ia{q}6boeB7%pV;2@c}?V(?`J)2aqR;~O!UXtkiFjK`(Gm0 ze0~hvjVk-AAfIm{FFWjDV*R?5_P_17e`{x}Q^9&SWTAd}9=QB|hHQWL6h_%^{M7x^ z`#5)M7Hrh`6EXD)wlk%J7h`Kq8OPIzk(+sg_Olnb7gWyfK|e9RpK!BQ<6kjOf1{rp z{eEr)rzPM~pq}ERg7*DKqDr zz`*VeQy+QzBaga%8-vM{DKqb*px*~U*5A|R?$Msz z24GYVT<%ptZZTeYq~jsrQEgJJQW5^#<2XFf&}#zQD3)reHE)zbP}nB52QK)Txs^ zUG5(3IV8q)ux(u@bal&55-vY;fSvB9J^}qs#xMQ-&i3%4?v7@y82wHwCy88mz~$#E zWIJ2R*2jbVI6M+}K9*I2jpEV9T>{*%;@~2tUohh{`)%V>{@g193GR7pw?ekIMJ~brE$uDzUzO0{%0zEdHf_Wd!*S z0S14a6qiThz*A<9Ap68s09P0X7cu_f{Evz8F+LRhHc-DZcg3}XD+T9U!@tZ@`Zvh( zPoIY@3-%xBL4OZLHsAQ~)9lqR;&4uyxtqx2`b*sYSoVm6ix_{87I|jK^{L&oD|m|;xPVa zP7q|DxY@v&bM`)Qm;+?ajH54N_&HtV{4K?BP*@b?XA$NavFbbc$vlGmEDrKB|3~w4 zCbAzVHgFx+AL20g$!r&FpE%6LGBIajii^7im>w+GXjn8ZV)(gHBp~uHP;aO#9a^E6{0f=7cu@m zEAmY6ZG0+R7WDTnl~8+(;CyS=hg0b9J$`?;hTGV|hccf}7W})MRz}ChmPKf3tDz^Kc5J zlMnZA;QndhdgmDw_>TxbStW8P6Zb|M4hq)=`T16HKw3UE7YTr@u#hsj%3qJ^{h zG4)pCaQ>f_X5qHZT{hobn6&-KLLJJ=ws1RulRrJa$H)QxMsGMR$`6d^S#?UC0&b%c zj%5{q@2rL>zMT$yr+kk?c3dBDQe3`?!}y=Iiy-6jO&rGmEO-3J{9;E8zKO&5pXHAK zz{TR5xI?h)W0f0=Z{kK_G4ms_F9zS8qK9!boE9|)`Nr6MiZhXSh~buek09Sa^YgtW zJlE+Ud)F7a_1o?v-FksBFbm_qlj8DC9LE2wnSzYVH*q*I$U4Ht#o(K``B=<+O6!Zo zH*t%xv{?FL@l6~$qpXD%E>`_E{X6eHF`O3NANV~h>lEBGJ4^KV*5rE$`40U4ulbf5 zzEi#*M0RuTPTldwnJnUdh2?ayARdm-$!A@NYbD(d4%HU#$7x^Ex@0c(n|?y$E(7*F z3y0q?g7;Bq9LE1Fcl?Jw{4TJ#^#q;K(N}N)Fc|-{Z?N>)eD|P_y9LWyoWuM9zjHnh z{J((*oaf%f)mYFz3Ln9}{)<&Y1LlKOSK>Zkw1bK}Md$x!?T#NfmuBMqJtn5bxKGdb zyI0z;`)J@WxeZZ zi?Yudhlq<{Str;i9Avz|ILnNsBbGlpFme4UN48v7Q{4KMOuj;&<}2F9W65M(b1 z&bNji+4=ONKIli6KQ5WLSvL@u;mC&T15S#v&xs3hL$LH0WE3u9{1_{8`0dzQ)*kfZ z0Hr#wbxO3h^kWeHI4G7MRy<<(F%j8Ddb*u|PKhD5wQeJee_jWMf&$@zsoay&t>)ftZyf2bdmfm%t zTNCiZYk&T)!2##z{lq3*2GU2hK4;v>#ylqb0lN5y`6 zuPT3xzoRQHy;0hnx{PN+TR`F@UiBQgX8_k+0WtkEYo)jFPN|4U8t}hZ%zBQ!M>bqzkT-evvMD*`>>5`AL>_5fv3%>U-MeqJC@+E6Yrc- z!O$OLL*)rpeaP8Ea%m$hF_}S9~W}4(2R5yGW^ypKd#fNIl8fTjXqa#@5O^ zY(FQ9oMAA}W>&tZQv807Q0lvM!THwkGiNvY+35FkhvOyty)5w)&rNcqb^V-$Y=?Q; z9Q&jEByJ*>(SmhwQGWhR zkM{fdJs*P;v>VUSXfpWk`q_?bEuKbgKl()+*2#y%K$vrkInMjhfa{V!y?XmgIl%h@ zjIC9>2HVv#m5>`RUaj=wc)uUpt>?%$Wa|O9QM!6BUg(c=PBzA16W0&oR$?*p9tRiY z2l`N^9DEJT*jja_T`zAFImf-6d(oc$rmC(B#_JNib8?yBeCs6O|3p78^ZU6?o_i-2 z*C|>tv7nbJ-{Jli`zEAJgMl4#q`{Rn@gY z-X6iV_Bn#{ty#~nC2xWI|F<3A(%qpir|9+!-ZWpd!L7ga?CuVZUkFO9G(1Te#3qu7h@gtRev0ab8e|hP;ZMK-V@ND^=6x2Gyap`?dVexkD3CT-*KX!{FUtkdA6#l5Artx@8!TbL{!3f zo{Qc^1nuv@S2U0E%5wK;Kd%qu9v930HsbJn+5k*P zTnAkKSr5(JMR2ZGz2mkoGv?>QUt>efTekf@l26-@eZ-*VU$j4B{J+7H-wgT53I+$_ zgTCpMrGoRV(LQr`rGMu~`RCkF$Z=fvz^M-+OcEt~o|$_WvR~?HjcP|udn4{DEEfs3 zPaON2%j4i8#&7t_lnb7XZ?)MrZ?}tF^M?K09#var^Y*+Ye*yBFRqgN~Z*A1yfF zn!NG6KKDUCZ@6zQY;Mr%U0>|-hU(!G=hlzcko{3lYg|5vdlHN3ANs^S3*6(PGYS_m zyunu{#?AOvd#H6iB=@f(*Sujr_jXk~$>wc`C(mR1ctO?95Aufd`@0GS=UbDvHRSEx zDBheK+kCubMDv!Hf$Z;lTBH0l^-bgc4eUP!+b8Zb;Qkc{*CYLEbvItAc@36Fl&Zzt zyZSw)YSNVop?=hrV|%1$(@(kQv~zOJl#BXcxUKE9;)eH`>BP8kA91Wb$BJ8Ce@i|P zm;_aOb0BVc7~@jk5}a?%xUEOr@(TTN+rs)T72X%Okul=72eOxWTI0rpxN0o@1luPL zV|N~Y&tr?0*7&$$6T>`N?NV? zNTSD#XmZA%Jj~bfe&uP8>o;*1VlmefqWpI1ANtz7%dos@%Hj2u81v0M_{>B;jgO%P zc6+>DqOwsBY$`K>y^VFILCaaX^lIb zbLiu7WWn`_yl1ie&eIx~H{$+))=Zx-UK$cZ+Ms&!~1r+&V0;hy_u+ zMGPPCfr&gDo9l+ze0(5s%?I}Lo>Fy(T72ZgCnn1CQz8GSs+$(%;|rCLwM1~fHQU$4 zNW+<3VC zcMojm-107L_rSeExc*Z;19r-;7)?YcK2^*jf#}E66XMKhpzqyutKIDh0`dxzYo2=Bx#{}nFBYyb<7{96h_-%6Q zf1AV)?~mA7{4oCKAMR<7Hy`2ei}}C6f;j|JpSWXyo1e_DmFbSZ z`NxV}^N0QXQL6q7o4PX0r|12{vSbpaenXv#=@wSjO*rqA-^a2 z`Nh1(yI;6ym25^XLH#Gz{3riWk!$|{2wb~rC=T+s8o#BPI1AdW!C(IQL<+{emVUp{diSu;JQzL-vaipg6$LcE^uZJ z5rvBwUf?TJ{?o2+4YO@t&|foYUa+74N7b;{YPSXG+Z}lU=5hJ&tA?H+ZyWGTImU>n z#CrF8^7f6NH_RKo`=E=xc8gyqou{iD-UtA0mvTmwCZs_#&aaRFQ{MumTJKYF8VnVjT;PHy^V{$k6h!10k^A#v+pC1 z82-Qs6XRz%Xn4WqZ=T3Ce+z-jQ4QY*`5UR!z4?Okty6J-*EQsCl%GFbZ*(3s>5Wu9 z=ZqWfIiEFvxb<);)QtDE$K{c@DOfO$GR5VQIE>wR=-0x<;E}jFSf*Jxn@6Yq6L%Dr zSr*Q|ugk{G1@7k-&b~i9V&Vd>nHWdIZT~dux>X^$H>;#OfX{eRrJ5%()Br;AR( z#fTemIR7s=%fiKq8*!NP6r5+_V#STPUt_u0!o`XkxMnIqeK6eiUtq`WW|8Z-U>~vT z-(kn?HA{|hsNe?G|M6hlFus3>z9}j(ZoHqe;68uca3144_|hAxj?vz{j^Ax>|Ad-{ zyb|KZjW}EjC_w+p6gO_ft-aK1I;_7dav zajdxM7WZT0#`nk;eCcVAHx6sux4?cT*tobcz+n6@+;1ni9$+v}D@32dz~9h_Sh255f7?sAmP=(cj5_e>dUv zfxK@V?;zs)H|qF)BK&VeX4lWT$Tr>67G=NVCvmf}nBNon#2pFTOwk#Iix@sm7CHGd zJ`FD5`TbhBkS6zy79vn>*Lt?Odu&&H{=YEr{J-NbF7n0ow+Gq4ualzebNnT48I~o2 z>=Sn)aGh~*5##UgMP3LVjZcFo2mL(@eQmMeeCrg%m)GM8&xwlf(zZq2OPjkF;(ZXe z;{J0+SN<6VZk#dB6k_~$Qe1zCy9|pv{yRBj>(htvztA23`@mff+!ZGOhCXmN183%G zQTFvUJuvRoR@|VdYpSEK=r~|r19xVAt@XviZ2|`K%%U&ECyo2QdEPvy-t+yo z--PG2@Jo}6@mw+1VqZG%ldY4l&nKG^La=de$_D&_gs39$J& zd7oIK5omk1hnvjn-`xI9^WYo*$wN0jeB0X1td2cJ8KS5V{F*X%8_N4^ZF{!Ee}gl{ z$_7Rh@w~WjM=-8kt=;5&PsAy$sSZTQ+wrXamvz^1g7)a&+bsK>{)jmAi-o;XWK^6Y z!fR2z$k`@L+Px#dYf&+D8Jq*sTl&HK)QU>t_%S@LAG-ZjdfMXop>ZJ;Q6|{9ejFrn z;!WE9{-7Vb;~sU3I|oSP3tylgf$@Jc#zP&CMe+R@foyxbn&QTzh`0l=>?zo|e#{g( z>!GoAXlBrl!*CDJ2VR-(9^PUh8uzxDDbZYyyEbUy>(YdJm1g{-w9D1Ch z7TXW29Ysw0Fyk7=3dh!A4T1i)gEq{|I5N)1CD=Ch-G?sBi^@r{ii@U8%i zS$pAJX|GGLVE(n&Em&~=RD>A(RLS-C1<_c9xsLH^&!ItopTWCnro|{3<5|%uxP2DC zKD+#K9M~R4#n?k0pDjJxpaN_F1+OUh0Sf<;g+SCI_nfQkBb=lz7cs5{4qA{J(s@&SmSLG z#{ccc4?&wX?c@6viazu6h4Z^kOh7sTi?$C?j3xZOOwk5Uo3uZxT}8ycVl#hZ`!Y7{ z-OKYe+df?1-{6h2o>By{@D139an_9|`w6kHi}pDQ?}Nv@K))D5A2RI<^C+p`=uld_ zTHCvc^Ub5E?^`|JTGZa^zFu7V`R|>#jf01X@uyr$r2od|ea;H_Q(TI7%?@-d3vN^N zy%DZIte>0F{ugz(bSyo=E9X$jSDf$a8nu65oG9*(nBN!FkH3?Z>VGJC+ttt8#&Fw- z`iX3C(Ixrx`>J@p1MVhbjIZgW7ynV0_DcI4q0qE67p)e7`;{H`gv+s>PSw5ip}0q> zqrcWL{|a$?uZ?j#-EWV47o;tWF&n?zuHti%Jd;msT$xY<4ZLT?wR1JHpY5rQveT)r z#GQ}D%neLjqu%3FOxz_{aBjz>aWU>&(m2cyip@0yN1uD&O~mvw*J(A1d>RhMo^Jhq zR=h^!^r`qcy+8InmFc@LsrU|jdt z{=R^|>(sbQgZ#aMd!%EHo8<3t^7mRS{@Pdp4S((jb)xt~y)IrSHgFx6KjQv@1#=7+ z2Y;jZBklt%?^w84{1NvtmiH`NEdIa=6XN19Y9h_57 z-FC@&!q?$tEektamYy)Mamc74qX#+qw&_2IX#EkXU*v?T7Eqll54aZU5L zKX6~D2}uF|`h{?>`Ek?|NH~A$mj?d&1>XN7{og$4|MFVbnBLFfj#`}luOG(Ne%2f% zE`P-Bj%9$@5SKsVFw*t2$Nw1hsvmr1BHzZh2~(_ot>0{sYhHc%BSnvIO_q`z-th3Q?N-@3*bF0Bfq>kHZs zzpvVl13l8Qh+)+E2;0ZTaClBvYfE@Z2PS@kjfpeuXkn+_js)+ldwb9(*wIX%NHjRF;9`mPuzfcq3VO%1nonL`1#^IBH zC&+~1=DYNc9M=;P&qLnZjeIfBuE4J&zaDbvt-mXd9J-T!3HfiaeHc?U+`OstbN=GQ z?N*&PVbb?(|A^CfcrVk^wq;#hM6Fle-SFWi*t^P<_lU~U`Xa`k-(&lrQYRr6ObM^+ z+pwiyamsr@WE;O>JwbV!QC?ef`+{)TE9ViEgZTq7Oo_PxUYF2_ryoLlHf`&mG~(a5=ljxqV&vGCKu5;g0r?(AJ_mB>$oMoM z-y1ydr&I&#aq_{qf1)5@|Ndwnsd#VOcx=(LC5qzmbsN z5y(Fc@{^RB0v${h-|%aNmj0QLU#`@MwLA*>5B`3l1iYo(fH~n7kykbc;&-Is7uyoV zAha^T?=eP>Ep>&0^=qDyV_O0pbyo-SFEny&OQ56fk$}9-$gwSfj{2g2e5sLRTLK;R zdj{m)MviR>bktuEke_1Y8z6^{`n!$X8m~&gFVm9s;8kBo3O7z4EyvtAV!SO`f&7oj z@!jq*JllHC5LpK{X51U!-rd^SxojzZNtER3I~V#^V!@Va_gVgNuLLoroVrR-_U@~U z+%E4DomCMVEN{4oyn1*&^jv5TVzc|&82YXi`6}Q{e-9p}PM+2{dZugl?a=dU@Lwj+L`T_e(9>iQ1HZl!8B~Xtsp2N?C+7PzjZs_C;rttQp%E4GOFFsEO(>)!{=q14yuhF6^Dj-JsplQSV# z58718dx9Z$BpxQ@)|G#5#vj z3U4_+b6c_z^27Y)vs^8Q@6hiIrjpKd@l#g-U#NKoko5h zkbHoL$|Bsgbwb*|} zu*{P*+tgou{c7MIE9RRt$mp}i*V4Z#b^LKwIe6X;pMAh3VfaO!*e1YJDfbcoQjD`q z%v1HSbNvGGi+TME$L;ILcDa}j?FFuxbbL&?__gdU*EqItVR2SK3-QXt5yjO-+21my(Fd1$fyON7GO!*u5GM! zj6V6uZRPi)-M5%KIL0vtSr5Q6z#Jr={>OM9ti}xnwqCFrhj!XE-283p8wT920h|-B zh~a1-k(ZUYz9p?T&!@7Dl+6^meh=UroagVYlAaH|2e51;&a?9c=Uao9vLWOp`23#} ztslV)#-_4yp4Pbj5;qx3lVDw(_>% zw2LFU-iseK$V<9(a{ajq+0QTsv5B(N@te4Fu&gxs<$6Q7D;VG30doPCJL2FX#&5)o zsSG?B-;!6^@x{D|NyiuCP}v-n{7f*uHz>7!px}IK#`jF}vf9tfHpaKPn^@l86f?fG zALF=_;>MRa%uVp|3!S2Pix@xuBJwiuXKYPL4aWCjr4~#SoNvweo=ZO-_4^_5)sE~m zzNj~4PkCD7`a>N0=dvdR8|9Bv4~TmK%hLgzQx77>Z^VqL3_Ka%QjW0W`<2Lbd^sjw zrc$m9#uxMFg~tibw?@`Sw)- zH~wA79`>}x^_RGLSTO!FIk*=2(;fHuj_&eBSeixP;BZ){-iV1md}ZQq@5Z;(?`&Q$ zHZo~mE&*b)W51eK&?kO{@}d&k#Tn$~h5#>Y7ls!Z?{WWbg3j*NlV_0a7Eh!0Gsb+roVYu&tQM?` zbNY!M$o`JyJ8)5m1^r)I7OnxIFHReS?ZG&PZQ61y@PYS9{FKS9f8dU(9Pu+;rCn{0 zFY823o-1;JyF{fu7vve^`+1iO&bKDdw~^<+_<7d-PuJ3RfSvDcBwZ(CjLS2*dDYYA z@;6+L`EYLm`&V;3IM0lj`t-HP85d(~+N*45YhfD3V4g3Q{|mAr!THwo<8}J+QM4aR z=XSE|Vn3>9|KpGg`X^R&Rjl*1{!a!Y|Q|}|j57Z?l)_-Gb`Yfy8 ztJqcKy55}x+>m&Lqn(oi^bt7jub=r5uX~?EM6@A)1-Y?tPiBBLQpBW!7*h{HFHv@aNgUe~6W5vP&G|$fm?+b-ve3IL;S5++Ya%+2eU$Vx9J6(HW0~7f&WoCS3?$_kF zUvaC*wY_Wc_em)=rJb#ndw2$-j_V7y_9!bMEGLM)iblkqKci5<81 zMb5ZYqT*IutTHbN#_e^bPBZmY&}Pm4<5BYRW)v@ooW5`sxBsC1?|9mx;^y!{+Fy!E6;INSFa3UO4tK&2eFbi3*Jmor zklpHI#rO4qm;^Hh!d0k};8oYVjJ;CaO3u#CVxX|Vr-vG`33{rm+}upNot zo>pQ(Uo{M4&85G?eRH4T*+S&OcWd=GUq$QxeC@O=))^+gTf=ah`IWg}nEgWKULx1^ zYd_#{-%r0l{i+1@8_*9%CB|htgq3yvxNHgQu<*j!PUCVAvYR;z^~dF#xFJ|ff9m2K zzD<3sBo4J}_{zjM8sD<^x7uChERkzo?g6e?Wrc&hj6z>K zQ*gdDc&QvpUdE_;BhdD0UT|R)jf2mT%lPE)FDo%$s2uNU)A?fbL-=O8szhC?oGaLv zzo+IvP8`})CF&ki6fR=g=K?KO0)YpSomsKhw=)MK75cQ09~A-UwgJ6JC{9GHGD2k!&r z4^=pW$J36keHS3x39crokElP3o%-X{Gva!%&^e^&IN^6K-q*gcxwE+iH~9%naO_Wl z^_Kch#d4AWwLTjcF>%5;!9*U7?^*hLS5`k-i81uSdj;oPvtF(uFINV6VSAO|GdFPF zdzG4z8~Cf<%- zG!dQLehh7psS-RH-?Dw}^?8xAy;fZc+S+>+?59&`Jmqv}ssydr;+J(ou| z79`qYxXQUOFdkNo!ko%nhZeM1gU2dff2bN0qn};W!XH-R@`!%2D#rNVZdAMVlej5Z z@EZb?%cH}058kWxAm*RDfGcpAz7OtS{u=izk5=ju)T8rIw0 zKCr7YzQldcoxeNo7l@ft4)*pS&xuN%34X@zkNXPG=mQ)>l(q-TorZ5u zzoruUqb*Mv76a7BAvcZ}3W)W{#0sC#^v`RmPEzW`?_wxRg8!=-$5Z@q#QUZ&Ug|)` z|9vdZ@1h(0<+$*;z)$JFtE|GFCF zWW`2u?Bq9Msy6CFay-s`XBxK^SoD=l@%+}fAAs9r;bQrXw#7s~jc@tCv)W;GgUEF| z+!eS>`56NL@3+-?_@+%raK1Hp;rVxUL9iYy?{axD_v6j8S+RK84cSXQt?}xE{>}~t z+v;M$#^r_j>abvr!K87qc!94>b+# z+(g0o)|khA$@cVv+d-+(voAp`a)IoJM*4*&8wLo==>O? zsxMVVZv}b7H}Pst7CpW-c&p}pfz`JJ>lwe(CikaX@98$*s?v81xO_c=>=^%@r1^?* z9hTpFt;YCYy_5038a^=L8?lbfcm2PX1kY%Z>~{e4^H z+F$I0pW>l*{NJ_Y*oVI2F}B={dpbYPC92=XE4hMv{TuHL3yU7#ntbs+uGQ=uC22nl zU-~(MAK9+>jo<38Jnb$Y&UujOe>H9+u$W^oxws&2@P(-wJR94KkF|JX{FvxB_p9IK z>&4KYu${_x^ji2+xzqo!Ph!$|j*Hvysw<1fnre~j{%a8AZL0W@V1NFDQonmeaK1Hp z{2DygMfLby$R(Ai2(r+wAn{H>me~QGo@BV%%yom;vFY;iKbK2>Ek6z|!4aRme4G^%i=J-C2 ze$MdwDfP0Q0~Wro;e7Yp{XT;D%e8mCx8_W!`MIMwhQCg`A})+&wqV_M6>NXR&BJnJ z0Oz#79(>pFS-d|0u?^jcefZ9AEaE$v`dfjuTa?NS;kgWRJ|bFvy0u#mQ7#kfz2O*d zZ?fv~sUp|$!9L>IZ>k+X*w3Wpw?Td)UsGh&^P5Dj>+!vi4^sWk4c6oHRYHPwjwU&< zMtp0U8Q%+I#}@-lZ=_t`k1a8E+P=h=dffW_2dKHi)f`=)o%j-mIZ2I~PsEKcaW`VQ zN_4t7C%zHWKEMeR>X+kVzk6(c&6uzG!+y=Fd`*tUA2?&u^7|pbP4#=-mg5+c=J%hF zpU&69c=N#;Q-5^+w;=zG>h}Zl+wJQKJR@i7vuHDG@_!xqe=;`z7`T3P`$E00dEV3R z@-*^0!pUKDHdkn8<(aZjj%rN~YQT?+`ij*Ro%JN0rPE^8bZW2bl3h z&}N+o{95w=RV@DX9fiG-GIu^6YXEe3t<8a&O`dkmKgPcnbI6C=4(zugaBy7?E+V|q z7p5A-%h+DhY1Ql66p?Gcv0w9nD#7oo?)X=mVac%%eI-}f@&-$eb7$x)xj(>LZLv}- zHwwu;bP*Ah1di8kW_o0khMImWu$ z<5X!|ke42O^Z7i%`PSrRA$bYB|JR%k@P{+JKeW&DKlb0XXM0+;pE0h>YTWt2t`e-v zhr?UMv@iI;R15x$&7~LG?dwXBYd)}FyG)hdVDs@OOOElU_ELq%=KbSjEzkdN6r69J zg!ahqywwKI|K&T?`iGMrJ5Q;77i#YEw7dQ~@i*gNs06tCF?Tfmtizw%PxCqGA9FuO z5A>i+ecp2>wtv9ihz<3#Z)blM!nhdPjD7ZrsBb@Ia^|76;G79%I~?ONetBOj&!=i% z7P*ce_G_mZ!zqFAF=R=N7Wv!OKp+b>sf3Oe# z%i3*!_p;>sX`jo^4#YK7jc@xsA~@d~?RvKh>2Kiqe{+7x3&*!8<9St?R zc-pnUKR9-?xYD6ec?kY|kbzd1&5 zzBTGqsDV6N-vRKhSLi!u@cV_^e$0GLt8n=tZ__=kn%@}LZ9=AAhY$~AOWB8Zed-h) z+K=VXIf9Q;`p1C~{2y8FmF4bXTnr7QAA#rprM{To&-)%1_4NRZ|4xeX!>LcFqnM>w z%t^b8bH<5?X+Q9RiS^3ZTwZL)-JJhxf3XjK%KO`KKUMN;Irc-#6&@q?=JBClTXOcT zC#v$9LB7sW>W0~Z^R3C(67qGf+n;DZq#w~weEito8`wTVmw4K>9`q;9FVSv2A?`{n z7Yf$pZMgY6Vt9iuOpJ%Iz5E!vo}kS!X9We4>ldsW)QkBWz>hT+G-~G03iu--=xGg#FN43Xh9iUUX`-}b1x2gi|*S-EwH^`Fjj`9jrg}y#v#l0@1 z)arSH^Q{s0x+L;Z@8?6>pT0qc&j%Ske82N)|ID=j>U8{THw8HHu7gcX-S2Cko~cpwnZy8V^9@f*SU*2&<5_v_ak=(iu^6n?DKH;nhL>yP`zWv1$E z%(yEDxyEF`jW5Qmx=~&!QGS_mtB$y_SVjoe!MXL_#!Uilj33u!ig3!U$M{zFGo|WV zEnJNI4C=rU6ZtosR6J>ogLS_Ux#ko5;J@O}c6|w3a_mDN9s{!KlW{=jUjX?p`1p+_ z$1x^7f4UU>AEYYv`!^!ezU$7?Vrie}B7c~-fFi$LA3K#=vr=%rHO7Ow@r-BG{r@_i z`u%8;DtA2SGmh6l%}JhiCq8cdbmBu?50({z)i`^;W#d)>cS-<O$ei$F| z=!WmRNbGT<}OcrT>go}{Gjd*!N%pE zIGi`s-4nnC`G?O;b%?9+5s#Z#{68sj%@6kLuH>T|7XRRsNy|Tm{4rH|u`U0X$Tj~M z%jz!0t)_wNmvtE5SI4^EM1Jolzk&Pz48Qt*gCF@jP~Eps^S0Q+bzFXl`#Y951RIxM z;@-#dw*W54FF0Xhe2tHl&)EEaCUVUm_UoQhm9N?Snem@;yc1m2eay!PJpSwRBtQAB zuY~*=Rk3Z;F(E3E-+z+d?_-Sza^CVI`K@n2`OxR2c>HP{=7#kK=-^tMzfJ$4 zaXG-Hh`_;hIk<@QpX7vz@ijhH)mr^~eW}Pbf7q}4OjQlD`2%N6S`I3pud2zG;~10X zcOvqCrK)~zo&VO45V_7j8u?3AmHr*n>c8s;V~%UutDwyqeAQ>N&>?>QrGCqOYLQB} z|Mmvp)CbKl?2g0rQ=w)rPrJicn>pl;o5Z0m)bAkzjf>HLYkh|Rw@&~UsNePQnThc- zK31J<)$jVTBG>$2ACC**mTs&5f>S2S??fAczN*V?`LQC`{9_zM9k046P`~RB$9ql} z3eLACzXy`vIevcm{T;sFNPmAv?qBB(#N;&jEYaZdg?UE((Vo`0yb{-fjr08~_2=U~y{13ZJa1}mUC|xxUbLjOQ|tS7=A7{ODKo=OQyNE2 zYSJca+z-t|9Q$?LjJ}S`lzRP3kwoDlrvCspOpJ@+V(1W?XK>3z9#3L>=u|`JSnXe= z5{KVUfV^D|#jDG`INXkMZj*QX5}VL!-d7qi<=+M0G4^%9gML>)e!chI4PO7|_l5W! zqK<)(UmZh^`0+bLE2cqyJ>(CW_pLhmAHqBR3zT}`VaQ*H{A2I?H(LK=upQ@?$6?#= zMO_x6@6FHneFJ{)p#gny3F=GYcjmpoj{awG{MSl-d?v4)d+nqi2R2r_317&pLQ~Ku-hoIVpb^^Zf`bJ`KCzRpU=9 z_3!nD*DcFC+M2uZ8gcyHgP2dpyAf`I-Drnvd-3js797Jl^*MJ)%*H*TROBr@UxxPe z%hT}wmo%re|NXW%BK4!85q>maX%e0Jm&D*@gvic^t)_m=!p(O0YWh5n59Dvaxl+S; zqvx6c|2VG8nT##C%YV$@Up4SJ^ZyJBY|4K&ke|nC=PWEJs{lXhuq4+H9%p{UpEeX+ z9LUe(%zqRXlvP*}$j{@<-;4!i6x>-R z2IwfM3CLF)IkpYZQ8FSRztzaGZGevQM+5RZjU3ws=qP_TAiqcCy$?VR9p$|N`R_2s z-T~Poh~rXxzvvdFdjq%r{~q!;(a(b$rrqyWh1|Mw5od_PYQ^Nhzgm`Tj%w*(zbcH#&a;-v{H&WqAbef6n1HO8+{H8%HYD zv?rxX9W+ZN$C zLck;_)D2v!w(fgfs@1x*g5p-Kwr+K+Tivy;sJK;B+z=Jz|2=bN?sK0c@ayM&>wNO$ zx%avE&N*}DY;)$!+){6!WPGw?S!G>fmA?NeZm)J3oAtD@W3KRc?V49on6GuX_I>zmHxY__m&NW@poO)+y~TSK{sN*UH!~3ypc=Dft~dKBwKhIU-S7 zR#;M2IJZ#z4cd{l#@G<&$~zXjCl&e9yNPM<4%-2*f={|$NP*KCI42mp&#fNLc7an^ zTsW(I76v^xZzj)x|EPA{=Y5|czj5at3Vud`hAJA+IYzI32l4#L>?Z@i@7_XtJ^;?# z!dV5p5OYRZL2kYROUx-ev;cVaz%9V=d~xJ8@vC<0s(&Fn{#(OuNVH&?WVJwG}=Du@6^+nJAX2!-wgMR_M`uO z?Qi*gqW}F>V=eluV7f7HypLR;OS_)bYw~~W0|u)_f!5uvu^qlCo|~CAKGXG=ukYMH z88hc9cbDiZn*|?F=C^+T)u+a$AJ-`(r^eK4Qi=rDpwbIN&V6LS9>`uaDQ z=)FJdf1xYmg_CA0l;Lo>oKx&<_~DMO<^XpFe=b;N>|8xdm4hl{52!@`X`AcEZPJfr zxp@VSdlGX>%FFT!TrEx>80T5p-(Jd4bnK^-(0Qlpd6N?&J8cJH5eEFqm`l&$`wV0L zeipf>rT@=b<24->T-_UjVbU>10Hl+ieBFRD)+w&Jg4vGlosR_PAkkyOf4@g z%1@M(&Mhn{o+A|q{QkEl_2BI9jctXzhcaxu=_1EYFYT(xT9l<%Qs7<;+-zfIoE*tZ zVR2DmaRK23^i6J2;i0(#QsK==Pr@tt7T-J(pwY+ae*En6ZP1^!0Uqtyo~T{1II)zs z`z}v7zgXZYANTu8`FPBOQC$c8+H~wI@;UNpV@AU#Qsi6CL%H)RuRqrtGxv6K*^&E8 zAnoT>#(XuG_wSqpjFrYR?zFApr;axm+i6C4`hWK=?@r0K<0WPBt6#EFnA3AZ+ zK-ytz9)ACgkD3g;GqdSiYqnlCaQ?&k#4Fsp<`F%1eD;l!Xh~H~-8x@spwm;n?Rj|t zn(5rkbZp}E*x|Hqp8meIHGOfoJGR9GjlK0dgQkKO(l6g0wWe}SWnwjnxp{t|}s5NFMbCeGTO*FRT6LjvYdawK+G9?CY2ll>> z?XN0{Z;4%KtNYy@at!r*Js#k_?)$lp$LWz0#!n>P)3 z;@9|+eqJ12Mn*aD;mow*kzXNuPxikh+?|vc`TZ{BCEa(Fz?uGj49+aBElWO^{*!xc zWaEAk{4Vk9^u@-^Mus-kNxNvT^UKr&ET4ln$lK!z2p|PJgU=GtaUQxn-P?A7+W)l} zU;I?(t(wO_z(b}7G-LhVc^;ngI~86Ye&^hRBt&W7A7L$>4{Ivx z*3?wT`S3UB-B~S?_dEUwcwmDHjw7!UUEtas!y~_-sGvR`_-V;@F9MHCll2a`L$?O^ z{6pv;n_9KF(((OQ6>I8NCD>-L>gbBPO7~C-9v6_a_ck_yZzrGciF|r`@cLfCBtJa@Jt{vORf^yYB7s+2An( zdPPO>0EdCVmy+>9gp)1H2anFCjr=ZjDP}Ea(0lVvMMmXEaan)#SYB6S_k~v@Ju;_YR&MEx zlCnl{a5Y1(e!%Z|hr)Smn>&{iJNpyjARYZUN%SjuYSrSLQi6P(!`NfcmB>2JMZX7n zVE-$RH|902MfA}4LgVznPx16HS3PFT!VX%e{BJwm^K*TFL(WtDX3oDzEU7n~K|mNs z!E1m2QtKS}n4WWH%l2XI(BbN*%6;8?8{7Av?mm0KbayT%w#{+)>*F*YP@fNkU(>%f z=HiL&Ip_l(jf@v$JOB<>-Z>(rzn;sXE#n`1WjM(b{u~&WlfLMom_N|9Hu9?r*dwN*8JI;bCdc>EL( z|3Au{KyK%CYA7a1-7U7k_eBV?*M*S zC*$6C6~xGM+_^ic{SD@GyXq@L%yTaE9`dl>cOv8Qpj*%<5#I(xQ|R$B@=;;z9% z-CK+u{A*+Wi9huavV8DEe-_XDEQNNCq~GV?<7&5TF6YiUv$J!EcYhok7yPt1E8q~d z2c0&3C+!@qR|22Da)a{e`}9@+FX5Z-z2A!efKIU82kZS8jE;1K?M^?oTNk%es}}vT za&es-uZldkQF$IP-#u$fSMW~Q(twdud)~h1&B!fF;**7Ma5|R0<9M z#p_+<>s^kFXCO z2Ec)^jE1@<_}Kmpz{Y)&SG4DA$8wvdK@hCF7bL#cF)+-!}MAGzaiIhp!F7& z6r&fUNWFazG`8h>V;qU__-l6T@7cK8b z>a@(5Hk;XzaSoqnz#p3YoJHC-@Kf4xyD`trWB%(wV>=&=%)e=R96(k|3cc=dnAp;Y z$K`xOE~-)K^?iBNFsYX@tnJ*(J!8gPfIYxZ*ji|(lj@@TyT!-#Zd?$H7s@!bg_o~~ znLC=K^(6np)&m~X(>YO7XNC#oEG^PYjGg2I3xf9uIPB_1ew^0F2| z^0_6axFfV~SCg#$=QbB*)(E+M5HKc)FPZ9~yHHwnqjDOP90f#G_^b zDT`{4zfL4dA$5ZJr0K<4kJ@Q|FDZ@x?BqdW2|G^G`X(&a`}x0MC-WUnZ+icBz-R87 zo%J~M6#rJ@&V|K!MdkSg2^Uz*FPJ8iS>9Kcy9M9jCC2<`p^FQElA|$78Olp>U@qBF?VnVT!Zh_ zow4gWVps6%XF0~4@((k1lIfNwcucz+9kSWjyp~G0KW{X4^mnF1rqHeaxT3y2=J^pX zQvX6@Zhk_apNkwnGShUr!qFXm^mNMTC>R;@&h>&9bdvb1<_h~6_`Defc{2+|Ckb97 z(L+O@MaSQYZbo)Coe6zveVm-@(ymWu`F7!ZeU{H0{}*QL8Ky^`>(?)it*u+KqH58Q z2AAI=Q z!{~L!Bfb9V^KXPs@i;K`4Mx6RzQvd)kr&aY9NT6;nFE)Y=8}Kx^mspHN9KX2bakXL zYl}?xQ%(ED@%cQx0*!N!>jwEQ*R{xddDZym|8Uu$`@4lZxp%4_yZ+mWcvq~h8iG7D zI$jF>LkwVEJ7eC0pY=KVC%3eabQdZ#=J}D#ho7^0`Kp>q-eXiAE4vV#9X$eLMyn?v_PHdJ8%`{;XF16ge8a(3orPGo9`+ZLn+f+t%93l@)t$m!n54 zZW#Qg3(z%-rp4Oj;cdwA@__#QjC*c+#&mjK zfKwt=<2T~6$VOd7_2NqCC?)XYg`Jq|@UrB7 zZ>$|jc3-`w&i7AP7mfV%3H1fN@C5CchfNsg+adfmJW(!AUet~`0*$=F{`#GHllDnU zJ9br9tgO`Q5x)2*=?Cg>^53;LKF)+r75$9Ke@O4yaSb^(zewKS_Ag;xIQg3#MfG0- z9`_`#Y5lTfWz`zV4cWaOeQ-M;#@2(ek68=2pW}=_@NpcMeD-HKVjLwg={wMwQqEya z)$F~0~JaMC*JAnLqX@rlv7hr!1I|$~IQb5dp7_gK$@!^+KSj5m6Pvg9dLeTb za4rH4zL%rhm)cJ;D2^|V!|se4u5boFM;-&`QUC?fBi|nD<%*N_+88ncs@S6jy@|fw)Mw)UrN892%KBtamI^|PNJs^i)R#& zvnzT|4Dm7Ow6#Ct7jQy8iaCz+L5Jd>e!}{>3VuIM>-}HaU8-a5ta2|z!n|U}QKLO4mg>ZWkj_4eUZFP=*cg0Sy5nl|B@ZYkURclr!^M(Td zJp`Pmjd^CMha>si&}~jRd7UobWscJaUHiEhtSxQd;BJK_@w^UQ;`vE#Ue--+ zq|ohOzl({r$=pUeUnjOl54rn9UlhzLohyt1!|kR$1GN#h zlRxLwmR-i>ke}h@`H;Uck8?cZr9>}_9`7<#)HLw-axEc(sQsa^~{! zC4zxaNTFV7 zFqQ@SNxDjYzNf3SVW9e#w)IaO`!<#R7I^XesQP(8UJeHKHRcz`Qhzt!F7f;GLgJCO z!?lYx4aC+<`B30!8*SOIiA6+tUwS?KkN4X^{G@Mb?~lY&B0ZH%DAGrSezav^j-H;< zMbA02W%y3Xd^XWj_59}09&)C;&`;IR#@eGoonPSfl4}ob8R)xhDt5@X&6c6-Q}Xlb z=aB|D2a`jBjX#u_Ld5TLiV6x!!B*Nq8wOTsJ2Lpqx5<{(5hL{Zh7uPjy@#0cNwNIN zQ2#vWiY(21AVx3ECy~}@#S8Td&F&VLtDGi^N~TXIUSw@&5yAKsC*Rhl@w=vC_^YJ_ zWsF{DH@Y;4``Y9eY1-ItgE|kFn`DK_BuM`rfwp`x{&peu9@I_e@I0k$TRdl{IO}JYaV@ z`j8rY<0DGYQ7Q0fyv+Ny&ISf@#a>liqK|;Kb(-#IAf^adbu1ii$-mNHD8g zRa3F7QsK8{-PV`X$vi?+bfzmpH{mhpD~0^Nkeg@AMgixB_lVm@cc}7zoXOV zD=TYjfl`~Osa#xHb+oKc7JK`nPr7myD~ypn-DBqDMtbQk0vr$n_x$l zMD;2O5o&*IU%G}(M3Sy1^4DOT3(X1_!LQ^hmAuL475q#1CX~U`0;D|XG4UG*El2ilbP#Ml@cJJepfNw*&(CKn zJe&Rr_&keDJ*xMl@Wqet_&<%EaEY`F`iZ|kr#vqYe@pnG8h;s|&Xzu^-v_**b&Te# z<09_|J3l(vPs5^qO7h>QfM$P*`Cf1`}_e< zztg%9w_HPdIsGvfgP>y0O_0@g7e4BC^w^CE^5@mH9ZG(2+G{_P~J-hV8h_oy&G)*H2_KmHBBx%P=(oL*K^UYZ0b@Um`>8t0Q*?IJT`@?)buZNe`1scQey*DY$6nKn3 z9(#@XFMNgi@cd{Bc?XZTz(e(DSU8&?funeOeEo#81C7{~IDcMCjB6ib?tjk16aLip zP19%$zq@#OGET9F^e^qFw#N25iZM+>+a~{0+J`K)>~8GT)gGR#-%R>@j;7Lovzx@^ z?-pc#L$ba$-}?Bh($n_)*q9f8m%N?=?|z=;v#zs;C;jK*BMjc~cO8DfJL7Wn^>D3Y z(N);9!eo8zuZzWLk@vhj*00RhJTCWqoSsh`^V6SN|_Ey)UG32ab=>adg&^r zQ0rWKgiqnX%!z{2xDR9Pl)MF5f)(eR_Az(^(c`US@aCk#oAxDRq6LhR;14M& z@aU7x|6mEVf9n_I{*Bv6yz*YkekuzNo{)-AT z`rY?$*0tn=p<_n|JtuOhensd;N7v`c<%{}pD(yTYs?XjsEQ|-mKT5Gz4gBvca2d3a zSOk3F?1#={vP;>#+`=N=BGJ*6d7B8{4B&a&091R+J~8{aJvmNy+P~J*JGAe9=iA!- z|LEbVe>yi&GQZe$A{9D#t7GsE2HqXX_T9WSz=Lnl<8I!xKjV-py(gs~pT>9if?UNQ z7t%gI8526u!K;YDI|O(S#o*oR=S_Y8l?^gxNo)KQbh(ric-a4b-x{+bjAvvXnzXkB zbEpM+yVG-7uadvT*f{HN@HOpYylpa(r9qtIo14t1{LMeZmuqiXti6YVN6i1Y`TW%O z&P+3A%L_?FQri0+ehK4u_6|+TNnSxA8)HmonQUG`K{Cwi;O58RB7a$*MfKX7t7H0( ze!ci8?DJ*BKGOA`INZUlfXm!jcF;fKw-y%9BW*H2;o&=Yqhs)v0uP$|VsDP(CdkQG zDRSa&NrA^0LDu@eN#8hqAnReKu|B$-)qK*w8oEU*d;Vp%r(sU+m4jV)FS} z<=WL%HSFX^T5H9UU-FW{+7!67UDn_~2Y)-bvW`*hv{=tM31Y?g>nI!1x3oj@I?+QK z;=^Al$&)qQNhKus?ZJ-~?SB!x{hO;9ljB#&v6S6gG(T-HKBnYPO1|%(W-XZ)IR9QNyP#7+9b6SBXY?6D~OdUmem{#2?*50p4Knmiew8JMpo)k^l0cpYM7Vc(2FcT?#y8)fcVvw}|<;13U5zHbshqhg}=|7lkM7{Kb0OH!lfq=-(VXTRf3?S2p)@-50xQ zq>q<12G85Ex^rlsr-|UtpW}xssjq~w@ep_|)OXQWo?hHEbfbqm1-QAuMQ?`tHtp~I zONoZ(<~e;r;AXeb`ied>cGga=T^g!0_M#L0I9cFc;o%YkEiUA~ zE0gza{50enM8CO%m>#n2Kc&5g>-F7R&<8@_7d5WB>pkotFgoAj`)NJxM;?a2r$c^W z%;ism=RS=2zaoEwI*Lx^cldkA-Kp^YS7%N>WBy7pzRlo`QSEl)3$b~I`uqz=3O{u` z%9slu)MujhzKi{658nLz5cauCk&k=OcJ^10{
+
+
+
+
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..1798e6706730f839c93114672aac9f45c89d9531 GIT binary patch literal 421 zcmZvY&rZWI4949KAx;yM#(@*s3z)U*R(77?h^FxXC`wEk(KeBj!TR>}&kkF~!3X>M z{F6UN01&rz8^hePMv|p*o=~cQ(lWuFQ?_~+6~V%b%9ZpP3MQdWn5?&HmL+MPELRzJ zwiq7Aj7ogBunzR3jF{7D}pL+lvgYx~C=m}0~!ZYU;Z_m|R)6^x-sDPKPNH2b~(QNao>>&L} zk<_;o&QV-jK5a+K%|pI9$O4Kq!3jh3fnvI25Sq}C)h5Bd<@KzRKi&lXtV$;HYEdoV QX~QSjv$9=xx9q;KfBKJNf&c&j literal 0 HcmV?d00001 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 00000000..25cb955b --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..bb2b32afa658f1391499f1ee1e521cb9127b5258 GIT binary patch literal 104 zcmZQ%U|?WmVAN+|Vq%cWFG|--P0q>$;?eHE=kNSVBj@0wKOm_HZ!p_H8wT}0JgLo@&Et; literal 0 HcmV?d00001 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 00000000..6b2aaa76 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/16.tree b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/16.tree new file mode 100644 index 0000000000000000000000000000000000000000..cf82fb3eec1a1ec114a682ea778ab663fbafbe87 GIT binary patch literal 38178 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 U!<`t5vuz|vc0pb!v(cab3zb-dumAu6 literal 0 HcmV?d00001 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000000000000000000000000000000000000..856fa638450b8d21d0f5a58f25a1a331e5bc3b9a GIT binary patch literal 517 zcmZ?R*xjhShe1S2b=vdAllRFf=Oz}Hq!uZZBqrsg@^UGMr=}=)mF6iJngfxQsfm@L zg+hQ!h=P%UkpVAPa!zVukxOb$Nn(6{QMz7ga!zJJajIT&N{L=_eo?AzNl_`#5FDyf zQj<#4^-43Ls!~A4xK;ge;`e8;hXX(NRPQc7=0MW`NK4EqCL#o&%4ib=P{Z+r0RRexv?u@o literal 0 HcmV?d00001 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..9531fc3c --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +org.eclipse.cdt.debug.corecDebug.Disassembly.instructionStepOn=true diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs new file mode 100644 index 00000000..c03690a1 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs @@ -0,0 +1,7 @@ +columnOrderKeyEXE=0,1,2,3,4,5 +columnOrderKeySF=0,1,2,3,4,5 +columnSortDirectionKeyEXE=128 +columnSortDirectionKeySF=128 +eclipse.preferences.version=1 +visibleColumnsKeyEXE=1,1,1,0,0,0 +visibleColumnsKeySF=1,1,0,0,0,0 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs new file mode 100644 index 00000000..c002721a --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs @@ -0,0 +1,5 @@ +activeConfigDesc=sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default +configDescList=[sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default] +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchMode=debug +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchTarget=org.eclipse.cdt.launchbar.core.target.local +eclipse.preferences.version=1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 00000000..db7c08cf --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2hs.exeProject.1700533761/com.arc.cdt.toolchain.av2hs.exeDebugConfig.585788724=av2hs.exe.debug.exeCompilerDebug.1743110770\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeDebugConfig.585788724\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.asmDebugExe.1483523628\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeToolChainDebug.1358823635\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.arc.archiver.886382681\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeLinkerDebug.672502322\=rebuildState\\\=false\\r\\n\r\n +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2hs.exeProject.1700533761/com.arc.cdt.toolchain.av2hs.exeReleaseConfig.2024992869=com.arc.cdt.toolchain.av2hs.exelinkerRelease.934772409\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.asmReleaseExe.813382130\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeReleaseToolChain.202924782\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.archiver.990750758\=rebuildState\\\=true\\r\\n\r\narc.cdt.toolchain.av2hs.exeCompilerRelease.1463268267\=rebuildState\\\=true\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2hs.libProject.1128858457/com.arc.cdt.toolchain.av2hs.libDebugConfig.2063275274=com.arc.cdt.toolchain.av2hs.ArDebug.1591578035\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.41800372\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libDebugAsm.1626881776\=rebuildState\\\=false\\r\\n\r\nav2hs.lib.debug.libCompiler.2145942775\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libDebugConfig.2063275274\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libDebugToolChain.1385404397\=rebuildState\\\=false\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2hs.libProject.1128858457/com.arc.cdt.toolchain.av2hs.libReleaseConfig.1202427021=com.arc.cdt.toolchain.av2hs.libCompilerRelease.1920721386\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libReleaseAsm.1207600374\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.ArRelease.217147730\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libReleaseToolChain.1456119623\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.1382145468\=rebuildState\\\=true\\r\\n\r\n diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 00000000..5e2da66d --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..dffc6b51 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 00000000..47236716 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,5 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.localCLaunch=org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +eclipse.preferences.version=1 +prefWatchExpressions=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 00000000..f2a15ec2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,10 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +org.eclipse.debug.ui.user_view_bindings=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.BreakpointView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=\r\n +pref_state_memento.org.eclipse.debug.ui.ExpressionView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.ModuleView=\r\n +pref_state_memento.org.eclipse.debug.ui.VariableView=\r\n +preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane| +preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget|org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 00000000..61f3bb8b --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 00000000..76ce67b9 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,5 @@ +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1590536495337 +quickStart=true +tipsAndTricks=true diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 00000000..08076f23 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 00000000..60e7be60 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,4 @@ +//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false +UIActivities.com.arc.cdt.debug.seecode.ui.activity1=true +UIActivities.org.eclipse.cdt.debug.cdigdbActivity=true +eclipse.preferences.version=1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch new file mode 100644 index 00000000..d8303802 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 00000000..c13038c2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,11 @@ + +
+
+ + + + + + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 00000000..c22cfeb5 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml new file mode 100644 index 00000000..2e57abac --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml @@ -0,0 +1,14 @@ + +
+
+ + + + + + + + + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 00000000..5a2b8bd8 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,1828 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.SearchActionSet + persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.ui.CView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.TaskList + persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard1 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard2 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView + persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet + persp.actionSet:org.eclipse.cdt.ui.OpenActionSet + persp.actionSet:org.eclipse.cdt.ui.CodingActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation + persp.showIn:org.eclipse.cdt.ui.includeBrowser + persp.showIn:org.eclipse.cdt.ui.CView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.cdt.ui.includeBrowser + persp.actionSet:org.eclipse.debug.ui.debugActionSet + + + newtablook + active + + + + + + + + + + newtablook + + + + + + + + newtablook + Debug + + + + + + + + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.viewSC:org.eclipse.debug.ui.DebugView + persp.viewSC:org.eclipse.debug.ui.VariableView + persp.viewSC:org.eclipse.debug.ui.BreakpointView + persp.viewSC:org.eclipse.debug.ui.ExpressionView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.disasm + persp.viewSC:com.arc.cdt.debug.seecode.ui.command + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.memsearch + persp.viewSC:com.arc.cdt.seecode.errorlog + persp.viewSC:org.eclipse.cdt.debug.ui.SignalsView + persp.viewSC:org.eclipse.cdt.debug.ui.RegisterView + persp.viewSC:org.eclipse.debug.ui.ModuleView + persp.viewSC:org.eclipse.debug.ui.MemoryView + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.debug.ui.executablesView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSet + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt + persp.viewSC:org.eclipse.cdt.dsf.gdb.ui.tracecontrol.view + persp.viewSC:org.eclipse.cdt.dsf.debug.ui.disassembly.view + persp.perspSC:org.eclipse.cdt.ui.CPerspective + persp.viewSC:org.eclipse.cdt.visualizer.view + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt2 + + + + + + newtablook + org.eclipse.e4.primaryNavigationStack + + + + + newtablook + + + + + newtablook + + + + + + + + + + + + + + + + + + + + + + + newtablook + + + + + + newtablook + org.eclipse.e4.secondaryNavigationStack + + + + + + + + + Standalone + + + + + + + newtablook + org.eclipse.e4.secondaryDataStack + + + + + + + + + + + newtablook + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Help + + + + newtablook + org.eclipse.e4.primaryDataStack + EditorStack + + + + + View + categoryTag:General + active + activeOnClose + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:&C/C++ + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Make + + + View + categoryTag:Terminal + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history new file mode 100644 index 00000000..e2d080cb --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index new file mode 100644 index 00000000..e3eb0266 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index @@ -0,0 +1 @@ +1592441257832 Delete resource 'demo_threadx' diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 00000000..aa267842 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+ + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 00000000..50f1edb3 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 00000000..9c5013b7 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,22 @@ + +
+
+ + + + + + + + + +
+
+ + +
+
+ + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 00000000..c8e48664 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,30 @@ + +
+
+ + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 00000000..373b8d71 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/version.ini b/ports/arc_hs/metaware/example_build/.metadata/version.ini new file mode 100644 index 00000000..044ab217 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/version.ini @@ -0,0 +1,3 @@ +#Wed Jun 17 17:47:30 PDT 2020 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.6.3.v20170301-0400 diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.bp.args b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.args new file mode 100644 index 00000000..020c9022 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.args @@ -0,0 +1,3 @@ +location=_tx_thread_system_return +condition_enabled=0 +cond= diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties new file mode 100644 index 00000000..8e467ac1 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties @@ -0,0 +1,13 @@ +#Debugger engine properties +#Fri Oct 02 16:50:37 PDT 2015 +ARG_ACTION={"location\=_tx_thread_system_return" "condition_enabled\=0" "cond\=" } +docTitle=break_dialog +LOCATION=_tx_thread_system_return +on_push=bpsaved +TYPE=either +TEMPORARY=false +OK_ON_ENTER=1 +OK_ENABLED=1 +ReadingXML=false +THREAD_SPECIFIC=false +CONDITION_ENABLED=false diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.cproject b/ports/arc_hs/metaware/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..e782f2f6 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.cproject @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.project b/ports/arc_hs/metaware/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml b/ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..c63b0e46 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..5a03f35c --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); + + return(0); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd new file mode 100644 index 00000000..6c2dfb8a --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd @@ -0,0 +1,54 @@ +// +// This is the linker script example (SRV3-style). +// (c) Synopsys, 2013 +// +// + +//number of exceptions and interrupts +NUMBER_OF_EXCEPTIONS = 16;//it is fixed (16) +NUMBER_OF_INTERRUPTS = 5;//depends on HW configuration + +//define Interrupt Vector Table size +IVT_SIZE_ITEMS = (NUMBER_OF_EXCEPTIONS + NUMBER_OF_INTERRUPTS);//the total IVT size (in "items") +IVT_SIZE_BYTES = IVT_SIZE_ITEMS * 4;//in bytes + +//define ICCM and DCCM locations +MEMORY { + + ICCM: ORIGIN = 0x00000000, LENGTH = 128K + DCCM: ORIGIN = 0x80000000, LENGTH = 128K +} + +//define sections and groups +SECTIONS { + GROUP: { + .ivt (TEXT) : # Interrupt table + { + ___ivt1 = .; + * (.ivt) + ___ivt2 = .; + // Make the IVT at least IVT_SIZE_BYTES + . += (___ivt2 - ___ivt1 < IVT_SIZE_BYTES) ? (IVT_SIZE_BYTES - (___ivt2 - ___ivt1)) : 0; + } + .ivh (TEXT) : // Interrupt handlers + + //TEXT sections + .text? : { *('.text$crt*') } + * (TEXT): {} + //Literals + * (LIT): {} + } > ICCM + + GROUP: { + //data sections + .sdata?: {} + .sbss?: {} + *(DATA): {} + *(BSS): {} + //stack + .stack ALIGN(4) SIZE(DEFINED _STACKSIZE?_STACKSIZE:4096): {} + //heap (empty) + .heap? ALIGN(4) SIZE(DEFINED _HEAPSIZE?_HEAPSIZE:0): {} + .free_memory: {} + } > DCCM + } diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s b/ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s new file mode 100644 index 00000000..da17b687 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s @@ -0,0 +1,328 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; + .equ IRQ_SELECT, 0x40B + +; +; +; /* Define section for placement after all linker allocated RAM memory. This +; is used to calculate the first free address that is passed to +; tx_appication_define, soley for the ThreadX application's use. */ +; + .section ".free_memory","aw" + .align 4 + .global _tx_first_free_address +_tx_first_free_address: + .space 4 +; +; + .text +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + st sp, [gp, _tx_thread_system_stack_ptr@sda] ; Save system stack pointer +; +; +; /* Pickup the first available memory address. */ +; + mov r0, _tx_first_free_address ; Pickup first free memory address +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) _end; +; + st r0, [gp, _tx_initialize_unused_memory@sda] +; +; +; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */ +; + mov r0, 0 ; Disable additional ISR reg saving/restoring + sr r0, [AUX_IRQ_CTRL] ; + + mov r0, 16 ; Select timer 0 + sr r0, [IRQ_SELECT] ; + mov r0, 15 ; Set timer 0 to priority 15 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10000 ; Setup timer period + sr r0, [LIMIT0] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT0] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL0] ; + + .ifdef TX_TIMER_1_SETUP + mov r0, 17 ; Select timer 1 + sr r0, [IRQ_SELECT] ; + mov r0, 0 ; Set timer 1 to priority 0 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10020 ; Setup timer period + sr r0, [LIMIT1] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT1] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL1] ; + .endif +; +; /* Done, return to caller. */ +; + j_s.d [blink] ; Return to caller + nop +;} +; +; +; /* Define default vector table entries. */ +; + .global _tx_memory_error +_tx_memory_error: + flag 1 + nop + nop + nop + b _tx_memory_error + + .global _tx_instruction_error +_tx_instruction_error: + flag 1 + nop + nop + nop + b _tx_instruction_error + + .global _tx_ev_machine_check +_tx_ev_machine_check: + flag 1 + nop + nop + nop + b _tx_ev_machine_check + + .global _tx_ev_tblmiss_inst +_tx_ev_tblmiss_inst: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_inst + + .global _tx_ev_tblmiss_data +_tx_ev_tblmiss_data: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_data + + .global _tx_ev_protection_viol +_tx_ev_protection_viol: + flag 1 + nop + nop + nop + b _tx_ev_protection_viol + + .global _tx_ev_privilege_viol +_tx_ev_privilege_viol: + flag 1 + nop + nop + nop + b _tx_ev_privilege_viol + + .global _tx_ev_software_int +_tx_ev_software_int: + flag 1 + nop + nop + nop + b _tx_ev_software_int + + .global _tx_ev_trap +_tx_ev_trap: + flag 1 + nop + nop + nop + b _tx_ev_trap + + .global _tx_ev_extension +_tx_ev_extension: + flag 1 + nop + nop + nop + b _tx_ev_extension + + .global _tx_ev_divide_by_zero +_tx_ev_divide_by_zero: + flag 1 + nop + nop + nop + b _tx_ev_divide_by_zero + + .global _tx_ev_dc_error +_tx_ev_dc_error: + flag 1 + nop + nop + nop + b _tx_ev_dc_error + + .global _tx_ev_maligned +_tx_ev_maligned: + flag 1 + nop + nop + nop + b _tx_ev_maligned + + .global _tx_unsued_0 +_tx_unsued_0: + flag 1 + nop + nop + nop + b _tx_unsued_0 + + .global _tx_unused_1 +_tx_unused_1: + flag 1 + nop + nop + nop + b _tx_unused_1 + + .global _tx_timer_0 +_tx_timer_0: +; +; /* By default, setup Timer 0 as the ThreadX timer interrupt. */ +; + sub sp, sp, 160 ; Allocate an interrupt stack frame + st r0, [sp, 0] ; Save r0 + st r1, [sp, 4] ; Save r1 + st r2, [sp, 8] ; Save r2 + mov r0, 3 + sr r0, [CONTROL0] + + b _tx_timer_interrupt ; Jump to generic ThreadX timer interrupt + ; handler +; flag 1 +; nop +; nop +; nop +; b _tx_timer_0 + + .global _tx_timer_1 +_tx_timer_1: + flag 1 + nop + nop + nop + b _tx_timer_1 + +; bl _tx_thread_context_fast_save +; mov r0, 3 +; sr r0, [CONTROL1] +; +; /* Fast ISR processing goes here. Interrupts must not be re-enabled +; in the fast interrupt mode. Also note that multiple register banks +; are available and the fast interrupt processing always maps to +; register bank 1. */ +; +; b _tx_thread_context_fast_restore + + .global _tx_undefined_0 +_tx_undefined_0: + flag 1 + nop + nop + nop + b _tx_undefined_0 + + .global _tx_undefined_1 +_tx_undefined_1: + flag 1 + nop + nop + nop + b _tx_undefined_1 + + .global _tx_undefined_2 +_tx_undefined_2: + flag 1 + nop + nop + nop + b _tx_undefined_2 + + .end diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/vectors.s b/ports/arc_hs/metaware/example_build/sample_threadx/vectors.s new file mode 100644 index 00000000..c6cbc893 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/vectors.s @@ -0,0 +1,29 @@ + +.file "vectors.s" +.section .ivt,text +;; This directive forces this section to stay resident even if stripped out by the -zpurgetext linker option +.sectflag .ivt,include + +;// handler's name type number name offset in IVT (hex/dec) +.long _start ; exception 0 program entry point offset 0x0 0 +.long _tx_memory_error ; exception 1 memory_error offset 0x4 4 +.long _tx_instruction_error ; exception 2 instruction_error offset 0x8 8 +.long _tx_ev_machine_check ; exception 3 EV_MachineCheck offset 0xC 12 +.long _tx_ev_tblmiss_inst ; exception 4 EV_TLBMissI offset 0x10 16 +.long _tx_ev_tblmiss_data ; exception 5 EV_TLBMissD offset 0x14 20 +.long _tx_ev_protection_viol ; exception 6 EV_ProtV offset 0x18 24 +.long _tx_ev_privilege_viol ; exception 7 EV_PrivilegeV offset 0x1C 28 +.long _tx_ev_software_int ; exception 8 EV_SWI offset 0x20 32 +.long _tx_ev_trap ; exception 9 EV_Trap offset 0x24 36 +.long _tx_ev_extension ; exception 10 EV_Extension offset 0x28 40 +.long _tx_ev_divide_by_zero ; exception 11 EV_DivZero offset 0x2C 44 +.long _tx_ev_dc_error ; exception 12 EV_DCError offset 0x30 48 +.long _tx_ev_maligned ; exception 13 EV_Maligned offset 0x34 52 +.long _tx_unsued_0 ; exception 14 unused offset 0x38 56 +.long _tx_unused_1 ; exception 15 unused offset 0x3C 60 +.long _tx_timer_0 ; IRQ 16 Timer 0 offset 0x40 64 +.long _tx_timer_1 ; IRQ 17 Timer 1 offset 0x44 68 +.long _tx_undefined_0 ; IRQ 18 offset 0x48 72 +.long _tx_undefined_1 ; IRQ 19 offset 0x4C 76 +.long _tx_undefined_2 ; IRQ 20 offset 0x50 80 + diff --git a/ports/arc_hs/metaware/example_build/tx/.cproject b/ports/arc_hs/metaware/example_build/tx/.cproject new file mode 100644 index 00000000..18edc3d5 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/tx/.cproject @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/tx/.project b/ports/arc_hs/metaware/example_build/tx/.project new file mode 100644 index 00000000..863ca5cb --- /dev/null +++ b/ports/arc_hs/metaware/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml b/ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..e071d37e --- /dev/null +++ b/ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/inc/tx_port.h b/ports/arc_hs/metaware/inc/tx_port.h new file mode 100644 index 00000000..b531615c --- /dev/null +++ b/ports/arc_hs/metaware/inc/tx_port.h @@ -0,0 +1,338 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARC_HS/MetaWare */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Remove volatile for ThreadX source on the ARC. This is because the ARC + compiler generates different non-cache r/w access when using volatile + that is different from the assembly language access of the same + global variables in ThreadX. */ + +#ifdef TX_SOURCE_CODE +#define volatile +#else +#ifdef NX_SOURCE_CODE +#define volatile +#else +#ifdef FX_SOURCE_CODE +#define volatile +#else +#ifdef UX_SOURCE_CODE +#define volatile +#endif +#endif +#endif +#endif + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 800 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 2048 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARC HS port. */ + +#define TX_INT_ENABLE 0x0000001F /* Enable all interrupts */ +#define TX_INT_DISABLE_MASK 0x00000000 /* Disable all interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 VOID *__mw_threadx_tls; \ + int __mw_errnum; \ + VOID (*__mw_thread_exit)(struct TX_THREAD_STRUCT *); +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + +#if __HIGHC__ + +/* The MetaWare thread safe C/C++ runtime library needs space to + store thread specific information. In addition, a function pointer + is also supplied so that certain thread-specific resources may be + released upon thread termination and/or thread completion. */ + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) \ + thread_ptr -> __mw_threadx_tls = 0; \ + thread_ptr -> __mw_errnum = 0; \ + thread_ptr -> __mw_thread_exit = TX_NULL; +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); + +#else + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _clri(); +#define TX_RESTORE _seti(interrupt_save); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define ARC HS extension for assigning a hardware register bank to a thread. Note that this API can only be + called after a thread is created from initialization. It is assumed that interrupts are disabled and the + initialization code is running in hardware register bank 0. It is also assumed that the application provides + a vaild register bank number to the API. */ + +#ifndef TX_SOURCE_CODE +#define tx_initialize_fast_interrupt_setup _tx_initialize_fast_interrupt_setup +#define tx_thread_register_bank_assign _tx_thread_register_bank_assign +#endif + +VOID tx_initialize_fast_interrupt_setup(VOID *stack_ptr); +VOID tx_thread_register_bank_assign(VOID *thread_ptr, UINT register_bank); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARC_HS/MetaWare Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/arc_hs/metaware/readme_threadx.txt b/ports/arc_hs/metaware/readme_threadx.txt new file mode 100644 index 00000000..7f7e1716 --- /dev/null +++ b/ports/arc_hs/metaware/readme_threadx.txt @@ -0,0 +1,251 @@ + Microsoft's Azure RTOS ThreadX for ARC HS + + Using the MetaWare Tools + +1. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace, which is located inside the "example_build" directory. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply select the ThreadX library project +file "tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the MetaWare ARC HS +simulation. The instructions that follow describe how to get the ThreadX +demonstration running. + +Building the demonstration is easy; simply select the demonstration project file +"sample_threadx." At this point, select the build button and observe the +compilation, assembly, and linkage of the ThreadX demonstration application. + +After the demonstration is built, click on the "Debug" button and it will +automatically launch a pre-configured connection to the ARC HS simulator. + +You are now ready to execute the ThreadX demonstration system. Select +breakpoints and data watches to observe the execution of the sample_threadx.c +application. + + +4. System Initialization + +The system entry point using the MetaWare tools is at the label _start. +This is defined within the crt1.s file supplied by MetaWare. In addition, +this is where all static and global preset C variable initialization +processing is called from. + +After the MetaWare startup function completes, ThreadX initialization is +called. The main initialization function is _tx_initialize_low_level and +is located in the file tx_initialize_low_level.s. This function is +responsible for setting up various system data structures, and interrupt +vectors. + +By default free memory is assumed to start at the section .free_memory +which is referenced in tx_initialize_low_level.s and located in the +linker control file after all the linker defined RAM addresses. This is +the address passed to the application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The ARC compiler assumes that registers r0-r12 are scratch registers for +each function. All other registers used by a C function must be preserved +by the function. ThreadX takes advantage of this in situations where a +context switch happens as a result of making a ThreadX service call (which +is itself a C function). In such cases, the saved context of a thread is +only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 LP_START blink + 0x08 LP_END fp + 0x0C LP_COUNT r26 + 0x10 blink r25 + 0x14 ilink r24 + 0x18 fp r23 + 0x1C r26 r22 + 0x20 r25 r21 + 0x24 r24 r20 + 0x28 r23 r19 + 0x2C r22 r18 + 0x30 r21 r17 + 0x34 r20 r16 + 0x38 r19 r15 + 0x3C r18 r14 + 0x40 r17 r13 + 0x44 r16 STATUS32 + 0x48 r15 r30 + 0x4C r14 + 0x50 r13 + 0x54 r12 + 0x58 r11 + 0x5C r10 + 0x60 r9 + 0x64 r8 + 0x68 r7 + 0x6C r6 + 0x70 r5 + 0x74 r4 + 0x78 r3 + 0x7C r2 + 0x80 r1 + 0x84 r0 + 0x88 r30 + 0x8C reserved + 0x90 reserved + 0x94 reserved + 0x98 reserved + 0x9C bta + 0xA0 point of interrupt + 0xA4 STATUS32 + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat +file to remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for the +ARC HS processor, including support for software interrupts and fast +hardware interrupts. + +7.1 Software Interrupt Handling + +The following template should be used for software interrupts +managed by ThreadX: + + .global _tx_interrupt_x +_tx_interrupt_x: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink (blink must be saved before _tx_thread_context_save) + bl _tx_thread_context_save ; Save interrupt context +; +; /* Application ISR processing goes here! Your ISR can be written in +; assembly language or in C. If it is written in C, you must allocate +; 16 bytes of stack space before it is called. This must also be +; recovered once your C ISR return. An example of this is shown below. +; +; If the ISR is written in assembly language, only the compiler scratch +; registers are available for use without saving/restoring (r0-r12). +; If use of additional registers are required they must be saved and +; restored. */ +; + bl.d your_ISR_written_in_C ; Call an ISR written in C + sub sp, sp, 16 ; Allocate stack space (delay slot) + add sp, sp, 16 ; Recover stack space + +; + b _tx_thread_context_restore ; Restore interrupt context + + +The application handles interrupts directly, which necessitates all register +preservation by the application's ISR. ISRs that do not use the ThreadX +_tx_thread_context_save and _tx_thread_context_restore routines are not +allowed access to the ThreadX API. In addition, custom application ISRs +should be higher priority than all ThreadX-managed ISRs. + +7.2 Fast Interrupt Handling + +ThreadX supports the ARC HS fast interrupt processing. It is assumed that +multiple register banks are available and the ARC HS processor automatically +uses register bank 1 as the fast interrupt register bank. + +In order to use fast interrupts with register bank 1, the interrupt desired +must have priority 0 and the application must call the following ThreadX API +to setup register bank 1: + +void tx_initialize_fast_interrupt_setup(void *stack_ptr); + +The parameter "stack_ptr" is the first usable address for the fast interrupt +stack. For example, assume the fast interrupt stack is to be located in the +array "unsigned char fast_interrupt_stack[1024]" the call to this API would +look like: + + tx_initialize_fast_interrupt_setup(&fast_interrupt_stack[1020]); + +As for the fast interrupt ISR, the following template should be used for +ARC HS fast interrupts managed by ThreadX: + + .global _tx_fast_interrupt_x +_tx_fast_interrupt_x: + bl _tx_thread_context_fast_save +; +; /* Fast ISR processing goes here. Interrupts must not be re-enabled +; in the fast interrupt mode. Also note that multiple register banks +; are available and the fast interrupt processing always maps to +; register bank 1. */ +; + b _tx_thread_context_fast_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +By default, the ThreadX timer interrupt is mapped to the ARC HS auxiliary +timer 0, which generates low priority interrupts on interrupt vector 16. +It is easy to change the timer interrupt source and priority by changing the +setup code in tx_initialize_low_level.s. + + +9. Thread Hardware Register Bank Context + +ThreadX supports the use of hardware register banks on the ARC HS. A hardware +register bank may be associated with a specific application thread via the +following API: + +void tx_thread_register_bank_assign(TX_THREAD *thread_ptr, register_bank); + +This API is assumed to be called from initialization (interrupts are locked out +and execution is from register bank 0) and after the specified thread has been +created. This API assumes the register bank number is correct, i.e., a valid +register bank greater than 0 and one that hasn't been used for another thread. + +Note: if fast interrupts are used, register bank 1 must also not be used. In this +case the valid register bank range is 2 through maximum register banks minus 1. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 for ARC HS using MetaWare tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s b/ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s new file mode 100644 index 00000000..4effd106 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s @@ -0,0 +1,107 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_fast_interrupt_setup ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function initializes register bank 1 for fast interrupt use. */ +;/* The initialization includes setting the stack pointer to the value */ +;/* supplied by the caller. */ +;/* */ +;/* INPUT */ +;/* */ +;/* stack_ptr Pointer to stack for bank 1 */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_fast_interrupt_setup(VOID *stack_ptr) +;{ + .global _tx_initialize_fast_interrupt_setup + .type _tx_initialize_fast_interrupt_setup, @function +_tx_initialize_fast_interrupt_setup: +; +; /* Assume this routine is being called from initialization, with interrupts +; disabled and from register bank 0. Also assume that the stack pointer +; input is valid, i.e., there is no error checking on the validity of +; register_bank. */ +; + sub sp, sp, 8 ; Build a small stack frame to hold the setup information + st gp, [sp, 0] ; Save gp in the frame + st r0, [sp, 4] ; Save sp in the frame + mov ilink, sp ; Move the stack frame into ilink + mov r1, 1 ; Select register bank 1 + asl r2, r1, 16 ; Move the register bank bits over to proper location + lr r3, [status32] ; Pickup status32 register + or r3, r3, r2 ; Build new status32 register + kflag r3 ; Move to the hardware register bank + mov r0, ilink ; Place stack pointer in r0 + ld sp, [r0, 4] ; Setup stack pointer for this hardware register bank + mov fp, 0 ; Setup fp + ld gp, [r0, 0] ; Setup gp + mov blink, 0 ; Setup blink + mov r0, 0 ; Clear r0 + sub sp, sp, 8 ; Reserve space for saving ilink and status32.p0 on thread preemption + lr r3, [status32] ; Pickup status32 register + bclr r3, r3, 16 ; Build register bank 0 value + bclr r3, r3, 17 ; + bclr r3, r3, 18 ; + kflag r3 ; Move back to register bank 0 + j_s.d [blink] ; Return to caller + add sp, sp, 8 ; +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s b/ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s new file mode 100644 index 00000000..9b5e71b2 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s @@ -0,0 +1,303 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_fast_restore ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fast interrupt context, which can be a */ +;/* nesting condition on a non-fast ISR, an idle system restore, a */ +;/* restore of an interrupted thread, and a preemption of an interrupted*/ +;/* thread. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_fast_restore(VOID) +;{ + + .global _tx_thread_context_fast_restore + .type _tx_thread_context_fast_restore, @function +_tx_thread_context_fast_restore: +; +; /* Note: it is assumed that the stack pointer is in the same position now as +; it was after the last context fast save call. */ +; + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + bl.d _tx_execution_isr_exit ; Call the ISR exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state contents + sub r0, r0, 1 ; Decrement the system state + st r0, [gp, _tx_thread_system_state@sda] ; Store the new system state + breq r0, 0, __tx_thread_not_nested_restore ; If zero, not a nested interrupt +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + +__tx_thread_nested_restore: + rtie ; Return from interrupt +; +; +; } +__tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + ld r2, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable flag + sub.f 0, r0, 0 ; Set condition codes + beq.d __tx_thread_idle_system_restore ; If NULL, idle system was interrupted + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + brne.d r4, r5, __tx_thread_no_preempt_restore ; If more interrupts, just return to the point of interrupt + ld r4, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + brne r2, 0, __tx_thread_no_preempt_restore ; If set, don't preempt executing thread + brne r0, r4, __tx_thread_preempt_restore ; Not equal, preempt executing thread +; +; +__tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Return to the point of interrupt. */ +; + rtie ; Return from interrupt +; +; } +; else +; { +__tx_thread_preempt_restore: +; + lr r3, [status32_p0] ; Pickup the interrupted status32.p0 register + lsr r4, r3, 16 ; Move the register bank bits down + and r4, r4, 7 ; Isolate the register bank + breq r4, 0, __tx_software_interrupt_context ; If register bank 0, software interrupt context is present + st ilink, [sp, 0] ; Save ilink (point of interrupt) + st r3, [sp, 4] ; Save actual status32.p0 + bclr r4, r3, 16 ; Build register bank 0 value + bclr r4, r4, 17 ; + bclr r4, r4, 18 ; + sr r4, [status32_p0] ; Setup status32.p0 to return to bank 0 when fast ISR is finishe + mov ilink, sp ; Pass the information back to the other register bank via ilink + bclr r3, r3, 31 ; Make sure interrupts are not enabled + kflag r3 ; Switch back to the interrupted thread's hardware register bank + sub sp, sp, 168 ; Allocate an hardware interrupt stack frame + st r0, [sp, 132] ; Temporarily save r0 + mov r0, 3 ; Build hardware interrupt stack type + st r0, [sp, 0] ; Setup interrupt stack type + + .ifndef TX_DISABLE_LP + lr r0, [LP_START] ; Pickup LP_START + st r0, [sp, 4] ; Save LP_START + lr r0, [LP_END] ; Pickup LP_END + st r0, [sp, 8] ; Save LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + .endif + + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + ld r0, [ilink, 0] ; Pickup the point of interrupt + st r0, [sp, 160] ; Setup the point of interrupt + st r0, [sp, 20] ; Save ilink + ld r0, [ilink, 4] ; Pickup the status32 + st r0, [sp, 164] ; Setup the status32 + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st sp, [r0, 8] ; Save stack pointer in thread control block + ld r0, [sp, 132] ; Restore r0 + lr ilink, [status32] ; Pickup status32 register + bset ilink, ilink, 16 ; Build register bank 1 value + bclr ilink, ilink, 17 ; + bclr ilink, ilink, 18 ; + kflag ilink ; Move back to register bank 0 + b __tx_preempt_save_done ; Done, finished with preemption save + +__tx_software_interrupt_context: + st ilink, [sp, 0] ; Save ilink (point of interrupt) + st r3, [sp, 4] ; Save status32 + mov ilink, sp ; Pass the information back to the other register bank via ilink + bclr r3, r3, 31 ; Make sure interrupts are not enabled + kflag r3 ; Switch back to the interrupted thread's hardware register bank + sub sp, sp, 168 ; Allocate an hardware interrupt stack frame + st blink, [sp, 16] ; Save blink + st fp, [sp, 24] ; Save fp + st gp, [sp, 28] ; Save gp + st r25, [sp, 32] ; Save r25 + st r24, [sp, 36] ; Save r24 + st r23, [sp, 40] ; Save r23 + st r22, [sp, 44] ; Save r22 + st r21, [sp, 48] ; Save r21 + st r20, [sp, 52] ; Save r20 + st r19, [sp, 56] ; Save r19 + st r18, [sp, 60] ; Save r18 + st r17, [sp, 64] ; Save r17 + st r16, [sp, 68] ; Save r16 + st r15, [sp, 72] ; Save r15 + st r14, [sp, 76] ; Save r14 + st r13, [sp, 80] ; Save r13 + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r6 + st r3, [sp, 120] ; Save r3 + st r2, [sp, 124] ; Save r2 + st r1, [sp, 128] ; Save r1 + st r0, [sp, 132] ; Save r0 + st r30, [sp, 136] ; Save r30 + + .ifndef TX_DISABLE_LP + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + .endif + + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + mov r6, 1 ; Build interrupt stack type + st r6, [sp, 0] ; Setup interrupt stack type + ld r0, [ilink, 0] ; Pickup the point of interrupt + st r0, [sp, 160] ; Setup the point of interrupt + st r0, [sp, 20] ; Save ilink + ld r0, [ilink, 4] ; Pickup the status32 + st r0, [sp, 164] ; Setup the status32 + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st sp, [r0, 8] ; Save stack pointer in thread control block + lr ilink, [status32] ; Pickup status32 register + bset ilink, ilink, 16 ; Build register bank 1 value + bclr ilink, ilink, 17 ; + bclr ilink, ilink, 18 ; + kflag ilink ; Move back to register bank 1 +__tx_preempt_save_done: +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup time-slice contents + mov r7, 0 ; Build clear/NULL value + breq r2, 0, __tx_thread_dont_save_ts ; No time-slice, don't need to save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r2, [r0, 24] ; If set, save remaining time-slice + st r7, [gp, _tx_timer_time_slice@sda] ; If set, clear time slice +; +; } +__tx_thread_dont_save_ts: +; +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + st r7, [gp, _tx_thread_current_ptr@sda] ; Set current thread ptr to NULL + mov ilink, _tx_thread_schedule ; Build address of scheduler + rtie ; Return from interrupt to scheduler +; +; } +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; +__tx_thread_idle_system_restore: + + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + sub.f 0, r4, r5 ; Set condition codes + bne __tx_thread_nested_restore ; If more interrupts, just return to the point of interrupt + + mov ilink, _tx_thread_schedule ; Build address of scheduler + rtie ; Return from interrupt to scheduler +; +;} + .end + diff --git a/ports/arc_hs/metaware/src/tx_thread_context_fast_save.s b/ports/arc_hs/metaware/src/tx_thread_context_fast_save.s new file mode 100644 index 00000000..c25f39bb --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_fast_save.s @@ -0,0 +1,108 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_fast_save ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of fast interrupt processing. The function assumes that */ +;/* fast interrupts are enabled (priority 0) and multiple register */ +;/* banks are available. In this case, register bank 1 is reserved by */ +;/* hardware for fast interrupts. Additional assumptions include that */ +;/* there will be no nested fast interrupts and the LP_START, LP_END, */ +;/* and LP_COUNT registers are not used in the application's fast */ +;/* interrupt ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_fast_save(VOID) +;{ + .global _tx_thread_context_fast_save + .type _tx_thread_context_fast_save, @function +_tx_thread_context_fast_save: +; +; /* Increment nested interrupt count. */ +; _tx_thread_system_state++; +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state +; +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; + + j [blink] ; Return to the ISR +; +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_context_restore.s b/ports/arc_hs/metaware/src/tx_thread_context_restore.s new file mode 100644 index 00000000..497aec43 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_restore.s @@ -0,0 +1,322 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, @function +_tx_thread_context_restore: +; +; /* Note: it is assumed that the stack pointer is in the same position now as +; it was after the last context save call. */ +; +; /* Lockout interrupts. */ +; + clri ; Disable interrupts + nop ; Delay for interrupts to really be disabled + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + bl.d _tx_execution_isr_exit ; Call the ISR exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state contents + sub r0, r0, 1 ; Decrement the system state + st r0, [gp, _tx_thread_system_state@sda] ; Store the new system state + breq r0, 0, __tx_thread_not_nested_restore ; If zero, not a nested interrupt +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + +__tx_thread_nested_restore: + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; +; } +__tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + ld r2, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable flag + sub.f 0, r0, 0 ; Set condition codes + beq.d __tx_thread_idle_system_restore ; If NULL, idle system was interrupted + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + brne.d r4, r5, __tx_thread_no_preempt_restore ; If more interrupts, just return to the point of interrupt + ld r4, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + brne r2, 0, __tx_thread_no_preempt_restore ; If set, don't preempt executing thread + brne r0, r4, __tx_thread_preempt_restore ; Not equal, preempt executing thread +; +; +__tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; + +; /* Recover the saved context and return to the point of interrupt. */ +; + ld sp, [r0, 8] ; Switch back to thread's stack + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; } +; else +; { +__tx_thread_preempt_restore: +; + ld r7, [r0, 8] ; Pickup stack pointer + lr r3, [status32] ; Pickup the status32 register + lsr r4, r3, 16 ; Move the register bank bits down + and r4, r4, 7 ; Isolate the register bank + breq r4, 0, __tx_software_interrupt_context ; If register bank 0, software interrupt context is present + mov sp, r7 ; Setup sp in this register bank + mov r6, 3 ; Build hardware interrupt stack type + st r6, [sp, 0] ; Setup interrupt stack type + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + lr ilink, [status32] ; Pickup status32 register + bclr ilink, ilink, 16 ; Build register bank 0 value + bclr ilink, ilink, 17 ; + bclr ilink, ilink, 18 ; + kflag ilink ; Move back to register bank 0 + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + b __tx_preempt_save_done ; Done, finished with preemption save + nop + +__tx_software_interrupt_context: + mov r6, 1 ; Build interrupt stack type + st r6, [r7, 0] ; Setup interrupt stack type + st fp, [r7, 24] ; Save fp + st gp, [r7, 28] ; Save gp + st r25, [r7, 32] ; Save r25 + st r24, [r7, 36] ; Save r24 + st r23, [r7, 40] ; Save r23 + st r22, [r7, 44] ; Save r22 + st r21, [r7, 48] ; Save r21 + st r20, [r7, 52] ; Save r20 + st r19, [r7, 56] ; Save r19 + st r18, [r7, 60] ; Save r18 + st r17, [r7, 64] ; Save r17 + st r16, [r7, 68] ; Save r16 + st r15, [r7, 72] ; Save r15 + st r14, [r7, 76] ; Save r14 + st r13, [r7, 80] ; Save r13 + st r30, [r7, 136] ; Save r30 +__tx_preempt_save_done: +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup time-slice contents + mov r7, 0 ; Build clear/NULL value + breq r2, 0, __tx_thread_dont_save_ts ; No time-slice, don't need to save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r2, [r0, 24] ; If set, save remaining time-slice + st r7, [gp, _tx_timer_time_slice@sda] ; If set, clear time slice +; +; } +__tx_thread_dont_save_ts: +; +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + st r7, [gp, _tx_thread_current_ptr@sda] ; Set current thread ptr to NULL + + sub sp, sp, 8 ; Allocate a small stack frame on the system stack + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +; } +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; +__tx_thread_idle_system_restore: + + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + sub.f 0, r4, r5 ; Set condition codes + bne __tx_thread_nested_restore ; If more interrupts, just return to the point of interrupt + + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +;} + .end + diff --git a/ports/arc_hs/metaware/src/tx_thread_context_save.s b/ports/arc_hs/metaware/src/tx_thread_context_save.s new file mode 100644 index 00000000..b24cc042 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_save.s @@ -0,0 +1,242 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + .global _tx_thread_context_save + .type _tx_thread_context_save, @function +_tx_thread_context_save: +; +; /* Upon entry to this routine, it is assumed that an interrupt stack frame +; has already been allocated, and the interrupted blink register is already saved. */ +; + clri ; Disable interrupts + st r1, [sp, 128] ; Save r1 + st r0, [sp, 132] ; Save r0 +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state + st r3, [sp, 120] ; Save r3 + st r2, [sp, 124] ; Save r2 + breq r0, 0, __tx_thread_not_nested_save ; If 0, we are not in a nested + ; condition +; +; /* Nested interrupt condition. */ +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; +__tx_thread_nested_save: ; Label is for special nested interrupt case from idle system save below + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r6 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + +; +; /* Return to the ISR. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; + + j.d [blink] ; Return to Level 1 ISR + st ilink, [sp, 20] ; Save ilink +; +__tx_thread_not_nested_save: +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state + ld r1, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + breq r1, 0, __tx_thread_idle_system_save ; If no thread is running, idle system was + ; interrupted. +; +; /* Save minimal context of interrupted thread. */ +; + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r4 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + st ilink, [sp, 20] ; Save ilink + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; + st sp, [r1, 8] ; Save thread's stack pointer + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + j_s.d [blink] ; Return to calling ISR + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack +; +; } +; else +; { +; +__tx_thread_idle_system_save: +; +; /* Interrupt occurred in the scheduling loop. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; +; /* See if we have a special nesting condition. This happens when the higher priority +; interrupt occurs before the nested interrupt logic is valid. */ +; + lr r0, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r1, r0 ; Negate + and r1, r0, r1 ; See if there are any other interrupts present + brne r0, r1, __tx_thread_nested_save ; If more interrupts, go into the nested interrupt save logic +; +; /* Not much to do here, just adjust the stack pointer, and return to +; ISR processing. */ +; + j_s.d [blink] ; Return to ISR + add sp, sp, 160 ; Recover stack space +; +; } +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_interrupt_control.s b/ports/arc_hs/metaware/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..cfa6221b --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_interrupt_control.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, @function +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + clri r1 ; Get current interrupt state +; +; /* Apply the new interrupt posture. */ +; + seti r0 ; Set desired interrupt state + j_s.d [blink] ; Return to caller with delay slot + mov r0, r1 ; Return previous mask value. Return value is TX_INT_DISABLE or TX_INT_ENABLE. +; +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s b/ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s new file mode 100644 index 00000000..172a7f31 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s @@ -0,0 +1,113 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_register_bank_assign ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* register_bank Register bank number */ +;/* (1 through max-1) */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_register_bank_assign(VOID *thread_ptr, UINT register_bank) +;{ + .global _tx_thread_register_bank_assign + .type _tx_thread_register_bank_assign, @function +_tx_thread_register_bank_assign: +; +; /* Assume this routine is being called from initialization, with interrupts +; disabled and from register bank 0. Also assume that the thread pointer and +; register bank input is valid, i.e., there is no error checking on the validity of +; the thread pointer or the register_bank. +; +; It is worth noting that if fast interrupts are being used, register bank 1 +; is reserved for the fast interrupt processing, so thread register bank assignments +; should begin at bank 2. */ +; + mov ilink, r0 ; Move the thread control block into ilink + asl r2, r1, 16 ; Move the register bank bits over to proper location + lr r3, [status32] ; Pickup status32 register + or r3, r3, r2 ; Build new status32 register + ld r4, [r0, 8] ; Pickup stack pointer for the thread + ld r5, [r4, 164] ; Pickup initial status32 from stack area + or r5, r5, r2 ; Modify initial status32 with register bank number + st r5, [r4, 164] ; Store initial status32 in stack area + kflag r3 ; Move to the hardware register bank + mov r0, ilink ; Place thread control block in r0 + ld sp, [r0, 8] ; Setup stack pointer for this hardware register bank + ld fp, [sp, 24] ; Setup fp + ld gp, [sp, 28] ; Setup gp + ld blink, [sp, 16] ; Setup blink + ld ilink, [sp, 20] ; Setup ilink + lr r3, [status32] ; Pickup status32 register + bclr r3, r3, 16 ; Build register bank 0 value + bclr r3, r3, 17 ; + bclr r3, r3, 18 ; + kflag r3 ; Move back to register bank 0 + mov r5, 3 ; Build type for hardware interrupt context + j_s.d [blink] ; Return to caller + st r5, [r4, 0] ; Set stack frame type +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_schedule.s b/ports/arc_hs/metaware/src/tx_thread_schedule.s new file mode 100644 index 00000000..7560e34f --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_schedule.s @@ -0,0 +1,265 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + .global _tx_thread_schedule + .type _tx_thread_schedule, @function +_tx_thread_schedule: +; +; /* Switch to system stack. */ +; + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack +; +; /* Enable interrupts. */ +; + mov r0, 0x1F ; Build enable interrupt value + seti r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { +; +__tx_thread_schedule_loop: +; + ld r0, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + breq r0, 0, __tx_thread_schedule_loop ; If NULL, keep looking +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + clri ; Lockout interrupts + nop ; Delay for interrupts to really be disabled +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + st r0, [gp, _tx_thread_current_ptr@sda] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + ld r3, [r0, 4] ; Pickup run counter + ld r4, [r0, 24] ; Pickup time-slice for this thread + add r3, r3, 1 ; Increment run counter + st r3, [r0, 4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + st r4, [gp, _tx_timer_time_slice@sda] ; Setup time-slice +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + bl.d _tx_execution_thread_enter ; Call the thread execution enter function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + ld sp, [r0, 8] ; Switch to thread's stack + ld r1, [sp, 0] ; Pickup stack type + brlt r1, 2, __tx_restore_non_hw_context ; If less than 2, restore a software context + breq r1, 3, __tx_hw_interrupt_restore ; If interrupt restore, restore interrupted hardware context + ld r2, [sp, 4] ; Pickup status32 + kflag r2 ; Enter the proper register bank + ld r3, [sp, 8] ; Pickup the saved interrupt posture + add sp, sp, 12 ; Recover small stack frame + j_s.d [blink] ; Return to thread and restore flags + seti r3 ; Recover STATUS32 + +__tx_hw_interrupt_restore: + + mov r0, 0x2 ; Pretend level 1 interrupt is returning + sr r0, [AUX_IRQ_ACT] ; + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + + ld r0, [sp, 156] ; Pickup saved BTA + sr r0, [BTA] ; Recover BTA + ld ilink, [sp, 20] ; Recover ilink + ld r0, [sp, 164] ; Pickup the interrupted status32 + bclr r0, r0, 31 ; Make sure interrupts are not enabled + kflag r0 ; Switch to the proper register bank + add sp, sp, 160 ; Recover the interrupt stack frame + rtie ; Return to point of interrupt + +__tx_restore_non_hw_context: +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + ld r1, [sp, 0] ; Pickup the stack type + brne r1, 0, __tx_thread_schedule_int_ret ; Compare to solicited stack type. If not, thread was interrupted + ld blink, [sp, 4] ; Recover blink + ld fp, [sp, 8] ; Recover fp + ld gp, [sp, 12] ; Recover gp + ld r25, [sp, 16] ; Recover r25 + ld r24, [sp, 20] ; Recover r24 + ld r23, [sp, 24] ; Recover r23 + ld r22, [sp, 28] ; Recover r22 + ld r21, [sp, 32] ; Recover r21 + ld r20, [sp, 36] ; Recover r20 + ld r19, [sp, 40] ; Recover r19 + ld r18, [sp, 44] ; Recover r18 + ld r17, [sp, 48] ; Recover r17 + ld r16, [sp, 52] ; Recover r16 + ld r15, [sp, 56] ; Recover r15 + ld r14, [sp, 60] ; Recover r14 + ld r13, [sp, 64] ; Recover r13 + ld r1, [sp, 68] ; Pickup status32 + ld r30, [sp, 72] ; Recover r30 + add sp, sp, 76 ; Recover solicited stack frame + j_s.d [blink] ; Return to thread and restore flags + seti r1 ; Recover STATUS32 +; +__tx_thread_schedule_int_ret: +; + mov r0, 0x2 ; Pretend level 1 interrupt is returning + sr r0, [AUX_IRQ_ACT] ; + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + ld r0, [sp, 156] ; Pickup saved BTA + sr r0, [BTA] ; Recover BTA + ld blink, [sp, 16] ; Recover blink + ld ilink, [sp, 20] ; Recover ilink + ld fp, [sp, 24] ; Recover fp + ld gp, [sp, 28] ; Recover gp + ld r25, [sp, 32] ; Recover r25 + ld r24, [sp, 36] ; Recover r24 + ld r23, [sp, 40] ; Recover r23 + ld r22, [sp, 44] ; Recover r22 + ld r21, [sp, 48] ; Recover r21 + ld r20, [sp, 52] ; Recover r20 + ld r19, [sp, 56] ; Recover r19 + ld r18, [sp, 60] ; Recover r18 + ld r17, [sp, 64] ; Recover r17 + ld r16, [sp, 68] ; Recover r16 + ld r15, [sp, 72] ; Recover r15 + ld r14, [sp, 76] ; Recover r14 + ld r13, [sp, 80] ; Recover r13 + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + ld r30, [sp, 136] ; Recover r30 + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt +; +;} +; + .end + diff --git a/ports/arc_hs/metaware/src/tx_thread_stack_build.s b/ports/arc_hs/metaware/src/tx_thread_stack_build.s new file mode 100644 index 00000000..4562db37 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_stack_build.s @@ -0,0 +1,205 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + .equ LONG_ALIGN_MASK, 0xFFFFFFFC + .equ INT_ENABLE_BITS, 0x8000001E +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, @function +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARC HS should look like the following after it is built. +; Note that the extension registers are always assigned space here. +; +; Stack Top: 1 Interrupt stack frame type +; LP_START Initial loop start +; LP_END Initial loop end +; LP_COUNT Initial loop count +; blink Initial blink value +; ilink Initial ilink (point of interrupt) +; fp (r27) Initial fp (0) +; gp Initial gp +; r25 Initial r25 +; r24 Initial r24 +; r23 Initial r23 +; r22 Initial r22 +; r21 Initial r21 +; r20 Initial r20 +; r19 Initial r19 +; r18 Initial r18 +; r17 Initial r17 +; r16 Initial r16 +; r15 Initial r15 +; r14 Initial r14 +; r13 Initial r13 +; r12 Initial r12 +; r11 Initial r11 +; r10 Initial r10 +; r9 Initial r9 +; r8 Initial r8 +; r7 Initial r7 +; r6 Initial r6 +; r5 Initial r5 +; r4 Initial r4 +; r3 Initial r3 +; r2 Initial r2 +; r1 Initial r1 +; r0 Initial r0 +; r30 Initial r30 +; r58 Initial r58 +; r59 Initial r59 +; 0 Reserved +; 0 Reserved +; 0 Initial BTA +; 0 Point of Interrupt (thread entry point) +; 0 Initial STATUS32 +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; +; *: these registers will only be saved and restored if flag -Xxmac_d16 is passed to hcac +; +; Stack Bottom: (higher memory address) */ +; + ld r3, [r0, 16] ; Pickup end of stack area + and r3, r3, LONG_ALIGN_MASK ; Ensure long-word alignment + sub r3, r3, 196 ; Allocate an interrupt stack frame (ARC HS) +; +; /* Actually build the stack frame. */ +; + st 1, [r3, 0] ; Store interrupt stack type on the + ; top of the stack + mov r5, 0 ; Build initial clear value + st r5, [r3, 4] ; Store initial LP_START + st r5, [r3, 8] ; Store initial LP_END + st r5, [r3, 12] ; Store initial LP_COUNT + st r5, [r3, 16] ; Store initial blink + st r1, [r3, 20] ; Store initial ilink + st r5, [r3, 24] ; Store initial fp (0 for backtrace) + st gp, [r3, 28] ; Store current gp + st r5, [r3, 32] ; Store initial r25 + st r5, [r3, 36] ; Store initial r24 + st r5, [r3, 40] ; Store initial r23 + st r5, [r3, 44] ; Store initial r22 + st r5, [r3, 48] ; Store initial r21 + st r5, [r3, 52] ; Store initial r20 + st r5, [r3, 56] ; Store initial r19 + st r5, [r3, 60] ; Store initial r18 + st r5, [r3, 64] ; Store initial r17 + st r5, [r3, 68] ; Store initial r16 + st r5, [r3, 72] ; Store initial r15 + st r5, [r3, 76] ; Store initial r14 + st r5, [r3, 80] ; Store initial r13 + st r5, [r3, 84] ; Store initial r12 + st r5, [r3, 88] ; Store initial r11 + st r5, [r3, 92] ; Store initial r10 + st r5, [r3, 96] ; Store initial r9 + st r5, [r3, 100] ; Store initial r8 + st r5, [r3, 104] ; Store initial r7 + st r5, [r3, 108] ; Store initial r6 + st r5, [r3, 112] ; Store initial r5 + st r5, [r3, 116] ; Store initial r4 + st r5, [r3, 120] ; Store initial r3 + st r5, [r3, 124] ; Store initial r2 + st r5, [r3, 128] ; Store initial r1 + st r5, [r3, 132] ; Store initial r0 + st r5, [r3, 136] ; Store initial r30 + st r5, [r3, 140] ; Store initial r58 + st r5, [r3, 144] ; Store initial r59 + st r5, [r3, 148] ; Reserved + st r5, [r3, 152] ; Reserved + st r5, [r3, 156] ; Store initial BTA + st r1, [r3, 160] ; Store initial point of entry + lr r6, [status32] ; Pickup STATUS32 + or r6, r6, INT_ENABLE_BITS ; Make sure interrupts are enabled + st r6, [r3, 164] ; Store initial STATUS32 + st r5, [r3, 168] ; Backtrace 0 + st r5, [r3, 172] ; Backtrace 0 + st r5, [r3, 176] ; Backtrace 0 + st r5, [r3, 180] ; Backtrace 0 +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r3; +; + j_s.d [blink] ; Return to caller + st r3, [r0, 8] ; Save stack pointer in thread's + ; control block +;} + .end + + diff --git a/ports/arc_hs/metaware/src/tx_thread_system_return.s b/ports/arc_hs/metaware/src/tx_thread_system_return.s new file mode 100644 index 00000000..7d661965 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_system_return.s @@ -0,0 +1,169 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + .global _tx_thread_system_return + .type _tx_thread_system_return, @function +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; +; /* Lockout interrupts. */ +; + clri r2 ; Disable interrupts + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + lr r3, [status32] ; Pickup the status32 register + lsr r4, r3, 16 ; Move the register bank bits down + and r4, r4, 7 ; Isolate the register bank + breq r4, 0, __tx_software_context ; If register bank 0, software context is present + sub sp, sp, 12 ; Build small stack frame + mov r4, 2 ; Build solicited hardward stack frame type + st r4, [sp, 0] ; Set stack frame type + st r3, [sp, 4] ; Save status32 + st r2, [sp, 8] ; Save interrupt posture + st sp, [r0, 8] ; Save thread's stack pointer + bclr r3, r3, 16 ; Build register bank 0 value + bclr r3, r3, 17 ; + bclr r3, r3, 18 ; + kflag r3 ; Move back to register bank 0 + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + b.d __tx_save_done + mov r3, 0 ; Build clear value +__tx_software_context: + sub sp, sp, 76 ; Allocate a solicited stack frame + mov r3, 0 ; Build a solicited stack type + st r3, [sp, 0] ; Store stack type on the top + st blink, [sp, 4] ; Save return address and flags + st fp, [sp, 8] ; Save fp + st r26, [sp, 12] ; Save r26 + st r25, [sp, 16] ; Save r25 + st r24, [sp, 20] ; Save r24 + st r23, [sp, 24] ; Save r23 + st r22, [sp, 28] ; Save r22 + st r21, [sp, 32] ; Save r21 + st r20, [sp, 36] ; Save r20 + st r19, [sp, 40] ; Save r19 + st r18, [sp, 44] ; Save r18 + st r17, [sp, 48] ; Save r17 + st r16, [sp, 52] ; Save r16 + st r15, [sp, 56] ; Save r15 + st r14, [sp, 60] ; Save r14 + st r13, [sp, 64] ; Save r13 + st r2, [sp, 68] ; Save status32 + st r30, [sp, 72] ; Save r30 + st sp, [r0, 8] ; Save thread's stack pointer +__tx_save_done: +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + bl.d _tx_execution_thread_exit ; Call the thread exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + mov r3, 0 ; Build clear value + .endif +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + ld r5, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + breq r5, 0, __tx_thread_dont_save_ts ; If not, skip save processing +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r3, [gp, _tx_timer_time_slice@sda] ; Clear time-slice variable + st r5, [r0, 24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts: +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + b.d _tx_thread_schedule ; Return to scheduler.. + st r3, [gp, _tx_thread_current_ptr@sda] ; ..clearing current thread pointer +; +;} + .end + + diff --git a/ports/arc_hs/metaware/src/tx_timer_interrupt.s b/ports/arc_hs/metaware/src/tx_timer_interrupt.s new file mode 100644 index 00000000..4edc1aa4 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_timer_interrupt.s @@ -0,0 +1,238 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Process timer expiration */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* _tx_thread_context_save Save interrupt context */ +;/* _tx_thread_context_restore Restore interrupt context */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, @function +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed the interrupt stack frame has +; already been allocated and registers r0, r1, and r2 have already been saved +; at offsets 0, 4, and 8 respectively. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + clri ; Lockout interrupts + ld r0, [gp,_tx_timer_system_clock@sda] ; Pickup current system clock + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + add r0, r0, 1 ; Increment the system clock + st r0, [gp,_tx_timer_system_clock@sda] ; Store system clock back in memory + +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + mov r1, 0 ; Clear expiration flag + breq r2, 0, __tx_timer_no_time_slice ; If zero, no time-slice is active +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + sub r2, r2, 1 ; Decrement time-slice + st r2, [gp, _tx_timer_time_slice@sda] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + brne r2, 0, __tx_timer_no_time_slice ; If non-zero, skip over expiration +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + mov r1, 1 ; Set register flag + st r1, [gp, _tx_timer_expired_time_slice@sda] ; Set the time-slice expired flag + +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + ld r0, [gp, _tx_timer_current_ptr@sda] ; Pickup current timer pointer + ld r2, [r0, 0] ; Pickup examine actual list entry + breq r2, 0, __tx_timer_no_timer ; + ; If NULL, no timer has expired, just move to the next entry +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + mov r1, 1 ; Build expiration value + b.d __tx_timer_done ; Skip moving the timer pointer + st r1, [gp, _tx_timer_expired@sda] ; Set the expired value +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ld r2, [gp, _tx_timer_list_end@sda] ; Pickup end of list + add r0, r0, 4 ; Move to next timer entry +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + st r0, [gp, _tx_timer_current_ptr@sda] ; Store the current timer + brne r0, r2, __tx_timer_skip_wrap ; If not equal, don't wrap the list +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + ld r2, [gp, _tx_timer_list_start@sda] ; Pickup start of timer list + st r2, [gp, _tx_timer_current_ptr@sda] ; Set current timer to the start +; +__tx_timer_skip_wrap: +; +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + breq r1, 0, __tx_timer_nothing_expired ; If 0, nothing has expired +; +__tx_something_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Save interrupted context +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + ld r2, [gp, _tx_timer_expired@sda] ; Pickup timer expired flag + ld r4, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable + breq r2, 0, __tx_timer_dont_activate ; If not set, skip expiration processing +; +; /* Process the timer expiration. */ +; /* _tx_timer_expiration_process(); */ + bl.d _tx_timer_expiration_process ; Call the timer expiration handling routine + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + ld r2, [gp, _tx_timer_expired_time_slice@sda] ; Pickup expired time-slice flag + breq r2, 0, __tx_timer_not_ts_expiration ; If not set, skip time-slice +; +; /* Time slice interrupted thread. */ +; /* _tx_thread_time_slice(); */ + + bl.d _tx_thread_time_slice ; Call time-slice processing + sub sp, sp, 16 ; ..allocating some stack space + add sp, sp, 16 ; Recover stack space +; +; } +; +__tx_timer_not_ts_expiration: +; + st 0, [gp, _tx_timer_expired_time_slice@sda] + b _tx_thread_context_restore ; Go restore interrupt context.. + ; ..clearing time-slice expired flag + ; Note that we don't return from + ; this function. +; +; } +; +__tx_timer_nothing_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt +; +;} + .end + diff --git a/ports/arm9/ac5/example_build/build_threadx.bat b/ports/arm9/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..196340df --- /dev/null +++ b/ports/arm9/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu ARM9TDMI --apcs /interwork tx_initialize_low_level.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_stack_build.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_schedule.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_system_return.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_context_save.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_context_restore.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_timer_interrupt.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_vectored_context_save.s +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +armar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/arm9/ac5/example_build/build_threadx_sample.bat b/ports/arm9/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..3fcb0856 --- /dev/null +++ b/ports/arm9/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu ARM9TDMI --apcs /interwork tx_initialize_low_level.s +armcc -g -c -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --ro 0 --first tx_initialize_low_level.o(Init) --remove --map --symbols --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/arm9/ac5/example_build/sample_threadx.c b/ports/arm9/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/arm9/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arm9/ac5/example_build/tx_initialize_low_level.s b/ports/arm9/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..0aa438f5 --- /dev/null +++ b/ports/arm9/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,444 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; Disable IRQ/FIQ SVC mode +IRQ_MODE EQU 0xD2 ; Disable IRQ/FIQ IRQ mode +FIQ_MODE EQU 0xD1 ; Disable IRQ/FIQ FIQ mode +SYS_MODE EQU 0xDF ; Disable IRQ/FIQ SYS mode +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; +;/* ARM9 ARMulator Timer and Interrupt controller information. This depends on +; the ARMulator's Interrupt Controller and Timer being enabled in the default.ami. +; In addition, the addresses must match those specified in the peripherals.ami file. +; Please refer to section 2.10 and 4.16 of the Debug Target Guide, version 1.2. */ +; +IRQStatus EQU 0x0a000000 ; IRQ Status Register +IRQRawStatus EQU 0x0a000004 ; IRQ Raw Status Register +IRQEnable EQU 0x0a000008 ; IRQ Enable Set Register +IRQEnableClear EQU 0x0a00000C ; IRQ Enable Clear Register +IRQSoft EQU 0x0a000010 ; IRQ Soft +FIQStatus EQU 0x0a000100 ; FIQ Status Register +FIQRawStatus EQU 0x0a000104 ; FIQ Raw Status Register +FIQEnable EQU 0x0a000108 ; FIQ Enable Set Register +FIQEnableClear EQU 0x0a00010C ; FIQ Enable Clear Register + +TIMER1_BIT EQU 0x00000010 ; IRQ/FIQ Timer1 bit +TIMER2_BIT EQU 0x00000020 ; IRQ/FIQ Timer2 bit + +Timer1Load EQU 0x0a800000 ; Timer1 Load Register +Timer1Value EQU 0x0a800004 ; Timer1 Value Register +Timer1Control EQU 0x0a800008 ; Timer1 Control Register +Timer1Clear EQU 0x0a80000C ; Timer1 Clear Register + +Timer1Mode EQU 0x000000C0 ; Timer1 Control Value, Timer enable, periodic, no prescaler +Timer1Period EQU 0x0000FFFF ; Timer1 count-down period, maximum value + +Timer2Load EQU 0x0a800020 ; Timer2 Load Register +Timer2Value EQU 0x0a800024 ; Timer2 Value Register +Timer2Control EQU 0x0a800028 ; Timer2 Control Register +Timer2Clear EQU 0x0a80002C ; Timer2 Clear Register +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the ARM9 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_cxsf, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Setup ARMulator Timer1 for periodic interrupts. */ +; + LDR r0,=IRQEnable ; Build address of IRQ enable register + LDR r1,=TIMER1_BIT ; Build value of Timer1 IRQ enable + STR r1,[r0] ; Enable IRQ interrupts for Timer1 + + LDR r0,=Timer1Load ; Build address of Timer1 load register + LDR r1,=Timer1Period ; Build Timer1 periodic value + STR r1,[r0] ; Set Timer1 load value + + LDR r0,=Timer1Control ; Build address of Timer1 control register + LDR r1,=Timer1Mode ; Build Timer1 control value + STR r1,[r0] ; Enable Timer1 +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Check for Timer1 interrupts on the ARMulator. */ + + LDR r1,=IRQStatus ; Pickup address of IRQStatus register + LDR r2, [r1] ; Read IRQStatus + LDR r0,=TIMER1_BIT ; Pickup Timer1 interrupt present bit + AND r2, r2, r0 ; Is this a timer interrupt? + CMP r2, r0 ; + BNE _tx_not_timer_interrupt ; If 0, not a timer interrupt + + LDR r1,=Timer1Clear ; Build address of Timer1 clear register + MOV r0,#0 ; + STR r0, [r1] ; Clear timer 0 interrupt + + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/arm9/ac5/inc/tx_port.h b/ports/arm9/ac5/inc/tx_port.h new file mode 100644 index 00000000..eb445bef --- /dev/null +++ b/ports/arm9/ac5/inc/tx_port.h @@ -0,0 +1,329 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARM9/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARM9/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/arm9/ac5/readme_threadx.txt b/ports/arm9/ac5/readme_threadx.txt new file mode 100644 index 00000000..3fab29c2 --- /dev/null +++ b/ports/arm9/ac5/readme_threadx.txt @@ -0,0 +1,518 @@ + Microsoft's Azure RTOS ThreadX for ARM9 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the ARM9 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu ARM9TDMI Specifies ARM9TDMI instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for ARM9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The ARM9 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, ARM9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/ARM9 Mixed Mode + +By default, ThreadX is setup for running in ARM9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be built +in 32-bit mode. In addition, if any Thumb code is used the entire ThreadX source- +both C and assembly - should be built with the "-apcs /interwork" option. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for ARM9 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arm9/ac5/src/tx_thread_context_restore.s b/ports/arm9/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1e5f4566 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,247 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +THUMB_MASK EQU 0x20 ; Thumb bit mask +SVC_MODE_BITS EQU 0x13 ; SVC mode value +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_context_save.s b/ports/arm9/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..07efa1a6 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_context_save.s @@ -0,0 +1,207 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF + + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_context_restore.s b/ports/arm9/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..5cd93433 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +THUMB_MASK EQU 0x20 ; Thumb bit mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +SVC_MODE_BITS EQU 0x13 ; SVC mode value +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_context_save.s b/ports/arm9/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..941ae79b --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s b/ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..87d9bcc1 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s b/ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..f06e9ec2 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_interrupt_control.s b/ports/arm9/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..c21d687d --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_interrupt_disable.s b/ports/arm9/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..efe72d25 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_interrupt_restore.s b/ports/arm9/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..eac71e91 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_irq_nesting_end.s b/ports/arm9/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..a1bd87ed --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/arm9/ac5/src/tx_thread_irq_nesting_start.s b/ports/arm9/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..1fc8b2dd --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_schedule.s b/ports/arm9/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..fa1eef18 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_schedule.s @@ -0,0 +1,172 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS EQU 0xC0 ; IRQ & FIQ Interrupts enabled mask + ELSE +ENABLE_INTS EQU 0x80 ; IRQ Interrupts enabled mask + ENDIF +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + BL _tx_execution_thread_enter ; Call the thread execution enter function + ENDIF +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r0, r1} ; Pickup the stack type and saved CPSR + CMP r0, #0 ; Check for synchronous context switch + MSRNE SPSR_cxsf, r1 ; Setup SPSR for return + LDMNEIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r1 ; Recover CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_stack_build.s b/ports/arm9/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..2da5649c --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,156 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARM9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/arm9/ac5/src/tx_thread_system_return.s b/ports/arm9/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..697085a3 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_system_return.s @@ -0,0 +1,150 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1, r4-r11, lr} ; Save minimal context +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + + LDR r3, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r0, [r3, #0] ; Pickup current thread pointer + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r0, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r0, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r3, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/arm9/ac5/src/tx_thread_vectored_context_save.s b/ports/arm9/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..c5e1e9f8 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,209 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_timer_interrupt.s b/ports/arm9/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..7997d994 --- /dev/null +++ b/ports/arm9/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/arm9/gnu/example_build/build_threadx.bat b/ports/arm9/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..47617c67 --- /dev/null +++ b/ports/arm9/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=arm9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/arm9/gnu/example_build/build_threadx_sample.bat b/ports/arm9/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..c35d2bc6 --- /dev/null +++ b/ports/arm9/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=arm9 reset.S +arm-none-eabi-gcc -c -g -mcpu=arm9 crt0.S +arm-none-eabi-gcc -c -g -mcpu=arm9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A arm9 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/arm9/gnu/example_build/crt0.S b/ports/arm9/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/arm9/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/arm9/gnu/example_build/libgcc.a b/ports/arm9/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; ORR %1,%0,#0xC0; MSR CPSR_cxsf,%1 ": "=r" (interrupt_save), "=r" (tx_temp) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; ORR %1,%0,#0x80; MSR CPSR_cxsf,%1 ": "=r" (interrupt_save), "=r" (tx_temp) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_cxsf,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARM9/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/arm9/gnu/readme_threadx.txt b/ports/arm9/gnu/readme_threadx.txt new file mode 100644 index 00000000..262760e6 --- /dev/null +++ b/ports/arm9/gnu/readme_threadx.txt @@ -0,0 +1,496 @@ + Microsoft's Azure RTOS ThreadX for ARM9 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: TX.A. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the ARM9 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=arm9 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A arm9 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for ARM9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The ARM9 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, ARM7 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for ARM9 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arm9/gnu/src/tx_thread_context_restore.S b/ports/arm9/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..a6876848 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,241 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ + MOV r0, #IRQ_MODE @ Build disable interrupts CPSR + MSR CPSR, r0 @ Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/arm9/gnu/src/tx_thread_context_save.S b/ports/arm9/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..a1552e86 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_context_save.S @@ -0,0 +1,210 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt CPSR + MSR CPSR_cxsf, r0 @ Disable interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_context_restore.S b/ports/arm9/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..81e3299b --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,256 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +SVC_MODE_BITS = 0x13 @ SVC mode value +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + MRS r3, CPSR @ Pickup current CPSR + ORR r0, r3, #DISABLE_INTS @ Build interrupt disable value + MSR CPSR_cxsf, r0 @ Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_cxsf, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_cxsf, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_cxsf, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ + BIC r4, r4, #THUMB_MASK @ Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS @ Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 @ Lockout interrupts +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MRS r3, CPSR @ Pickup current CPSR + BIC r3, r3, #MODE_MASK @ Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS @ Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_context_save.S b/ports/arm9/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..88ad7e79 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S b/ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..9705cca4 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,111 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_cxsf, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_cxsf, r0 @ Reenter IRQ mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S b/ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..fd498616 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_interrupt_control.S b/ports/arm9/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ca95b8ac --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/arm9/gnu/src/tx_thread_interrupt_disable.S b/ports/arm9/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..76570a20 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ + ORR r1, r0, #DISABLE_INTS @ Mask interrupts + MSR CPSR_cxsf, r1 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/arm9/gnu/src/tx_thread_interrupt_restore.S b/ports/arm9/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..65e01e32 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_cxsf, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/arm9/gnu/src/tx_thread_irq_nesting_end.S b/ports/arm9/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..8ee9b216 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,111 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_cxsf, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_cxsf, r0 @ Reenter IRQ mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_irq_nesting_start.S b/ports/arm9/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..7174dc11 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_schedule.S b/ports/arm9/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..fde52ec5 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_schedule.S @@ -0,0 +1,187 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS = 0xC0 @ IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS = 0x80 @ IRQ Interrupts enabled mask +#endif +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ + MRS r2, CPSR @ Pickup CPSR + BIC r0, r2, #ENABLE_INTS @ Clear the disable bit(s) + MSR CPSR_cxsf, r0 @ Enable interrupts +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ + MSR CPSR_cxsf, r2 @ Disable interrupts +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + BL _tx_execution_thread_enter @ Call the thread execution enter function +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r0, r1} @ Pickup the stack type and saved CPSR + CMP r0, #0 @ Check for synchronous context switch + MSRNE SPSR_cxsf, r1 @ Setup SPSR for return + LDMNEIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously + MSR CPSR_cxsf, r1 @ Recover CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + diff --git a/ports/arm9/gnu/src/tx_thread_stack_build.S b/ports/arm9/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..7d6f47bb --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the ARM9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/arm9/gnu/src/tx_thread_system_return.S b/ports/arm9/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..aa1599a6 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_system_return.S @@ -0,0 +1,167 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1, r4-r11, lr} @ Save minimal context +@ +@ /* Lockout interrupts. */ +@ + ORR r2, r1, #DISABLE_INTS @ Build disable interrupt CPSR + MSR CPSR_cxsf, r2 @ Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + LDR r3, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r0, [r3] @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/arm9/gnu/src/tx_thread_vectored_context_save.S b/ports/arm9/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..f69abcd9 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,199 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt CPSR + MSR CPSR_cxsf, r0 @ Disable interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/arm9/gnu/src/tx_timer_interrupt.S b/ports/arm9/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..7871d1bc --- /dev/null +++ b/ports/arm9/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/arm9/iar/example_build/azure_rtos.eww b/ports/arm9/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/arm9/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/arm9/iar/example_build/cstartup.s b/ports/arm9/iar/example_build/cstartup.s new file mode 100644 index 00000000..b95efc0e --- /dev/null +++ b/ports/arm9/iar/example_build/cstartup.s @@ -0,0 +1,161 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + ;; Enable the VFP coprocessor. + + MOV r0, #0x40000000 ; Set EN bit in VFP + FMXR fpexc, r0 ; FPEXC, clear others. + +; +; Disable underflow exceptions by setting flush to zero mode. +; For full IEEE 754 underflow compliance this code should be removed +; and the appropriate exception handler installed. +; + + MOV r0, #0x01000000 ; Set FZ bit in VFP + FMXR fpscr, r0 ; FPSCR, clear others. +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.c b/ports/arm9/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..68cd97fe --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.c @@ -0,0 +1,374 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arm9/iar/example_build/sample_threadx.dep b/ports/arm9/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..94d9a38b --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.dep @@ -0,0 +1,220 @@ + + + 4 + 3136050671 + + Debug + + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\tx_port.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\TX_ILL.s79 + $TOOLKIT_DIR$\lib\rt4t_al.a + $PROJ_DIR$\Debug\Obj\demo.r79 + $PROJ_DIR$\Debug\List\sample_threadx.map + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\lib\shs_l.a + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\tx_cstartup.s79 + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\yvals.h + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\tx_execution_profile.c + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\List\cstartup.lst + $TOOLKIT_DIR$\lib\dl4t_aln.a + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\lib\m4t_al.a + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\tx_initialize_low_level.s79 + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + [ROOT_NODE] + + + ILINK + 17 11 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 14 42 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 13 + + + BICOMP + 50 + + + __cstat + 58 + + + + + ICCARM + 57 54 41 48 35 47 29 52 46 6 53 26 45 55 56 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 40 37 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 18 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 10 + + + + + ICCARM + 3 5 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 11 + + + + + ILINK + 15 14 13 2 40 22 9 49 43 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 44 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 14 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 28 + + + BICOMP + 20 + + + + + ICCARM + 3 5 31 38 34 27 16 23 7 30 39 19 25 21 + + + BICOMP + 3 5 31 38 34 27 23 7 30 39 19 25 21 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 40 37 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.ewd b/ports/arm9/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..572d1f45 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.ewp b/ports/arm9/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..b20e89d4 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.ewt b/ports/arm9/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..a8417466 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.icf b/ports/arm9/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/arm9/iar/example_build/settings/azure_rtos.wsdt b/ports/arm9/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..0fbbf9bf --- /dev/null +++ b/ports/arm9/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 265 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000E002596000002000000138600001000000010860000090000000C8100001400000004860000020000001781000003000000148100000100000003E10000050000000E81000001000000E980000001000000118600000F00000046810000030000000D81000001000000E880000003000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000070040000000A000065050000 + 0000000059040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000005101000055040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF51010000320000005501000055040000010000000200001004000000010000003EFFFFFF9E080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000055040000000A00005904000001000000010000100400000001000000C5FBFFFF96000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000070040000000A0000650500000000000059040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..8e5310b2 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..9aeceb8c --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..f90fa82c --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=ARM9TDMI" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..60a8329a --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.crun b/ports/arm9/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.dbgdt b/ports/arm9/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..bb3377a6 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1686 @@ + + + + + + + 394 + 27 + 27 + 2010398909 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + 35 + 1470 + + + 20 + 915 + 244 + 61 + + + + 2 + 0 + 0 + + + + + + 3 + 0 + 0 + + + 0 + 1 + 0 + + + + + + + + 2 + 0 + 0 + + + 187 + 100 + 100 + 100 + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + + + + + + + + + + TabID-32281-8114 + Workspace + Workspace + + + <ws> + <ws>/sample_threadx + <ws>/sample_threadx/Common sources + <ws>/sample_threadx/Common sources/tx_cstartup.s79 + sample_threadx + sample_threadx/Common sources + sample_threadx/Output + sample_threadx/Output/sample_threadx.out + sample_threadx/Output/sample_threadx.out/Output + + + + + 0 + + + + + TabID-31758-8124 + Debug Log + Debug-Log + + + + TabID-9738-8128 + Build + Build + + + + TabID-20156-25745 + Breakpoints + Breakpoints + + + 0 + + + + + + TabID-20390-20629 + Thread List + TX-THREAD + + 1 + + + + TabID-30615-20642 + Message Queues + TX-MESSAGEQUEUE + + + TabID-30093-20652 + Semaphores + TX-SEMAPHORE + + + TabID-29570-20662 + Mutexes + TX-MUTEX + + + TabID-7028-20675 + Byte Pools + TX-BYTEPOOL + + + TabID-6505-20685 + Block Pools + TX-BLOCKPOOL + + + TabID-5982-20694 + Timers + TX-TIMER + + + TabID-5459-20704 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 197 + 7059 + 7059 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 569 + 468 + -2 + -2 + 135 + 169 + 88933 + 182505 + 309618 + 616631 + + + + + + + + + + + + + + + + -2 + -2 + 67 + 1520 + -2 + -2 + 1522 + 69 + 1002635 + 74514 + 88933 + 182505 + + + + + + + + + 65 + -2 + 264 + 1520 + -2 + 65 + 1522 + 199 + 1002635 + 214903 + 127800 + 214903 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 168 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 3C0000000E002596000002000000138600001000000010860000090000000C8100001400000004860000020000001781000003000000148100000100000003E10000050000000E81000008000000E980000001000000118600000F00000046810000030000000D81000001000000E880000003000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 1900578600001800000059920000240000002392000000000000008D00001E00000007860000280000001D9200001100000004860000250000009A860000160000000084000078000000259200001900000044920000220000001A860000320000001F9200001F0000008E8600003B00000006860000270000002D920000210000006986000038000000558600000600000023960000890000000E86000017000000A18600003C000000C386000003000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 510800004000000073090000F0000000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 510800004000000073090000F0000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 510800004000000073090000F0000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5108000040000000D10A0000D0000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5108000040000000FF090000D0000000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 510800004000000073090000F0000000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 510800004000000057090000A0010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 510800004000000057090000A0010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5108000040000000FF09000000010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5108000040000000FF09000000010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 510800004000000073090000F0000000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 510800004000000073090000F0000000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 510800004000000057090000A0010000 + 000800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFFFC0700004C000000000800009A0400000100000002000010040000000100000013F9FFFFAF010000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000020062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.dnx b/ports/arm9/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..7b11d0e2 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 530500706 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl b/ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..f90fa82c --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=ARM9TDMI" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.general.xcl b/ports/arm9/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/arm9/iar/example_build/settings/tx.crun b/ports/arm9/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/arm9/iar/example_build/settings/tx.dbgdt b/ports/arm9/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/arm9/iar/example_build/settings/tx.dnx b/ports/arm9/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/arm9/iar/example_build/tx.dep b/ports/arm9/iar/example_build/tx.dep new file mode 100644 index 00000000..ffa06c4e --- /dev/null +++ b/ports/arm9/iar/example_build/tx.dep @@ -0,0 +1,9603 @@ + + + 4 + 501655296 + + Debug + + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Tx_timcr.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\txe_thread_wait_abort.c + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\txe_timer_delete.c + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\txe_timer_create.c + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Tx_efig.c + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 124 + + + BICOMP + 686 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 600 + + + BICOMP + 109 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 613 + + + BICOMP + 121 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 28 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 55 + + + BICOMP + 75 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 334 358 357 347 33 360 43 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 62 + + + BICOMP + 100 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 33 + + + BICOMP + 358 334 357 347 196 230 360 43 33 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 78 + + + BICOMP + 82 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 28 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 515 + + + BICOMP + 159 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 753 + + + BICOMP + 714 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 28 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 447 + + + BICOMP + 484 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 10 196 255 227 220 28 12 45 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 10 196 255 227 220 28 12 45 33 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 756 + + + BICOMP + 428 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 637 + + + BICOMP + 86 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 522 + + + BICOMP + 88 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 12 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 618 + + + BICOMP + 562 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 334 358 357 347 33 360 43 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 99 + + + BICOMP + 364 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 28 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 711 + + + BICOMP + 666 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 12 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 92 + + + BICOMP + 662 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 251 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 12 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 115 + + + BICOMP + 558 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 597 + + + BICOMP + 509 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 566 + + + BICOMP + 735 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 33 + + + BICOMP + 360 251 334 357 358 347 43 33 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 116 + + + BICOMP + 518 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 12 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 142 + + + BICOMP + 607 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 617 + + + BICOMP + 473 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 652 + + + BICOMP + 445 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 28 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 464 + + + BICOMP + 564 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 28 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 139 + + + BICOMP + 752 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 33 + + + BICOMP + 360 33 251 230 334 357 358 347 43 196 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 737 + + + BICOMP + 350 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 33 + + + BICOMP + 360 33 251 334 357 358 347 43 196 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 554 + + + BICOMP + 621 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 33 + + + BICOMP + 360 33 251 334 357 358 347 43 196 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 371 + + + BICOMP + 122 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 334 358 357 347 33 360 43 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 654 + + + BICOMP + 378 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 28 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 624 + + + BICOMP + 414 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 33 + + + BICOMP + 358 334 230 357 347 196 360 43 33 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 689 + + + BICOMP + 407 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 33 + + + BICOMP + 358 334 230 357 347 196 360 43 33 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 528 + + + BICOMP + 102 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 389 357 45 345 390 347 43 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 614 + + + BICOMP + 595 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 33 + + + BICOMP + 360 251 334 357 358 347 43 33 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 708 + + + BICOMP + 707 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 45 + + + BICOMP + 345 347 357 390 251 389 43 45 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 70 + + + BICOMP + 631 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 45 + + + BICOMP + 389 230 357 196 345 390 347 43 45 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 588 + + + BICOMP + 63 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 45 + + + BICOMP + 345 347 357 45 390 251 389 43 196 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 394 + + + BICOMP + 465 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 389 357 45 345 390 347 43 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 663 + + + BICOMP + 388 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 389 357 45 345 390 347 43 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 623 + + + BICOMP + 439 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 45 + + + BICOMP + 345 347 357 45 390 251 389 43 196 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 80 + + + BICOMP + 462 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 45 + + + BICOMP + 389 230 357 196 345 390 347 43 45 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 725 + + + BICOMP + 96 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 45 + + + BICOMP + 345 347 357 45 390 251 389 43 196 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 728 + + + BICOMP + 444 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 45 + + + BICOMP + 345 347 357 390 251 389 43 45 230 391 351 380 334 358 360 + + + + + [ROOT_NODE] + + + IARCHIVE + 338 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 43 230 590 160 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 43 230 557 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 43 230 590 160 49 424 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 43 230 557 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 43 230 729 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 43 230 691 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 130 + + + BICOMP + 104 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 459 + + + BICOMP + 141 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 93 + + + BICOMP + 535 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 95 + + + BICOMP + 730 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 227 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 688 + + + BICOMP + 366 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 10 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 10 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 537 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 164 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 581 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 661 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 530 + + + BICOMP + 599 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 502 + + + BICOMP + 695 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 442 + + + BICOMP + 638 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 416 + + + BICOMP + 553 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 538 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 461 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 511 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 592 + + + BICOMP + 625 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 632 + + + BICOMP + 512 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 57 + + + BICOMP + 403 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 155 + + + BICOMP + 136 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 10 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 10 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 138 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 84 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 665 + + + BICOMP + 641 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 548 + + + BICOMP + 524 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 755 + + + BICOMP + 128 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 458 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 539 + + + BICOMP + 719 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 709 + + + BICOMP + 427 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 81 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 611 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 684 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 504 + + + BICOMP + 622 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 377 + + + BICOMP + 117 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 393 + + + BICOMP + 742 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 384 + + + BICOMP + 570 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 759 + + + BICOMP + 718 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 585 + + + BICOMP + 593 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 486 + + + BICOMP + 85 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 227 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 741 + + + BICOMP + 101 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 79 + + + BICOMP + 533 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 227 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 612 + + + BICOMP + 151 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 683 + + + BICOMP + 673 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 90 + + + BICOMP + 596 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 373 + + + BICOMP + 376 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 761 + + + BICOMP + 455 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 169 + + + BICOMP + 369 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 220 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 51 + + + BICOMP + 655 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 490 + + + BICOMP + 598 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 12 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 555 + + + BICOMP + 660 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 220 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 525 + + + BICOMP + 715 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 423 + + + BICOMP + 153 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 220 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 449 + + + BICOMP + 446 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 220 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 736 + + + BICOMP + 483 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 140 + + + BICOMP + 468 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 750 + + + BICOMP + 505 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 385 + + + BICOMP + 402 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 64 + + + BICOMP + 409 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 671 + + + BICOMP + 477 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 717 + + + BICOMP + 720 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 227 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 173 + + + BICOMP + 704 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 703 + + + BICOMP + 579 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 147 + + + BICOMP + 367 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 67 + + + BICOMP + 716 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 421 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 470 + + + BICOMP + 98 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 480 + + + BICOMP + 460 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 758 + + + BICOMP + 677 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 519 + + + BICOMP + 448 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 196 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 547 + + + BICOMP + 343 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 196 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 441 + + + BICOMP + 620 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 152 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 699 + + + BICOMP + 374 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 471 + + + BICOMP + 469 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 523 + + + BICOMP + 552 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 727 + + + BICOMP + 431 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 368 + + + BICOMP + 628 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 251 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 56 + + + BICOMP + 610 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 527 + + + BICOMP + 106 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 692 + + + BICOMP + 332 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 342 + + + BICOMP + 397 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 606 + + + BICOMP + 392 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 375 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 355 + + + BICOMP + 567 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 418 + + + BICOMP + 476 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 167 + + + BICOMP + 494 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 71 + + + BICOMP + 135 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 158 + + + BICOMP + 520 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 492 + + + BICOMP + 653 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 501 + + + BICOMP + 97 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 166 + + + BICOMP + 580 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 103 + + + BICOMP + 94 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 406 + + + BICOMP + 650 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 457 + + + BICOMP + 500 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 45 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 453 + + + BICOMP + 549 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 45 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 133 + + + BICOMP + 65 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 87 + + + BICOMP + 73 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 546 + + + BICOMP + 532 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 543 + + + BICOMP + 146 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 45 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 370 + + + BICOMP + 647 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 45 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 145 + + + BICOMP + 667 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 33 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 48 + + + BICOMP + 485 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 60 + + + BICOMP + 365 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 33 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 72 + + + BICOMP + 745 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 28 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 52 + + + BICOMP + 496 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 28 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 626 + + + BICOMP + 721 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 28 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 635 + + + BICOMP + 682 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 576 + + + BICOMP + 426 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 12 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 105 + + + BICOMP + 422 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 12 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 642 + + + BICOMP + 578 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 542 + + + BICOMP + 740 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 33 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 150 + + + BICOMP + 58 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 33 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 754 + + + BICOMP + 506 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 45 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 508 + + + BICOMP + 479 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 712 + + + BICOMP + 747 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 45 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 536 + + + BICOMP + 541 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 491 + + + BICOMP + 507 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 137 + + + BICOMP + 700 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 50 + + + BICOMP + 110 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 33 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 149 + + + BICOMP + 651 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 33 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 734 + + + BICOMP + 679 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 454 + + + BICOMP + 658 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 526 + + + BICOMP + 437 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 227 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 359 + + + BICOMP + 434 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 157 + + + BICOMP + 521 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 382 + + + BICOMP + 162 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 676 + + + BICOMP + 560 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 148 + + + BICOMP + 383 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 587 + + + BICOMP + 751 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 698 + + + BICOMP + 748 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 108 + + + BICOMP + 657 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 615 + + + BICOMP + 107 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 636 + + + BICOMP + 170 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 534 + + + BICOMP + 732 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 372 + + + BICOMP + 583 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 648 + + + BICOMP + 540 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 713 + + + BICOMP + 550 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 255 196 220 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 165 + + + BICOMP + 125 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 436 + + + BICOMP + 472 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 608 + + + BICOMP + 123 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 59 + + + BICOMP + 702 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 456 + + + BICOMP + 69 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 696 + + + BICOMP + 705 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 605 + + + BICOMP + 466 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 127 + + + BICOMP + 723 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 551 + + + BICOMP + 429 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 12 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 577 + + + BICOMP + 584 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 482 + + + BICOMP + 353 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 668 + + + BICOMP + 354 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 227 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 134 + + + BICOMP + 335 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 10 12 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 463 + + + BICOMP + 61 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 706 + + + BICOMP + 675 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 227 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 569 + + + BICOMP + 163 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 80 70 708 588 728 528 394 663 623 725 624 689 614 554 566 618 55 371 737 62 139 78 99 464 654 652 124 600 515 613 753 711 447 756 637 814 522 92 115 597 116 142 617 64 51 490 377 169 449 736 525 683 555 90 671 585 750 385 373 423 612 717 79 140 504 486 741 393 384 759 761 95 458 537 688 665 502 138 164 81 581 442 530 416 684 538 511 661 461 592 93 632 539 548 57 155 84 130 755 709 611 459 56 758 355 547 152 519 441 368 71 492 375 606 418 501 167 158 527 173 703 147 692 67 421 470 699 480 471 342 523 727 642 536 546 133 103 508 87 491 406 48 543 457 754 453 712 370 542 50 149 145 150 60 72 52 626 635 137 166 576 105 551 359 127 134 713 577 372 615 608 696 482 463 734 605 668 706 526 454 59 148 698 587 157 382 456 676 108 636 534 648 165 436 435 574 544 569 475 129 111 749 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 435 + + + BICOMP + 91 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 749 + + + BICOMP + 591 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 574 + + + BICOMP + 481 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 129 + + + BICOMP + 54 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 544 + + + BICOMP + 333 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 111 + + + BICOMP + 83 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 475 + + + BICOMP + 132 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 43 230 160 746 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 43 230 160 590 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 43 230 656 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 43 230 49 160 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 43 230 590 160 49 729 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 43 230 160 49 590 424 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 43 230 746 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 43 230 746 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 43 230 590 160 49 691 656 746 729 557 424 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 43 230 424 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 43 230 656 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 43 230 424 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 43 230 49 160 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 43 230 590 160 49 557 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 43 230 590 160 49 424 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 43 230 691 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 43 230 49 160 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 43 230 160 746 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 43 230 590 160 49 557 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 43 230 590 160 49 691 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 43 230 729 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 43 230 590 160 49 557 + + + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 462 631 707 63 444 102 465 388 439 96 414 407 595 621 735 562 75 122 350 100 752 82 364 564 378 445 686 109 159 121 714 666 484 428 86 88 662 558 509 518 607 473 409 655 598 117 369 446 483 715 673 660 596 477 593 505 402 376 153 151 720 533 468 622 85 101 742 570 718 455 730 366 641 695 638 599 553 625 535 512 719 524 403 136 104 128 427 141 610 677 567 343 448 620 628 135 653 392 476 97 494 520 106 704 579 367 332 716 98 374 460 469 397 552 431 578 541 532 65 94 479 73 507 650 485 146 500 506 549 747 647 740 110 651 667 58 365 745 496 721 682 700 580 426 422 429 434 723 335 550 584 583 107 123 705 353 61 679 466 354 675 437 658 702 383 748 751 521 162 69 560 657 170 732 540 125 472 91 481 333 163 132 54 83 591 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 43 230 729 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 43 230 590 160 49 746 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 43 230 656 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 43 230 590 160 49 656 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 43 230 160 590 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 43 230 590 160 49 746 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 43 230 590 160 49 729 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 480 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 471 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 523 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 508 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 406 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 48 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 543 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 453 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 370 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 342 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 536 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 546 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 542 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 50 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 87 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 149 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 145 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 150 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 60 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 754 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 727 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 72 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 52 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 133 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 470 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 103 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 712 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 491 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 642 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 457 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 699 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 574 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 108 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 436 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 676 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 475 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 129 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 435 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 636 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 534 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 165 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 544 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 111 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 569 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 749 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 648 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 725 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 689 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 554 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 528 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 566 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 614 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 624 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 588 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 80 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 728 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 394 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 663 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 708 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 70 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 623 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 776 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 511 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 684 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 581 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 661 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 375 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 538 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 611 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 81 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 461 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 421 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 711 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 768 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 537 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 458 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 138 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 164 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 84 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 152 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 142 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 92 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 773 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 124 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 737 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 99 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 464 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 51 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 515 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 652 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 753 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 115 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 490 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 814 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 618 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 522 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 377 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 600 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 613 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 62 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 78 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 756 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 55 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 447 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 775 765 774 771 772 770 768 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 637 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 371 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 139 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 116 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 597 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 617 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 64 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 654 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 384 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 761 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 442 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 530 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 665 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 502 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 671 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 140 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 759 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 416 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 486 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 741 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 525 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 95 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 750 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 169 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 585 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 717 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 79 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 504 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 385 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 683 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 423 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 90 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 393 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 449 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 688 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 775 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 612 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 555 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 736 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 373 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 696 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 137 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 734 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 127 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 166 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 577 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 372 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 668 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 148 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 587 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 626 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 576 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 551 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 134 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 605 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 526 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 454 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 706 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 615 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 59 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 713 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 463 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 608 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 157 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 482 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 382 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 359 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 698 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 456 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 105 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 635 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 606 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 709 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 418 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 368 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 167 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 459 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 547 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 155 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 775 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 158 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 527 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 71 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 501 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 519 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 147 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 355 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 692 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 592 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 56 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 492 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 173 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 703 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 441 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 67 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 93 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 130 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 755 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 632 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 539 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 548 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 57 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 758 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/arm9/iar/example_build/tx.ewd b/ports/arm9/iar/example_build/tx.ewd new file mode 100644 index 00000000..c9ab0958 --- /dev/null +++ b/ports/arm9/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/arm9/iar/example_build/tx.ewp b/ports/arm9/iar/example_build/tx.ewp new file mode 100644 index 00000000..82bc09aa --- /dev/null +++ b/ports/arm9/iar/example_build/tx.ewp @@ -0,0 +1,2766 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/arm9/iar/example_build/tx.ewt b/ports/arm9/iar/example_build/tx.ewt new file mode 100644 index 00000000..2149bed8 --- /dev/null +++ b/ports/arm9/iar/example_build/tx.ewt @@ -0,0 +1,3427 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/arm9/iar/example_build/tx_initialize_low_level.s b/ports/arm9/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..36bcc6a3 --- /dev/null +++ b/ports/arm9/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/arm9/iar/inc/tx_port.h b/ports/arm9/iar/inc/tx_port.h new file mode 100644 index 00000000..ed501c4b --- /dev/null +++ b/ports/arm9/iar/inc/tx_port.h @@ -0,0 +1,388 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARM9/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARM9/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/arm9/iar/readme_threadx.txt b/ports/arm9/iar/readme_threadx.txt new file mode 100644 index 00000000..67ea7d01 --- /dev/null +++ b/ports/arm9/iar/readme_threadx.txt @@ -0,0 +1,528 @@ + Microsoft's Azure RTOS ThreadX for ARM9 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based ARM9 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's ARM9 simulator. + +A SPECIAL NOTE: The IAR ARM simulator does simulate interrupts. In order +for the ThreadX demonstration to run properly, a periodic IRQ interrupt must +be setup in the IAR debugging environment. We recommend setting an IRQ +interrupt to execute every 9999 cycles. + + +3. System Initialization + +The entry point in ThreadX for the ARM9 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for ARM9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The ARM9 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, ARM9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/ARM9 Mixed Mode + +By default, ThreadX is setup for running in ARM9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for ARM9 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arm9/iar/src/tx_iar.c b/ports/arm9/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/arm9/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/arm9/iar/src/tx_thread_context_restore.s b/ports/arm9/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..8f8f4047 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_context_restore.s @@ -0,0 +1,245 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_context_save.s b/ports/arm9/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..8d39c7f0 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_context_save.s @@ -0,0 +1,211 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_context_restore.s b/ports/arm9/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..3d9b735f --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,257 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_context_save.s b/ports/arm9/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..3c65cda2 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_nesting_end.s b/ports/arm9/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..673c912a --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_nesting_start.s b/ports/arm9/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..b4bd8c67 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_interrupt_control.s b/ports/arm9/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..6c02c8e3 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/arm9/iar/src/tx_thread_interrupt_disable.s b/ports/arm9/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..4b36594c --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/arm9/iar/src/tx_thread_interrupt_restore.s b/ports/arm9/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..0a929e6d --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/arm9/iar/src/tx_thread_irq_nesting_end.s b/ports/arm9/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..93db4900 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_irq_nesting_start.s b/ports/arm9/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..300f7838 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_schedule.s b/ports/arm9/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..09e832e1 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_schedule.s @@ -0,0 +1,171 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + BL _tx_execution_thread_enter ; Call the thread execution enter function +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r0, r1} ; Pickup the stack type and saved CPSR + CMP r0, #0 ; Check for synchronous context switch + MSRNE SPSR_cxsf, r1 ; Setup SPSR for return + LDMNEIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r1 ; Recover CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + END + diff --git a/ports/arm9/iar/src/tx_thread_stack_build.s b/ports/arm9/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..fcf39a3f --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARM9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/arm9/iar/src/tx_thread_system_return.s b/ports/arm9/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..5212168d --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_system_return.s @@ -0,0 +1,149 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1, r4-r11, lr} ; Save minimal context +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r3, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r0, [r3, #0] ; Pickup current thread pointer + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r0, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r0, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r3, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/arm9/iar/src/tx_thread_vectored_context_save.s b/ports/arm9/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..cf11f910 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/arm9/iar/src/tx_timer_interrupt.s b/ports/arm9/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..1a508c6a --- /dev/null +++ b/ports/arm9/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/c667x/ccs/example_build/include/C66XX.h b/ports/c667x/ccs/example_build/include/C66XX.h new file mode 100644 index 00000000..581b563e --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX.h @@ -0,0 +1,150 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + Definitions, macros and API functions for DSP Environment. + (C) MicroLAB Systems, 2015 + + + http://www.mlabsys.com + ftp://ftp.mlabsys.com + email: techsupport@mlabsys.com + + + Description: + ------------ + This file contains definitions, macros and API functions for KeyStone + Multicore DSP environment and must be included in the user C-application. + DSP Software Development Kit library is based on TI Chip Support Library + (CSL), so it's needed to add CSL libraries into the project along with DSP + Software Development Kit library. + + Note that C66xx CorePac interrupt controller (INTC) functions are not + included in this DSP Software Utilities library. + It's delivered as a separate library from the remaining DSP Software + Utilities. When using an embedded operating system that contains interrupt + controller/dispatcher support, do not link in the INTC library. + For interrupt controller support, SYS/BIOS users should use + the HWI (Hardware Interrupt) and ECM (Event Combiner Manager) modules + supported under SYS/BIOS v5.21 or later. + + + Revision history: + ----------------- + rev.1A - 2014, initial release for C6678 DSP. + rev.1B - 2015, fixed minor bugs. + rev.1C - 2015: + - changed C66XX_init_ddr3() DDR3 initialization + function; + - added DSP chip-level (CPINTC) interrupt controller + functions; + rev.2A - 2015, totally redesigned DSP SDK; + + + Notes: + ------ + 1. This C-header file is an include file for TI C6xxx C/C++ Code + Generation Tools, which must be invoked to compile code for C66xx DSP + platform. + + 2. The following additional libraries should be included: + TI Chip Support Library (CSL) (ti.csl.ae66) should be included in + Linker options (this library is located at + $(TI_PDK_C6678_INSTALL_DIR)\packages\ti\csl\lib). + + 3. This file is best viewed with the TAB setting set to '4'. + + 4. This header file is externally controlled from user C-code by run-time + compiler keys definitions in order to apply DSP-type specific + definitions to refer to particular definitions included for different + DSP type: + + __C66XX_SELECT_C6678_DSP__ + - if defined in user code prior inclusion of this header file, + then DSP-type specific definitions are applied to C6678 DSP + + Copyright: + ---------- + This utility is supplied free of charge as it is without any obligation + from MicroLAB Systems. No responsibility is assumed for any use or misuse + of these utilities. + +******************************************************************************/ + + +/** + * @file C66XX.h + * + * @brief KeyStone Multicore DSP SDK include file + * + * This file contains definitions, macros and API functions for KeyStone + * Multicore DSP environment + * + */ + + +#ifndef __C66XX_H__ // check for this file has been already included +#define __C66XX_H__ 1 + + +// General defs +#define C66XX_ON 1 +#define C66XX_OFF 0 + + +//============================================================================= +//------------ DSP-type specific run-time compiler keys processing ------------ +// (this is required in order to exclude key confusions) + +// Default setting is C6678 definitions +#ifndef __C66XX_SELECT_C6678_DSP__ +#define __C66XX_SELECT_C6678_DSP__ 1 +#endif /* __C66XX_SELECT_C6678_DSP__ */ + +//============================================================================= + + +/** KeyStone Multicore DSP SDK revision ID */ +#define C66XX_SDK_REVISION_ID "2A" + + +// Include TI Chip Support Library (CSL) defs +// CSL Chip Functional Layer +#include +// CSL TSC Functional Layer +#include +// CSL Cache Functional Layer +#include +// CSL Boot configuration defs +#include +// CSL Power and Sleep Controller defs +#include +// CSL XMC Controller defs +#include +// CSL DDR3 defs +#include +#include +// CSL INTC defs +#include +// CSL CPINTC defs +#include +// CSL SGMII defs +#include +#include +// CSL GPIO Functional Layer +#include +// CSL Timer Functional Layer +#include +// CSL UART Functional Layer +#include +// CSL SRIO Functional Layer +#include +#include + + +// Include C66xx DSP defs, macros and aux functions +#include "C66XX_DEF.hxx" +#include "C66XX_MACROS.hxx" +#include "C66XX_FUNCTIONS.hxx" + + +//============================================================================= +#endif /* __C66XX_H__ */ diff --git a/ports/c667x/ccs/example_build/include/C66XX_DEF.hxx b/ports/c667x/ccs/example_build/include/C66XX_DEF.hxx new file mode 100644 index 00000000..9764a47f --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX_DEF.hxx @@ -0,0 +1,1678 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + (C) MicroLAB Systems, 2014-2015 + + File: Definitions + ----- + + Notes: + ------ + 1. This C-header file contains general DSP definitions and + is used with C66XX.h C-header file. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file C66XX_DEF.hxx + * + * @brief Definitions + * + * This file contains general C66xx DSP definitions + * + */ + + +#ifndef __C66XX_DEF_HXX__ // check for this file has been already included +#define __C66XX_DEF_HXX__ 1 + + +//============================================================================= +//============ DSP CPU ID ===================================================== +//============================================================================= + +// DSP CPU ID is located at CSR register and is used to identify the chip +#define C66XX_DSP_CPU_ID 0x15 +//============================================================================= + + + +#ifdef __C66XX_SELECT_C6678_DSP__ +//============================================================================= +//============ DSP cores number =============================================== +//============================================================================= +#define C66XX_DSP_NUMBER_OF_CORES 8 +//============================================================================= + + +//============================================================================= +//============ DSP memory map ================================================= +//============================================================================= +// All address ranges refer to 32-bit LOGICAL addresses!!! + +// Local L2 SRAM - 512KB +#define C66XX_LOCAL_L2_SRAM_SADDR 0x00800000 +#define C66XX_LOCAL_L2_SRAM_EADDR 0x0087ffff +#define C66XX_LOCAL_L2_SRAM_LEN (C66XX_LOCAL_L2_SRAM_EADDR - C66XX_LOCAL_L2_SRAM_SADDR + 1) + +// Local L1P SRAM - 32KB +#define C66XX_LOCAL_L1P_SRAM_SADDR 0x00e00000 +#define C66XX_LOCAL_L1P_SRAM_EADDR 0x00e07fff +#define C66XX_LOCAL_L1P_SRAM_LEN (C66XX_LOCAL_L1P_SRAM_EADDR - C66XX_LOCAL_L1P_SRAM_SADDR + 1) + +// Local L1D SRAM - 32KB +#define C66XX_LOCAL_L1D_SRAM_SADDR 0x00f00000 +#define C66XX_LOCAL_L1D_SRAM_EADDR 0x00f07fff +#define C66XX_LOCAL_L1D_SRAM_LEN (C66XX_LOCAL_L1D_SRAM_EADDR - C66XX_LOCAL_L1D_SRAM_SADDR + 1) + +// C66xx CorePack registers area - 4MB +#define C66XX_DSP_RG_AREA_SADDR 0x01800000 +#define C66XX_DSP_RG_AREA_EADDR 0x01bfffff +#define C66XX_DSP_RG_AREA_LEN (C66XX_DSP_RG_AREA_EADDR - C66XX_DSP_RG_AREA_SADDR + 1) + +// Tracer MSMC 0 registers area - 128B +#define C66XX_TRACER_MSMC_0_RG_AREA_SADDR 0x01d00000 +#define C66XX_TRACER_MSMC_0_RG_AREA_EADDR 0x01d0007f +#define C66XX_TRACER_MSMC_0_RG_AREA_LEN (C66XX_TRACER_MSMC_0_RG_AREA_EADDR - C66XX_TRACER_MSMC_0_RG_AREA_SADDR + 1) + +// Tracer MSMC 1 registers area - 128B +#define C66XX_TRACER_MSMC_1_RG_AREA_SADDR 0x01d08000 +#define C66XX_TRACER_MSMC_1_RG_AREA_EADDR 0x01d0807f +#define C66XX_TRACER_MSMC_1_RG_AREA_LEN (C66XX_TRACER_MSMC_1_RG_AREA_EADDR - C66XX_TRACER_MSMC_1_RG_AREA_SADDR + 1) + +// Tracer MSMC 2 registers area - 128B +#define C66XX_TRACER_MSMC_2_RG_AREA_SADDR 0x01d10000 +#define C66XX_TRACER_MSMC_2_RG_AREA_EADDR 0x01d1007f +#define C66XX_TRACER_MSMC_2_RG_AREA_LEN (C66XX_TRACER_MSMC_2_RG_AREA_EADDR - C66XX_TRACER_MSMC_2_RG_AREA_SADDR + 1) + +// Tracer MSMC 3 registers area - 128B +#define C66XX_TRACER_MSMC_3_RG_AREA_SADDR 0x01d18000 +#define C66XX_TRACER_MSMC_3_RG_AREA_EADDR 0x01d1807f +#define C66XX_TRACER_MSMC_3_RG_AREA_LEN (C66XX_TRACER_MSMC_3_RG_AREA_EADDR - C66XX_TRACER_MSMC_3_RG_AREA_SADDR + 1) + +// Tracer QM DMA registers area - 128B +#define C66XX_TRACER_QM_DMA_RG_AREA_SADDR 0x01d20000 +#define C66XX_TRACER_QM_DMA_RG_AREA_EADDR 0x01d2007f +#define C66XX_TRACER_QM_DMA_RG_AREA_LEN (C66XX_TRACER_QM_DMA_RG_AREA_EADDR - C66XX_TRACER_QM_DMA_RG_AREA_SADDR + 1) + +// Tracer DDR registers area - 128B +#define C66XX_TRACER_DDR_RG_AREA_SADDR 0x01d28000 +#define C66XX_TRACER_DDR_RG_AREA_EADDR 0x01d2807f +#define C66XX_TRACER_DDR_RG_AREA_LEN (C66XX_TRACER_DDR_RG_AREA_EADDR - C66XX_TRACER_DDR_RG_AREA_SADDR + 1) + +// Tracer SM registers area - 128B +#define C66XX_TRACER_SM_RG_AREA_SADDR 0x01d30000 +#define C66XX_TRACER_SM_RG_AREA_EADDR 0x01d3007f +#define C66XX_TRACER_SM_RG_AREA_LEN (C66XX_TRACER_SM_RG_AREA_EADDR - C66XX_TRACER_SM_RG_AREA_SADDR + 1) + +// Tracer QM CFG registers area - 128B +#define C66XX_TRACER_QM_CFG_RG_AREA_SADDR 0x01d38000 +#define C66XX_TRACER_QM_CFG_RG_AREA_EADDR 0x01d3807f +#define C66XX_TRACER_QM_CFG_RG_AREA_LEN (C66XX_TRACER_QM_CFG_RG_AREA_EADDR - C66XX_TRACER_QM_CFG_RG_AREA_SADDR + 1) + +// Tracer CFG registers area - 128B +#define C66XX_TRACER_CFG_RG_AREA_SADDR 0x01d40000 +#define C66XX_TRACER_CFG_RG_AREA_EADDR 0x01d4007f +#define C66XX_TRACER_CFG_RG_AREA_LEN (C66XX_TRACER_CFG_RG_AREA_EADDR - C66XX_TRACER_CFG_RG_AREA_SADDR + 1) + +// Tracer L2 0 registers area - 128B +#define C66XX_TRACER_L2_0_RG_AREA_SADDR 0x01d48000 +#define C66XX_TRACER_L2_0_RG_AREA_EADDR 0x01d4807f +#define C66XX_TRACER_L2_0_RG_AREA_LEN (C66XX_TRACER_L2_0_RG_AREA_EADDR - C66XX_TRACER_L2_0_RG_AREA_SADDR + 1) + +// Tracer L2 1 registers area - 128B +#define C66XX_TRACER_L2_1_RG_AREA_SADDR 0x01d50000 +#define C66XX_TRACER_L2_1_RG_AREA_EADDR 0x01d5007f +#define C66XX_TRACER_L2_1_RG_AREA_LEN (C66XX_TRACER_L2_1_RG_AREA_EADDR - C66XX_TRACER_L2_1_RG_AREA_SADDR + 1) + +// Tracer L2 2 registers area - 128B +#define C66XX_TRACER_L2_2_RG_AREA_SADDR 0x01d58000 +#define C66XX_TRACER_L2_2_RG_AREA_EADDR 0x01d5807f +#define C66XX_TRACER_L2_2_RG_AREA_LEN (C66XX_TRACER_L2_2_RG_AREA_EADDR - C66XX_TRACER_L2_2_RG_AREA_SADDR + 1) + +// Tracer L2 3 registers area - 128B +#define C66XX_TRACER_L2_3_RG_AREA_SADDR 0x01d60000 +#define C66XX_TRACER_L2_3_RG_AREA_EADDR 0x01d6007f +#define C66XX_TRACER_L2_3_RG_AREA_LEN (C66XX_TRACER_L2_3_RG_AREA_EADDR - C66XX_TRACER_L2_3_RG_AREA_SADDR + 1) + +// Tracer L2 4 registers area - 128B +#define C66XX_TRACER_L2_4_RG_AREA_SADDR 0x01d68000 +#define C66XX_TRACER_L2_4_RG_AREA_EADDR 0x01d6807f +#define C66XX_TRACER_L2_4_RG_AREA_LEN (C66XX_TRACER_L2_4_RG_AREA_EADDR - C66XX_TRACER_L2_4_RG_AREA_SADDR + 1) + +// Tracer L2 5 registers area - 128B +#define C66XX_TRACER_L2_5_RG_AREA_SADDR 0x01d70000 +#define C66XX_TRACER_L2_5_RG_AREA_EADDR 0x01d7007f +#define C66XX_TRACER_L2_5_RG_AREA_LEN (C66XX_TRACER_L2_5_RG_AREA_EADDR - C66XX_TRACER_L2_5_RG_AREA_SADDR + 1) + +// Tracer L2 6 registers area - 128B +#define C66XX_TRACER_L2_6_RG_AREA_SADDR 0x01d78000 +#define C66XX_TRACER_L2_6_RG_AREA_EADDR 0x01d7807f +#define C66XX_TRACER_L2_6_RG_AREA_LEN (C66XX_TRACER_L2_6_RG_AREA_EADDR - C66XX_TRACER_L2_6_RG_AREA_SADDR + 1) + +// Tracer L2 7 registers area - 128B +#define C66XX_TRACER_L2_7_RG_AREA_SADDR 0x01d80000 +#define C66XX_TRACER_L2_7_RG_AREA_EADDR 0x01d8007f +#define C66XX_TRACER_L2_7_RG_AREA_LEN (C66XX_TRACER_L2_7_RG_AREA_EADDR - C66XX_TRACER_L2_7_RG_AREA_SADDR + 1) + +// Telecom Serial Interface Port (TSIP) 0 registers area - 256KB +#define C66XX_TSIP_0_RG_AREA_SADDR 0x01e00000 +#define C66XX_TSIP_0_RG_AREA_EADDR 0x01e3ffff +#define C66XX_TSIP_0_RG_AREA_LEN (C66XX_TSIP_0_RG_AREA_EADDR - C66XX_TSIP_0_RG_AREA_SADDR + 1) + +// Telecom Serial Interface Port (TSIP) 1 registers area - 256KB +#define C66XX_TSIP_1_RG_AREA_SADDR 0x01e80000 +#define C66XX_TSIP_1_RG_AREA_EADDR 0x01ebffff +#define C66XX_TSIP_1_RG_AREA_LEN (C66XX_TSIP_1_RG_AREA_EADDR - C66XX_TSIP_1_RG_AREA_SADDR + 1) + +// Network Coprocessor (NETCP) registers area - 1MB +#define C66XX_NETCP_RG_AREA_SADDR 0x02000000 +#define C66XX_NETCP_RG_AREA_EADDR 0x020fffff +#define C66XX_NETCP_RG_AREA_LEN (C66XX_NETCP_RG_AREA_EADDR - C66XX_NETCP_RG_AREA_SADDR + 1) + +// Timer0 registers area - 128B +#define C66XX_TIMER_0_RG_AREA_SADDR 0x02200000 +#define C66XX_TIMER_0_RG_AREA_EADDR 0x0220007f +#define C66XX_TIMER_0_RG_AREA_LEN (C66XX_TIMER_0_RG_AREA_EADDR - C66XX_TIMER_0_RG_AREA_SADDR + 1) + +// Timer1 registers area - 128B +#define C66XX_TIMER_1_RG_AREA_SADDR 0x02210000 +#define C66XX_TIMER_1_RG_AREA_EADDR 0x0221007f +#define C66XX_TIMER_1_RG_AREA_LEN (C66XX_TIMER_1_RG_AREA_EADDR - C66XX_TIMER_1_RG_AREA_SADDR + 1) + +// Timer2 registers area - 128B +#define C66XX_TIMER_2_RG_AREA_SADDR 0x02220000 +#define C66XX_TIMER_2_RG_AREA_EADDR 0x0222007f +#define C66XX_TIMER_2_RG_AREA_LEN (C66XX_TIMER_2_RG_AREA_EADDR - C66XX_TIMER_2_RG_AREA_SADDR + 1) + +// Timer3 registers area - 128B +#define C66XX_TIMER_3_RG_AREA_SADDR 0x02230000 +#define C66XX_TIMER_3_RG_AREA_EADDR 0x0223007f +#define C66XX_TIMER_3_RG_AREA_LEN (C66XX_TIMER_3_RG_AREA_EADDR - C66XX_TIMER_3_RG_AREA_SADDR + 1) + +// Timer4 registers area - 128B +#define C66XX_TIMER_4_RG_AREA_SADDR 0x02240000 +#define C66XX_TIMER_4_RG_AREA_EADDR 0x0224007f +#define C66XX_TIMER_4_RG_AREA_LEN (C66XX_TIMER_4_RG_AREA_EADDR - C66XX_TIMER_4_RG_AREA_SADDR + 1) + +// Timer5 registers area - 128B +#define C66XX_TIMER_5_RG_AREA_SADDR 0x02250000 +#define C66XX_TIMER_5_RG_AREA_EADDR 0x0225007f +#define C66XX_TIMER_5_RG_AREA_LEN (C66XX_TIMER_5_RG_AREA_EADDR - C66XX_TIMER_5_RG_AREA_SADDR + 1) + +// Timer6 registers area - 128B +#define C66XX_TIMER_6_RG_AREA_SADDR 0x02260000 +#define C66XX_TIMER_6_RG_AREA_EADDR 0x0226007f +#define C66XX_TIMER_6_RG_AREA_LEN (C66XX_TIMER_6_RG_AREA_EADDR - C66XX_TIMER_6_RG_AREA_SADDR + 1) + +// Timer7 registers area - 128B +#define C66XX_TIMER_7_RG_AREA_SADDR 0x02270000 +#define C66XX_TIMER_7_RG_AREA_EADDR 0x0227007f +#define C66XX_TIMER_7_RG_AREA_LEN (C66XX_TIMER_7_RG_AREA_EADDR - C66XX_TIMER_7_RG_AREA_SADDR + 1) + +// Timer8 registers area - 128B +#define C66XX_TIMER_8_RG_AREA_SADDR 0x02280000 +#define C66XX_TIMER_8_RG_AREA_EADDR 0x0228007f +#define C66XX_TIMER_8_RG_AREA_LEN (C66XX_TIMER_8_RG_AREA_EADDR - C66XX_TIMER_8_RG_AREA_SADDR + 1) + +// Timer9 registers area - 128B +#define C66XX_TIMER_9_RG_AREA_SADDR 0x02290000 +#define C66XX_TIMER_9_RG_AREA_EADDR 0x0229007f +#define C66XX_TIMER_9_RG_AREA_LEN (C66XX_TIMER_9_RG_AREA_EADDR - C66XX_TIMER_9_RG_AREA_SADDR + 1) + +// Timer10 registers area - 128B +#define C66XX_TIMER_10_RG_AREA_SADDR 0x022a0000 +#define C66XX_TIMER_10_RG_AREA_EADDR 0x022a007f +#define C66XX_TIMER_10_RG_AREA_LEN (C66XX_TIMER_10_RG_AREA_EADDR - C66XX_TIMER_10_RG_AREA_SADDR + 1) + +// Timer11 registers area - 128B +#define C66XX_TIMER_11_RG_AREA_SADDR 0x022b0000 +#define C66XX_TIMER_11_RG_AREA_EADDR 0x022b007f +#define C66XX_TIMER_11_RG_AREA_LEN (C66XX_TIMER_11_RG_AREA_EADDR - C66XX_TIMER_11_RG_AREA_SADDR + 1) + +// Timer12 registers area - 128B +#define C66XX_TIMER_12_RG_AREA_SADDR 0x022c0000 +#define C66XX_TIMER_12_RG_AREA_EADDR 0x022c007f +#define C66XX_TIMER_12_RG_AREA_LEN (C66XX_TIMER_12_RG_AREA_EADDR - C66XX_TIMER_12_RG_AREA_SADDR + 1) + +// Timer13 registers area - 128B +#define C66XX_TIMER_13_RG_AREA_SADDR 0x022d0000 +#define C66XX_TIMER_13_RG_AREA_EADDR 0x022d007f +#define C66XX_TIMER_13_RG_AREA_LEN (C66XX_TIMER_13_RG_AREA_EADDR - C66XX_TIMER_13_RG_AREA_SADDR + 1) + +// Timer14 registers area - 128B +#define C66XX_TIMER_14_RG_AREA_SADDR 0x022e0000 +#define C66XX_TIMER_14_RG_AREA_EADDR 0x022e007f +#define C66XX_TIMER_14_RG_AREA_LEN (C66XX_TIMER_14_RG_AREA_EADDR - C66XX_TIMER_14_RG_AREA_SADDR + 1) + +// Timer15 registers area - 128B +#define C66XX_TIMER_15_RG_AREA_SADDR 0x022f0000 +#define C66XX_TIMER_15_RG_AREA_EADDR 0x022f007f +#define C66XX_TIMER_15_RG_AREA_LEN (C66XX_TIMER_15_RG_AREA_EADDR - C66XX_TIMER_15_RG_AREA_SADDR + 1) + +// PLL controller registers area - 512B +#define C66XX_PLL_RG_AREA_SADDR 0x02310000 +#define C66XX_PLL_RG_AREA_EADDR 0x023101ff +#define C66XX_PLL_RG_AREA_LEN (C66XX_PLL_RG_AREA_EADDR - C66XX_PLL_RG_AREA_SADDR + 1) + +// GPIO registers area - 256B +#define C66XX_GPIO_RG_AREA_SADDR 0x02320000 +#define C66XX_GPIO_RG_AREA_EADDR 0x023200ff +#define C66XX_GPIO_RG_AREA_LEN (C66XX_GPIO_RG_AREA_EADDR - C66XX_GPIO_RG_AREA_SADDR + 1) + +// SmartReflex registers area - 256B +#define C66XX_SMARTREFLEX_RG_AREA_SADDR 0x02330000 +#define C66XX_SMARTREFLEX_RG_AREA_EADDR 0x023303ff +#define C66XX_SMARTREFLEX_RG_AREA_LEN (C66XX_SMARTREFLEX_RG_AREA_EADDR - C66XX_SMARTREFLEX_RG_AREA_SADDR + 1) + +// Power Sleep Controller (PSC) registers area - 4KB +#define C66XX_PSC_RG_AREA_SADDR 0x02350000 +#define C66XX_PSC_RG_AREA_EADDR 0x02350fff +#define C66XX_PSC_RG_AREA_LEN (C66XX_PSC_RG_AREA_EADDR - C66XX_PSC_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 0 registers area - 1KB +#define C66XX_MPU_0_RG_AREA_SADDR 0x02360000 +#define C66XX_MPU_0_RG_AREA_EADDR 0x023603ff +#define C66XX_MPU_0_RG_AREA_LEN (C66XX_MPU_0_RG_AREA_EADDR - C66XX_MPU_0_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 1 registers area - 1KB +#define C66XX_MPU_1_RG_AREA_SADDR 0x02368000 +#define C66XX_MPU_1_RG_AREA_EADDR 0x023683ff +#define C66XX_MPU_1_RG_AREA_LEN (C66XX_MPU_1_RG_AREA_EADDR - C66XX_MPU_1_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 2 registers area - 1KB +#define C66XX_MPU_2_RG_AREA_SADDR 0x02370000 +#define C66XX_MPU_2_RG_AREA_EADDR 0x023703ff +#define C66XX_MPU_2_RG_AREA_LEN (C66XX_MPU_2_RG_AREA_EADDR - C66XX_MPU_2_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 3 registers area - 1KB +#define C66XX_MPU_3_RG_AREA_SADDR 0x02378000 +#define C66XX_MPU_3_RG_AREA_EADDR 0x023783ff +#define C66XX_MPU_3_RG_AREA_LEN (C66XX_MPU_3_RG_AREA_EADDR - C66XX_MPU_3_RG_AREA_SADDR + 1) + +// Debug subsystem configuration registers area - 256KB +#define C66XX_DEBUG_CFG_RG_AREA_SADDR 0x02400000 +#define C66XX_DEBUG_CFG_RG_AREA_EADDR 0x0243ffff +#define C66XX_DEBUG_CFG_RG_AREA_LEN (C66XX_DEBUG_CFG_RG_AREA_EADDR - C66XX_DEBUG_CFG_RG_AREA_SADDR + 1) + +// DSP trace formatter 0 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_SADDR 0x02440000 +#define C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_EADDR 0x02443fff +#define C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_SADDR + 1) + +// DSP trace formatter 1 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_SADDR 0x02450000 +#define C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_EADDR 0x02453fff +#define C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_SADDR + 1) + +// DSP trace formatter 2 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_SADDR 0x02460000 +#define C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_EADDR 0x02463fff +#define C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_SADDR + 1) + +// DSP trace formatter 3 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_SADDR 0x02470000 +#define C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_EADDR 0x02473fff +#define C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_SADDR + 1) + +// DSP trace formatter 4 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_SADDR 0x02480000 +#define C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_EADDR 0x02483fff +#define C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_SADDR + 1) + +// DSP trace formatter 5 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_SADDR 0x02490000 +#define C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_EADDR 0x02493fff +#define C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_SADDR + 1) + +// DSP trace formatter 6 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_SADDR 0x024a0000 +#define C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_EADDR 0x024a3fff +#define C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_SADDR + 1) + +// DSP trace formatter 7 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_SADDR 0x024b0000 +#define C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_EADDR 0x024b3fff +#define C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_SADDR + 1) + +// I2C registers area - 128B +#define C66XX_I2C_RG_AREA_SADDR 0x02530000 +#define C66XX_I2C_RG_AREA_EADDR 0x0253007f +#define C66XX_I2C_RG_AREA_LEN (C66XX_I2C_RG_AREA_EADDR - C66XX_I2C_RG_AREA_SADDR + 1) + +// UART registers area - 64B +#define C66XX_UART_RG_AREA_SADDR 0x02540000 +#define C66XX_UART_RG_AREA_EADDR 0x0254003f +#define C66XX_UART_RG_AREA_LEN (C66XX_UART_RG_AREA_EADDR - C66XX_UART_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 0 registers area - 8KB +#define C66XX_CIC_0_RG_AREA_SADDR 0x02600000 +#define C66XX_CIC_0_RG_AREA_EADDR 0x02601fff +#define C66XX_CIC_0_RG_AREA_LEN (C66XX_CIC_0_RG_AREA_EADDR - C66XX_CIC_0_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 1 registers area - 8KB +#define C66XX_CIC_1_RG_AREA_SADDR 0x02604000 +#define C66XX_CIC_1_RG_AREA_EADDR 0x02605fff +#define C66XX_CIC_1_RG_AREA_LEN (C66XX_CIC_1_RG_AREA_EADDR - C66XX_CIC_1_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 2 registers area - 8KB +#define C66XX_CIC_2_RG_AREA_SADDR 0x02608000 +#define C66XX_CIC_2_RG_AREA_EADDR 0x02609fff +#define C66XX_CIC_2_RG_AREA_LEN (C66XX_CIC_2_RG_AREA_EADDR - C66XX_CIC_2_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 3 registers area - 8KB +#define C66XX_CIC_3_RG_AREA_SADDR 0x0260c000 +#define C66XX_CIC_3_RG_AREA_EADDR 0x0260dfff +#define C66XX_CIC_3_RG_AREA_LEN (C66XX_CIC_3_RG_AREA_EADDR - C66XX_CIC_3_RG_AREA_SADDR + 1) + +// Device State Control registers area - 2KB +#define C66XX_BOOTCFG_RG_AREA_SADDR 0x02620000 +#define C66XX_BOOTCFG_RG_AREA_EADDR 0x026207ff +#define C66XX_BOOTCFG_RG_AREA_LEN (C66XX_BOOTCFG_RG_AREA_EADDR - C66XX_BOOTCFG_RG_AREA_SADDR + 1) + +// Semaphore (SEM) registers area - 2KB +#define C66XX_SEM_RG_AREA_SADDR 0x02640000 +#define C66XX_SEM_RG_AREA_EADDR 0x026407ff +#define C66XX_SEM_RG_AREA_LEN (C66XX_SEM_RG_AREA_EADDR - C66XX_SEM_RG_AREA_SADDR + 1) + +// EDMA3 Channel Controller (EDMA3CC) 0 registers area - 32KB +#define C66XX_EDMA3CC_0_RG_AREA_SADDR 0x02700000 +#define C66XX_EDMA3CC_0_RG_AREA_EADDR 0x02707fff +#define C66XX_EDMA3CC_0_RG_AREA_LEN (C66XX_EDMA3CC_0_RG_AREA_EADDR - C66XX_EDMA3CC_0_RG_AREA_SADDR + 1) + +// EDMA3 Channel Controller (EDMA3CC) 1 registers area - 32KB +#define C66XX_EDMA3CC_1_RG_AREA_SADDR 0x02720000 +#define C66XX_EDMA3CC_1_RG_AREA_EADDR 0x02727fff +#define C66XX_EDMA3CC_1_RG_AREA_LEN (C66XX_EDMA3CC_1_RG_AREA_EADDR - C66XX_EDMA3CC_1_RG_AREA_SADDR + 1) + +// EDMA3 Channel Controller (EDMA3CC) 2 registers area - 32KB +#define C66XX_EDMA3CC_2_RG_AREA_SADDR 0x02740000 +#define C66XX_EDMA3CC_2_RG_AREA_EADDR 0x02747fff +#define C66XX_EDMA3CC_2_RG_AREA_LEN (C66XX_EDMA3CC_2_RG_AREA_EADDR - C66XX_EDMA3CC_2_RG_AREA_SADDR + 1) + +// EDMA3CC0 Transfer Controller (EDMA3TC) 0 registers area - 1KB +#define C66XX_EDMA3CC_0_TC_0_RG_AREA_SADDR 0x02760000 +#define C66XX_EDMA3CC_0_TC_0_RG_AREA_EADDR 0x027603ff +#define C66XX_EDMA3CC_0_TC_0_RG_AREA_LEN (C66XX_EDMA3CC_0_TC_0_RG_AREA_EADDR - C66XX_EDMA3CC_0_TC_0_RG_AREA_SADDR + 1) + +// EDMA3CC0 Transfer Controller (EDMA3TC) 1 registers area - 1KB +#define C66XX_EDMA3CC_0_TC_1_RG_AREA_SADDR 0x02768000 +#define C66XX_EDMA3CC_0_TC_1_RG_AREA_EADDR 0x027683ff +#define C66XX_EDMA3CC_0_TC_1_RG_AREA_LEN (C66XX_EDMA3CC_0_TC_1_RG_AREA_EADDR - C66XX_EDMA3CC_0_TC_1_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 0 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_0_RG_AREA_SADDR 0x02770000 +#define C66XX_EDMA3CC_1_TC_0_RG_AREA_EADDR 0x027703ff +#define C66XX_EDMA3CC_1_TC_0_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_0_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_0_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 1 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_1_RG_AREA_SADDR 0x02778000 +#define C66XX_EDMA3CC_1_TC_1_RG_AREA_EADDR 0x027783ff +#define C66XX_EDMA3CC_1_TC_1_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_1_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_1_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 2 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_2_RG_AREA_SADDR 0x02780000 +#define C66XX_EDMA3CC_1_TC_2_RG_AREA_EADDR 0x027803ff +#define C66XX_EDMA3CC_1_TC_2_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_2_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_2_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 3 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_3_RG_AREA_SADDR 0x02788000 +#define C66XX_EDMA3CC_1_TC_3_RG_AREA_EADDR 0x027883ff +#define C66XX_EDMA3CC_1_TC_3_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_3_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_3_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 0 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_0_RG_AREA_SADDR 0x02790000 +#define C66XX_EDMA3CC_2_TC_0_RG_AREA_EADDR 0x027903ff +#define C66XX_EDMA3CC_2_TC_0_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_0_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_0_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 1 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_1_RG_AREA_SADDR 0x02798000 +#define C66XX_EDMA3CC_2_TC_1_RG_AREA_EADDR 0x027983ff +#define C66XX_EDMA3CC_2_TC_1_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_1_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_1_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 2 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_2_RG_AREA_SADDR 0x027a0000 +#define C66XX_EDMA3CC_2_TC_2_RG_AREA_EADDR 0x027a03ff +#define C66XX_EDMA3CC_2_TC_2_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_2_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_2_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 3 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_3_RG_AREA_SADDR 0x027a8000 +#define C66XX_EDMA3CC_2_TC_3_RG_AREA_EADDR 0x027a83ff +#define C66XX_EDMA3CC_2_TC_3_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_3_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_3_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac0 registers area - 4KB +#define C66XX_TETB_0_RG_AREA_SADDR 0x027d0000 +#define C66XX_TETB_0_RG_AREA_EADDR 0x027d0fff +#define C66XX_TETB_0_RG_AREA_LEN (C66XX_TETB_0_RG_AREA_EADDR - C66XX_TETB_0_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac1 registers area - 4KB +#define C66XX_TETB_1_RG_AREA_SADDR 0x027e0000 +#define C66XX_TETB_1_RG_AREA_EADDR 0x027e0fff +#define C66XX_TETB_1_RG_AREA_LEN (C66XX_TETB_1_RG_AREA_EADDR - C66XX_TETB_1_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac2 registers area - 4KB +#define C66XX_TETB_2_RG_AREA_SADDR 0x027f0000 +#define C66XX_TETB_2_RG_AREA_EADDR 0x027f0fff +#define C66XX_TETB_2_RG_AREA_LEN (C66XX_TETB_2_RG_AREA_EADDR - C66XX_TETB_2_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac3 registers area - 4KB +#define C66XX_TETB_3_RG_AREA_SADDR 0x02800000 +#define C66XX_TETB_3_RG_AREA_EADDR 0x02800fff +#define C66XX_TETB_3_RG_AREA_LEN (C66XX_TETB_3_RG_AREA_EADDR - C66XX_TETB_3_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac4 registers area - 4KB +#define C66XX_TETB_4_RG_AREA_SADDR 0x02810000 +#define C66XX_TETB_4_RG_AREA_EADDR 0x02810fff +#define C66XX_TETB_4_RG_AREA_LEN (C66XX_TETB_4_RG_AREA_EADDR - C66XX_TETB_4_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac5 registers area - 4KB +#define C66XX_TETB_5_RG_AREA_SADDR 0x02820000 +#define C66XX_TETB_5_RG_AREA_EADDR 0x02820fff +#define C66XX_TETB_5_RG_AREA_LEN (C66XX_TETB_5_RG_AREA_EADDR - C66XX_TETB_5_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac6 registers area - 4KB +#define C66XX_TETB_6_RG_AREA_SADDR 0x02830000 +#define C66XX_TETB_6_RG_AREA_EADDR 0x02830fff +#define C66XX_TETB_6_RG_AREA_LEN (C66XX_TETB_6_RG_AREA_EADDR - C66XX_TETB_6_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac7 registers area - 4KB +#define C66XX_TETB_7_RG_AREA_SADDR 0x02840000 +#define C66XX_TETB_7_RG_AREA_EADDR 0x02840fff +#define C66XX_TETB_7_RG_AREA_LEN (C66XX_TETB_7_RG_AREA_EADDR - C66XX_TETB_7_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) system registers area - 32KB +#define C66XX_TETB_SYSTEM_RG_AREA_SADDR 0x02850000 +#define C66XX_TETB_SYSTEM_RG_AREA_EADDR 0x02857fff +#define C66XX_TETB_SYSTEM_RG_AREA_LEN (C66XX_TETB_SYSTEM_RG_AREA_EADDR - C66XX_TETB_SYSTEM_RG_AREA_SADDR + 1) + +// Serial RapidIO (SRIO) configuration registers area - 132KB +#define C66XX_SRIO_RG_AREA_SADDR 0x02900000 +#define C66XX_SRIO_RG_AREA_EADDR 0x02920fff +#define C66XX_SRIO_RG_AREA_LEN (C66XX_SRIO_RG_AREA_EADDR - C66XX_SRIO_RG_AREA_SADDR + 1) + +// Queue manager subsystem (QMSS) configuration registers area - 2MB +#define C66XX_QMSS_RG_AREA_SADDR 0x02a00000 +#define C66XX_QMSS_RG_AREA_EADDR 0x02bfffff +#define C66XX_QMSS_RG_AREA_LEN (C66XX_QMSS_RG_AREA_EADDR - C66XX_QMSS_RG_AREA_SADDR + 1) + +// Extended memory controller (XMC) configuration registers area - 64KB +#define C66XX_XMC_RG_AREA_SADDR 0x08000000 +#define C66XX_XMC_RG_AREA_EADDR 0x0800ffff +#define C66XX_XMC_RG_AREA_LEN (C66XX_XMC_RG_AREA_EADDR - C66XX_XMC_RG_AREA_SADDR + 1) + +// Multicore shared memory controller (MSMC) configuration registers area - 1MB +#define C66XX_MSMC_RG_AREA_SADDR 0x0bc00000 +#define C66XX_MSMC_RG_AREA_EADDR 0x0bcfffff +#define C66XX_MSMC_RG_AREA_LEN (C66XX_MSMC_RG_AREA_EADDR - C66XX_MSMC_RG_AREA_SADDR + 1) + +// Multicore shared memory (MSM) area - 4MB +#define C66XX_MSM_SRAM_AREA_SADDR 0x0c000000 +#define C66XX_MSM_SRAM_AREA_EADDR 0x0c3fffff +#define C66XX_MSM_SRAM_AREA_LEN (C66XX_MSM_SRAM_AREA_EADDR - C66XX_MSM_SRAM_AREA_SADDR + 1) + +// CorePac0 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_0_L2_SRAM_SADDR 0x10800000 +#define C66XX_DSP_0_L2_SRAM_EADDR 0x1087ffff +#define C66XX_DSP_0_L2_SRAM_LEN (C66XX_DSP_0_L2_SRAM_EADDR - C66XX_DSP_0_L2_SRAM_SADDR + 1) + +// CorePac0 L1P SRAM - 32KB +#define C66XX_DSP_0_L1P_SRAM_SADDR 0x10e00000 +#define C66XX_DSP_0_L1P_SRAM_EADDR 0x10e07fff +#define C66XX_DSP_0_L1P_SRAM_LEN (C66XX_DSP_0_L1P_SRAM_EADDR - C66XX_DSP_0_L1P_SRAM_SADDR + 1) + +// CorePac0 L1D SRAM - 32KB +#define C66XX_DSP_0_L1D_SRAM_SADDR 0x10f00000 +#define C66XX_DSP_0_L1D_SRAM_EADDR 0x10f07fff +#define C66XX_DSP_0_L1D_SRAM_LEN (C66XX_DSP_0_L1D_SRAM_EADDR - C66XX_DSP_0_L1D_SRAM_SADDR + 1) + +// CorePac1 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_1_L2_SRAM_SADDR 0x11800000 +#define C66XX_DSP_1_L2_SRAM_EADDR 0x1187ffff +#define C66XX_DSP_1_L2_SRAM_LEN (C66XX_DSP_1_L2_SRAM_EADDR - C66XX_DSP_1_L2_SRAM_SADDR + 1) + +// CorePac1 L1P SRAM - 32KB +#define C66XX_DSP_1_L1P_SRAM_SADDR 0x11e00000 +#define C66XX_DSP_1_L1P_SRAM_EADDR 0x11e07fff +#define C66XX_DSP_1_L1P_SRAM_LEN (C66XX_DSP_1_L1P_SRAM_EADDR - C66XX_DSP_1_L1P_SRAM_SADDR + 1) + +// CorePac1 L1D SRAM - 32KB +#define C66XX_DSP_1_L1D_SRAM_SADDR 0x11f00000 +#define C66XX_DSP_1_L1D_SRAM_EADDR 0x11f07fff +#define C66XX_DSP_1_L1D_SRAM_LEN (C66XX_DSP_1_L1D_SRAM_EADDR - C66XX_DSP_1_L1D_SRAM_SADDR + 1) + +// CorePac2 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_2_L2_SRAM_SADDR 0x12800000 +#define C66XX_DSP_2_L2_SRAM_EADDR 0x1287ffff +#define C66XX_DSP_2_L2_SRAM_LEN (C66XX_DSP_2_L2_SRAM_EADDR - C66XX_DSP_2_L2_SRAM_SADDR + 1) + +// CorePac2 L1P SRAM - 32KB +#define C66XX_DSP_2_L1P_SRAM_SADDR 0x12e00000 +#define C66XX_DSP_2_L1P_SRAM_EADDR 0x12e07fff +#define C66XX_DSP_2_L1P_SRAM_LEN (C66XX_DSP_2_L1P_SRAM_EADDR - C66XX_DSP_2_L1P_SRAM_SADDR + 1) + +// CorePac2 L1D SRAM - 32KB +#define C66XX_DSP_2_L1D_SRAM_SADDR 0x12f00000 +#define C66XX_DSP_2_L1D_SRAM_EADDR 0x12f07fff +#define C66XX_DSP_2_L1D_SRAM_LEN (C66XX_DSP_2_L1D_SRAM_EADDR - C66XX_DSP_2_L1D_SRAM_SADDR + 1) + +// CorePac3 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_3_L2_SRAM_SADDR 0x13800000 +#define C66XX_DSP_3_L2_SRAM_EADDR 0x1387ffff +#define C66XX_DSP_3_L2_SRAM_LEN (C66XX_DSP_3_L2_SRAM_EADDR - C66XX_DSP_3_L2_SRAM_SADDR + 1) + +// CorePac3 L1P SRAM - 32KB +#define C66XX_DSP_3_L1P_SRAM_SADDR 0x13e00000 +#define C66XX_DSP_3_L1P_SRAM_EADDR 0x13e07fff +#define C66XX_DSP_3_L1P_SRAM_LEN (C66XX_DSP_3_L1P_SRAM_EADDR - C66XX_DSP_3_L1P_SRAM_SADDR + 1) + +// CorePac3 L1D SRAM - 32KB +#define C66XX_DSP_3_L1D_SRAM_SADDR 0x13f00000 +#define C66XX_DSP_3_L1D_SRAM_EADDR 0x13f07fff +#define C66XX_DSP_3_L1D_SRAM_LEN (C66XX_DSP_3_L1D_SRAM_EADDR - C66XX_DSP_3_L1D_SRAM_SADDR + 1) + +// CorePac4 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_4_L2_SRAM_SADDR 0x14800000 +#define C66XX_DSP_4_L2_SRAM_EADDR 0x1487ffff +#define C66XX_DSP_4_L2_SRAM_LEN (C66XX_DSP_4_L2_SRAM_EADDR - C66XX_DSP_4_L2_SRAM_SADDR + 1) + +// CorePac4 L1P SRAM - 32KB +#define C66XX_DSP_4_L1P_SRAM_SADDR 0x14e00000 +#define C66XX_DSP_4_L1P_SRAM_EADDR 0x14e07fff +#define C66XX_DSP_4_L1P_SRAM_LEN (C66XX_DSP_4_L1P_SRAM_EADDR - C66XX_DSP_4_L1P_SRAM_SADDR + 1) + +// CorePac4 L1D SRAM - 32KB +#define C66XX_DSP_4_L1D_SRAM_SADDR 0x14f00000 +#define C66XX_DSP_4_L1D_SRAM_EADDR 0x14f07fff +#define C66XX_DSP_4_L1D_SRAM_LEN (C66XX_DSP_4_L1D_SRAM_EADDR - C66XX_DSP_4_L1D_SRAM_SADDR + 1) + +// CorePac5 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_5_L2_SRAM_SADDR 0x15800000 +#define C66XX_DSP_5_L2_SRAM_EADDR 0x1587ffff +#define C66XX_DSP_5_L2_SRAM_LEN (C66XX_DSP_5_L2_SRAM_EADDR - C66XX_DSP_5_L2_SRAM_SADDR + 1) + +// CorePac5 L1P SRAM - 32KB +#define C66XX_DSP_5_L1P_SRAM_SADDR 0x15e00000 +#define C66XX_DSP_5_L1P_SRAM_EADDR 0x15e07fff +#define C66XX_DSP_5_L1P_SRAM_LEN (C66XX_DSP_5_L1P_SRAM_EADDR - C66XX_DSP_5_L1P_SRAM_SADDR + 1) + +// CorePac5 L1D SRAM - 32KB +#define C66XX_DSP_5_L1D_SRAM_SADDR 0x15f00000 +#define C66XX_DSP_5_L1D_SRAM_EADDR 0x15f07fff +#define C66XX_DSP_5_L1D_SRAM_LEN (C66XX_DSP_5_L1D_SRAM_EADDR - C66XX_DSP_5_L1D_SRAM_SADDR + 1) + +// CorePac6 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_6_L2_SRAM_SADDR 0x16800000 +#define C66XX_DSP_6_L2_SRAM_EADDR 0x1687ffff +#define C66XX_DSP_6_L2_SRAM_LEN (C66XX_DSP_6_L2_SRAM_EADDR - C66XX_DSP_6_L2_SRAM_SADDR + 1) + +// CorePac6 L1P SRAM - 32KB +#define C66XX_DSP_6_L1P_SRAM_SADDR 0x16e00000 +#define C66XX_DSP_6_L1P_SRAM_EADDR 0x16e07fff +#define C66XX_DSP_6_L1P_SRAM_LEN (C66XX_DSP_6_L1P_SRAM_EADDR - C66XX_DSP_6_L1P_SRAM_SADDR + 1) + +// CorePac6 L1D SRAM - 32KB +#define C66XX_DSP_6_L1D_SRAM_SADDR 0x16f00000 +#define C66XX_DSP_6_L1D_SRAM_EADDR 0x16f07fff +#define C66XX_DSP_6_L1D_SRAM_LEN (C66XX_DSP_6_L1D_SRAM_EADDR - C66XX_DSP_6_L1D_SRAM_SADDR + 1) + +// CorePac7 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_7_L2_SRAM_SADDR 0x17800000 +#define C66XX_DSP_7_L2_SRAM_EADDR 0x1787ffff +#define C66XX_DSP_7_L2_SRAM_LEN (C66XX_DSP_7_L2_SRAM_EADDR - C66XX_DSP_7_L2_SRAM_SADDR + 1) + +// CorePac7 L1P SRAM - 32KB +#define C66XX_DSP_7_L1P_SRAM_SADDR 0x17e00000 +#define C66XX_DSP_7_L1P_SRAM_EADDR 0x17e07fff +#define C66XX_DSP_7_L1P_SRAM_LEN (C66XX_DSP_7_L1P_SRAM_EADDR - C66XX_DSP_7_L1P_SRAM_SADDR + 1) + +// CorePac7 L1D SRAM - 32KB +#define C66XX_DSP_7_L1D_SRAM_SADDR 0x17f00000 +#define C66XX_DSP_7_L1D_SRAM_EADDR 0x17f07fff +#define C66XX_DSP_7_L1D_SRAM_LEN (C66XX_DSP_7_L1D_SRAM_EADDR - C66XX_DSP_7_L1D_SRAM_SADDR + 1) + +// System trace manager (STM) configuration registers area - 1MB +#define C66XX_STM_RG_AREA_SADDR 0x20000000 +#define C66XX_STM_RG_AREA_EADDR 0x200fffff +#define C66XX_STM_RG_AREA_LEN (C66XX_STM_RG_AREA_EADDR - C66XX_STM_RG_AREA_SADDR + 1) + +// Boot ROM - 128KB +#define C66XX_BOOT_ROM_SADDR 0x20b00000 +#define C66XX_BOOT_ROM_EADDR 0x20b1ffff +#define C66XX_BOOT_ROM_LEN (C66XX_BOOT_ROM_EADDR - C66XX_BOOT_ROM_SADDR + 1) + +// SPI configuration registers area - 512B +#define C66XX_SPI_RG_AREA_SADDR 0x20bf0000 +#define C66XX_SPI_RG_AREA_EADDR 0x20bf01ff +#define C66XX_SPI_RG_AREA_LEN (C66XX_SPI_RG_AREA_EADDR - C66XX_SPI_RG_AREA_SADDR + 1) + +// EMIF16 configuration registers area - 256B +#define C66XX_EMIF16_RG_AREA_SADDR 0x20c00000 +#define C66XX_EMIF16_RG_AREA_EADDR 0x20c000ff +#define C66XX_EMIF16_RG_AREA_LEN (C66XX_EMIF16_RG_AREA_EADDR - C66XX_EMIF16_RG_AREA_SADDR + 1) + +// DDR3 EMIF configuration registers area - 512B +#define C66XX_DDR3_EMIF_RG_AREA_SADDR 0x21000000 +#define C66XX_DDR3_EMIF_RG_AREA_EADDR 0x210001ff +#define C66XX_DDR3_EMIF_RG_AREA_LEN (C66XX_DDR3_EMIF_RG_AREA_EADDR - C66XX_DDR3_EMIF_RG_AREA_SADDR + 1) + +// HyperLink configuration registers area - 256B +#define C66XX_HYPERLINK_RG_AREA_SADDR 0x21400000 +#define C66XX_HYPERLINK_RG_AREA_EADDR 0x214000ff +#define C66XX_HYPERLINK_RG_AREA_LEN (C66XX_HYPERLINK_RG_AREA_EADDR - C66XX_HYPERLINK_RG_AREA_SADDR + 1) + +// PCIe configuration registers area - 32KB +#define C66XX_PCIE_RG_AREA_SADDR 0x21800000 +#define C66XX_PCIE_RG_AREA_EADDR 0x21807fff +#define C66XX_PCIE_RG_AREA_LEN (C66XX_PCIE_RG_AREA_EADDR - C66XX_PCIE_RG_AREA_SADDR + 1) + +// Queue manager subsystem (QMSS) data area - 2MB +#define C66XX_QMSS_DATA_AREA_SADDR 0x34000000 +#define C66XX_QMSS_DATA_AREA_EADDR 0x341fffff +#define C66XX_QMSS_DATA_AREA_LEN (C66XX_QMSS_DATA_AREA_EADDR - C66XX_QMSS_DATA_AREA_SADDR + 1) + +// HyperLink data area - 256MB +#define C66XX_HYPERLINK_DATA_AREA_SADDR 0x40000000 +#define C66XX_HYPERLINK_DATA_AREA_EADDR 0x4fffffff +#define C66XX_HYPERLINK_DATA_AREA_LEN (C66XX_HYPERLINK_DATA_AREA_EADDR - C66XX_HYPERLINK_DATA_AREA_SADDR + 1) + +// PCIe data area - 256MB +#define C66XX_PCIE_DATA_AREA_SADDR 0x60000000 +#define C66XX_PCIE_DATA_AREA_EADDR 0x6fffffff +#define C66XX_PCIE_DATA_AREA_LEN (C66XX_PCIE_DATA_AREA_EADDR - C66XX_PCIE_DATA_AREA_SADDR + 1) + +// EMIF16 CE0 area - 64MB +#define C66XX_EMIF16_CE0_AREA_SADDR 0x70000000 +#define C66XX_EMIF16_CE0_AREA_EADDR 0x73ffffff +#define C66XX_EMIF16_CE0_AREA_LEN (C66XX_EMIF16_CE0_AREA_EADDR - C66XX_EMIF16_CE0_AREA_SADDR + 1) + +// EMIF16 CE1 area - 64MB +#define C66XX_EMIF16_CE1_AREA_SADDR 0x74000000 +#define C66XX_EMIF16_CE1_AREA_EADDR 0x77ffffff +#define C66XX_EMIF16_CE1_AREA_LEN (C66XX_EMIF16_CE1_AREA_EADDR - C66XX_EMIF16_CE1_AREA_SADDR + 1) + +// EMIF16 CE2 area - 64MB +#define C66XX_EMIF16_CE2_AREA_SADDR 0x78000000 +#define C66XX_EMIF16_CE2_AREA_EADDR 0x7bffffff +#define C66XX_EMIF16_CE2_AREA_LEN (C66XX_EMIF16_CE2_AREA_EADDR - C66XX_EMIF16_CE2_AREA_SADDR + 1) + +// EMIF16 CE3 area - 64MB +#define C66XX_EMIF16_CE3_AREA_SADDR 0x7c000000 +#define C66XX_EMIF16_CE3_AREA_EADDR 0x7fffffff +#define C66XX_EMIF16_CE3_AREA_LEN (C66XX_EMIF16_CE3_AREA_EADDR - C66XX_EMIF16_CE3_AREA_SADDR + 1) + +// DDR3 EMIF data area - 2GB +#define C66XX_DDR3_AREA_SADDR 0x80000000 +#define C66XX_DDR3_AREA_EADDR 0xffffffff +#define C66XX_DDR3_AREA_LEN (C66XX_DDR3_AREA_EADDR - C66XX_DDR3_AREA_SADDR + 1) + +//============================================================================= +#endif /* __C66XX_SELECT_C6678_DSP__ */ + + + +//============================================================================= +//============ DSP core registers ============================================= +//============================================================================= +// DSP CorePack revision register - r-only +#define C66XX_CORE_MM_REVID_RG_ADDR 0x01812000 + +//------------ DSP CorePack revision register defs ---------------------------- +#define C66XX_CORE_MM_REVID_VERSION_BITMASK 0xffff0000 +#define C66XX_CORE_MM_REVID_VERSION_BITSHIFT 16 +#define C66XX_CORE_MM_REVID_REVISION_BITMASK 0x0000ffff +#define C66XX_CORE_MM_REVID_REVISION_BITSHIFT 0 + +#define C66XX_CORE_MM_REVID_VERSION_C6678 0x0008 +#define C66XX_CORE_MM_REVID_REVISION_1_0 0x0 +#define C66XX_CORE_MM_REVID_REVISION_2_0 0x1 + + +// DSP interrupt controller registers addresses + +// DSP Event Flag register 0 - r-only +#define C66XX_CORE_EVTFLAG0_RG_ADDR 0x01800000 +// DSP Event Flag register 1 - r-only +#define C66XX_CORE_EVTFLAG1_RG_ADDR 0x01800004 +// DSP Event Flag register 2 - r-only +#define C66XX_CORE_EVTFLAG2_RG_ADDR 0x01800008 +// DSP Event Flag register 3 - r-only +#define C66XX_CORE_EVTFLAG3_RG_ADDR 0x0180000c +// DSP Event Set register 0 - r/w +#define C66XX_CORE_EVTSET0_RG_ADDR 0x01800020 +// DSP Event Set register 1 - r/w +#define C66XX_CORE_EVTSET1_RG_ADDR 0x01800024 +// DSP Event Set register 2 - r/w +#define C66XX_CORE_EVTSET2_RG_ADDR 0x01800028 +// DSP Event Set register 3 - r/w +#define C66XX_CORE_EVTSET3_RG_ADDR 0x0180002c +// DSP Event Clear register 0 - r/w +#define C66XX_CORE_EVTCLR0_RG_ADDR 0x01800040 +// DSP Event Clear register 1 - r/w +#define C66XX_CORE_EVTCLR1_RG_ADDR 0x01800044 +// DSP Event Clear register 2 - r/w +#define C66XX_CORE_EVTCLR2_RG_ADDR 0x01800048 +// DSP Event Clear register 3 - r/w +#define C66XX_CORE_EVTCLR3_RG_ADDR 0x0180004c +// DSP Event Mask register 0 - r/w +#define C66XX_CORE_EVTMASK0_RG_ADDR 0x01800080 +// DSP Event Mask register 1 - r/w +#define C66XX_CORE_EVTMASK1_RG_ADDR 0x01800084 +// DSP Event Mask register 2 - r/w +#define C66XX_CORE_EVTMASK2_RG_ADDR 0x01800088 +// DSP Event Mask register 3 - r/w +#define C66XX_CORE_EVTMASK3_RG_ADDR 0x0180008c + +// DSP Event Flag registers base address +#define C66XX_CORE_EVTFLAG_RG_BADDR 0x01800000 +// DSP Event Flag registers offset +#define C66XX_CORE_EVTFLAG_RG_OFFSET 0x00000004 + +// DSP Event Set registers base address +#define C66XX_CORE_EVTSET_RG_BADDR 0x01800020 +// DSP Event Set registers offset +#define C66XX_CORE_EVTSET_RG_OFFSET 0x00000004 + +// DSP Event Clear registers base address +#define C66XX_CORE_EVTCLR_RG_BADDR 0x01800040 +// DSP Event Clear registers offset +#define C66XX_CORE_EVTCLR_RG_OFFSET 0x00000004 + +// DSP Event Mask registers base address +#define C66XX_CORE_EVTMASK_RG_BADDR 0x01800080 +// DSP Event Mask registers offset +#define C66XX_CORE_EVTMASK_RG_OFFSET 0x00000004 + +//============================================================================= + + + +//============================================================================= +//============ PLL controller registers ======================================= +//============================================================================= +// PLL control register - r/w +#define C66XX_PLL_PLLCTL_RG_OFFSET 0x100 +// PLL secondary control register - r/w +#define C66XX_PLL_SECCTL_RG_OFFSET 0x108 +// PLL multiplier control register - r/w +#define C66XX_PLL_PLLM_RG_OFFSET 0x110 +// PLL controller divider 1 register - r/w +#define C66XX_PLL_PLLDIV1_RG_OFFSET 0x118 +// PLL controller divider 2 register - r/w +#define C66XX_PLL_PLLDIV2_RG_OFFSET 0x11c +// PLL controller divider 3 register - r/w +#define C66XX_PLL_PLLDIV3_RG_OFFSET 0x120 +// PLL controller command register - r/w +#define C66XX_PLL_PLLCMD_RG_OFFSET 0x138 +// PLL controller status register - r/w +#define C66XX_PLL_PLLSTAT_RG_OFFSET 0x13c +// PLL controller clock align control register - r/w +#define C66XX_PLL_ALNCTL_RG_OFFSET 0x140 +// PLL controller divider ratio change status register - r/w +#define C66XX_PLL_DCHANGE_RG_OFFSET 0x144 +// SYSCLK status register - r-only +#define C66XX_PLL_SYSTAT_RG_OFFSET 0x150 +// PLL controller divider 4 register - r/w +#define C66XX_PLL_PLLDIV4_RG_OFFSET 0x160 +// PLL controller divider 5 register - r/w +#define C66XX_PLL_PLLDIV5_RG_OFFSET 0x164 +// PLL controller divider 6 register - r/w +#define C66XX_PLL_PLLDIV6_RG_OFFSET 0x168 +// PLL controller divider 7 register - r/w +#define C66XX_PLL_PLLDIV7_RG_OFFSET 0x16c +// PLL controller divider 8 register - r/w +#define C66XX_PLL_PLLDIV8_RG_OFFSET 0x170 +// PLL controller divider 9 register - r/w +#define C66XX_PLL_PLLDIV9_RG_OFFSET 0x174 +// PLL controller divider 10 register - r/w +#define C66XX_PLL_PLLDIV10_RG_OFFSET 0x178 +// PLL controller divider 11 register - r/w +#define C66XX_PLL_PLLDIV11_RG_OFFSET 0x17c +// PLL controller divider 12 register - r/w +#define C66XX_PLL_PLLDIV12_RG_OFFSET 0x180 +// PLL controller divider 13 register - r/w +#define C66XX_PLL_PLLDIV13_RG_OFFSET 0x184 +// PLL controller divider 14 register - r/w +#define C66XX_PLL_PLLDIV14_RG_OFFSET 0x188 +// PLL controller divider 15 register - r/w +#define C66XX_PLL_PLLDIV15_RG_OFFSET 0x18c +// PLL controller divider 16 register - r/w +#define C66XX_PLL_PLLDIV16_RG_OFFSET 0x190 + +#define C66XX_PLL_PLLCTL_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLCTL_RG_OFFSET) +#define C66XX_PLL_SECCTL_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_SECCTL_RG_OFFSET) +#define C66XX_PLL_PLLM_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLM_RG_OFFSET) +#define C66XX_PLL_PLLDIV1_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV1_RG_OFFSET) +#define C66XX_PLL_PLLDIV2_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV2_RG_OFFSET) +#define C66XX_PLL_PLLDIV3_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV3_RG_OFFSET) +#define C66XX_PLL_PLLCMD_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLCMD_RG_OFFSET) +#define C66XX_PLL_PLLSTAT_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLSTAT_RG_OFFSET) +#define C66XX_PLL_ALNCTL_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_ALNCTL_RG_OFFSET) +#define C66XX_PLL_DCHANGE_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_DCHANGE_RG_OFFSET) +#define C66XX_PLL_SYSTAT_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_SYSTAT_RG_OFFSET) +#define C66XX_PLL_PLLDIV4_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV4_RG_OFFSET) +#define C66XX_PLL_PLLDIV5_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV5_RG_OFFSET) +#define C66XX_PLL_PLLDIV6_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV6_RG_OFFSET) +#define C66XX_PLL_PLLDIV7_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV7_RG_OFFSET) +#define C66XX_PLL_PLLDIV8_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV8_RG_OFFSET) +#define C66XX_PLL_PLLDIV9_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV9_RG_OFFSET) +#define C66XX_PLL_PLLDIV10_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV10_RG_OFFSET) +#define C66XX_PLL_PLLDIV11_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV11_RG_OFFSET) +#define C66XX_PLL_PLLDIV12_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV12_RG_OFFSET) +#define C66XX_PLL_PLLDIV13_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV13_RG_OFFSET) +#define C66XX_PLL_PLLDIV14_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV14_RG_OFFSET) +#define C66XX_PLL_PLLDIV15_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV15_RG_OFFSET) +#define C66XX_PLL_PLLDIV16_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV16_RG_OFFSET) + + +//------------ PLL control register defs -------------------------------------- +#define C66XX_PLL_PLLCTL_PLLENSRC_BITMASK 0x20 +#define C66XX_PLL_PLLCTL_PLLENSRC_BITSHIFT 5 +#define C66XX_PLL_PLLCTL_PLLRST_BITMASK 0x8 +#define C66XX_PLL_PLLCTL_PLLRST_BITSHIFT 3 +#define C66XX_PLL_PLLCTL_PLLPWRDN_BITMASK 0x2 +#define C66XX_PLL_PLLCTL_PLLPWRDN_BITSHIFT 1 +#define C66XX_PLL_PLLCTL_PLLEN_BITMASK 0x1 +#define C66XX_PLL_PLLCTL_PLLEN_BITSHIFT 0 + + +//------------ PLL secondary control register defs ---------------------------- +#define C66XX_PLL_SECCTL_BYPASS_BITMASK 0x00800000 +#define C66XX_PLL_SECCTL_BYPASS_BITSHIFT 23 +#define C66XX_PLL_SECCTL_OUTPUT_DIVIDE_BITMASK 0x00780000 +#define C66XX_PLL_SECCTL_OUTPUT_DIVIDE_BITSHIFT 19 + + +//------------ PLL multiplier control register defs --------------------------- +#define C66XX_PLL_PLLM_PLLM_BITMASK 0x3f +#define C66XX_PLL_PLLM_PLLM_BITSHIFT 0 + + +//------------ PLL controller divider registers defs -------------------------- +#define C66XX_PLL_PLLDIV_DEN_BITMASK 0x8000 +#define C66XX_PLL_PLLDIV_DEN_BITSHIFT 15 +#define C66XX_PLL_PLLDIV_RATIO_BITMASK 0xff +#define C66XX_PLL_PLLDIV_RATIO_BITSHIFT 0 + + +//------------ PLL controller command register defs --------------------------- +#define C66XX_PLL_PLLCMD_GOSET_BITMASK 0x1 +#define C66XX_PLL_PLLCMD_GOSET_BITSHIFT 0 + + +//------------ PLL controller status register defs ---------------------------- +#define C66XX_PLL_PLLSTAT_GOSTAT_BITMASK 0x1 +#define C66XX_PLL_PLLSTAT_GOSTAT_BITSHIFT 0 + + +//------------ PLL controller clock align control register defs --------------- +#define C66XX_PLL_ALNCTL_ALN_BITMASK 0xffff +#define C66XX_PLL_ALNCTL_ALN_BITSHIFT 0 + + +//------------ PLL controller divider ratio change status register defs ------- +#define C66XX_PLL_DCHANGE_SYS_BITMASK 0xffff +#define C66XX_PLL_DCHANGE_SYS_BITSHIFT 0 + + +//------------ SYSCLK status register defs ------------------------------------ +#define C66XX_PLL_SYSTAT_SYSON_BITMASK 0xffff +#define C66XX_PLL_SYSTAT_SYSON_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ Device State Control registers ================================= +//============================================================================= +/* + * !!! Note that this section contains only those definitions + * that are missed in TI C6000 Chip Support Library (CSL) !!! + */ + +// JTAG ID register - r-only +#define C66XX_BOOTCFG_JTAGID_RG_OFFSET 0x18 +// Device status register - r/w +#define C66XX_BOOTCFG_DEVSTAT_RG_OFFSET 0x20 +// Boot kicker 0 register - r/w +#define C66XX_BOOTCFG_KICK0_RG_OFFSET 0x38 +// Boot kicker 1 register - r/w +#define C66XX_BOOTCFG_KICK1_RG_OFFSET 0x3c +// DSP0 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR0_RG_OFFSET 0x40 +// DSP1 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR1_RG_OFFSET 0x44 +// DSP2 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR2_RG_OFFSET 0x48 +// DSP3 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR3_RG_OFFSET 0x4c +// DSP4 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR4_RG_OFFSET 0x50 +// DSP5 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR5_RG_OFFSET 0x54 +// DSP6 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR6_RG_OFFSET 0x58 +// DSP7 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR7_RG_OFFSET 0x5c +// MAC 1 address register - r-only +#define C66XX_BOOTCFG_MACID1_RG_OFFSET 0x110 +// MAC 2 address register - r-only +#define C66XX_BOOTCFG_MACID2_RG_OFFSET 0x114 +// LRESETNMI PIN status clear register - r/w +#define C66XX_BOOTCFG_LRSTNMIPINSTAT_CLR_RG_OFFSET 0x130 +// Reset status clear register - r/w +#define C66XX_BOOTCFG_RESET_STAT_CLR_RG_OFFSET 0x134 +// Boot complete register - r/w +#define C66XX_BOOTCFG_BOOTCOMPLETE_RG_OFFSET 0x13c +// Reset status register - r-only +#define C66XX_BOOTCFG_RESET_STAT_RG_OFFSET 0x144 +// LRESETNMI PIN status register - r-only +#define C66XX_BOOTCFG_LRSTNMIPINSTAT_RG_OFFSET 0x148 +// Device configuration register - r/w +#define C66XX_BOOTCFG_DEVCFG_RG_OFFSET 0x14c +// Power state control register - r/w +#define C66XX_BOOTCFG_PWRSTATECTL_RG_OFFSET 0x150 +// SRIO SerDes macro status register - r-only +#define C66XX_BOOTCFG_SRIO_SERDES_STS_RG_OFFSET 0x154 +// SMGII SerDes macro status register - r-only +#define C66XX_BOOTCFG_SMGII_SERDES_STS_RG_OFFSET 0x158 +// PCIe SerDes macro status register - r-only +#define C66XX_BOOTCFG_PCIE_SERDES_STS_RG_OFFSET 0x15c +// HyperLink SerDes macro status register - r-only +#define C66XX_BOOTCFG_HYPERLINK_SERDES_STS_RG_OFFSET 0x160 +// NMI generation for CorePac0 register - r/w +#define C66XX_BOOTCFG_NMIGR0_RG_OFFSET 0x200 +// NMI generation for CorePac1 register - r/w +#define C66XX_BOOTCFG_NMIGR1_RG_OFFSET 0x204 +// NMI generation for CorePac2 register - r/w +#define C66XX_BOOTCFG_NMIGR2_RG_OFFSET 0x208 +// NMI generation for CorePac3 register - r/w +#define C66XX_BOOTCFG_NMIGR3_RG_OFFSET 0x20c +// NMI generation for CorePac4 register - r/w +#define C66XX_BOOTCFG_NMIGR4_RG_OFFSET 0x210 +// NMI generation for CorePac5 register - r/w +#define C66XX_BOOTCFG_NMIGR5_RG_OFFSET 0x214 +// NMI generation for CorePac6 register - r/w +#define C66XX_BOOTCFG_NMIGR6_RG_OFFSET 0x218 +// NMI generation for CorePac7 register - r/w +#define C66XX_BOOTCFG_NMIGR7_RG_OFFSET 0x21c +// IPC generation for CorePac0 register - r/w +#define C66XX_BOOTCFG_IPCGR0_RG_OFFSET 0x240 +// IPC generation for CorePac1 register - r/w +#define C66XX_BOOTCFG_IPCGR1_RG_OFFSET 0x244 +// IPC generation for CorePac2 register - r/w +#define C66XX_BOOTCFG_IPCGR2_RG_OFFSET 0x248 +// IPC generation for CorePac3 register - r/w +#define C66XX_BOOTCFG_IPCGR3_RG_OFFSET 0x24c +// IPC generation for CorePac4 register - r/w +#define C66XX_BOOTCFG_IPCGR4_RG_OFFSET 0x250 +// IPC generation for CorePac5 register - r/w +#define C66XX_BOOTCFG_IPCGR5_RG_OFFSET 0x254 +// IPC generation for CorePac6 register - r/w +#define C66XX_BOOTCFG_IPCGR6_RG_OFFSET 0x258 +// IPC generation for CorePac7 register - r/w +#define C66XX_BOOTCFG_IPCGR7_RG_OFFSET 0x25c + +// Timer Input Selection register - r/w +#define C66XX_BOOTCFG_TINPSEL_RG_OFFSET 0x300 +// Timer Output Selection register - r/w +#define C66XX_BOOTCFG_TOUTPSEL_RG_OFFSET 0x304 + +// Main PLL Control register 0 - r/w +#define C66XX_BOOTCFG_MAINPLLCTL0_RG_OFFSET 0x328 +// Main PLL Control register 1 - r/w +#define C66XX_BOOTCFG_MAINPLLCTL1_RG_OFFSET 0x32c +// DDR3 PLL Control register 0 - r/w +#define C66XX_BOOTCFG_DDR3PLLCTL0_RG_OFFSET 0x330 +// DDR3 PLL Control register 1 - r/w +#define C66XX_BOOTCFG_DDR3PLLCTL1_RG_OFFSET 0x334 +// Pass PLL Control register 0 - r/w +#define C66XX_BOOTCFG_PASSPLLCTL0_RG_OFFSET 0x338 +// Pass PLL Control register 1 - r/w +#define C66XX_BOOTCFG_PASSPLLCTL1_RG_OFFSET 0x33c +// Device speed register - r-only +#define C66XX_BOOTCFG_DEVSPEED_RG_OFFSET 0x3f8 + +#define C66XX_BOOTCFG_TINPSEL_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_TINPSEL_RG_OFFSET) +#define C66XX_BOOTCFG_TOUTPSEL_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_TOUTPSEL_RG_OFFSET) +#define C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_MAINPLLCTL0_RG_OFFSET) +#define C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_MAINPLLCTL1_RG_OFFSET) +#define C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_DDR3PLLCTL0_RG_OFFSET) +#define C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_DDR3PLLCTL1_RG_OFFSET) +#define C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_PASSPLLCTL0_RG_OFFSET) +#define C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_PASSPLLCTL1_RG_OFFSET) +#define C66XX_BOOTCFG_DEVSPEED_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_DEVSPEED_RG_OFFSET) + + +//------------ Main PLL Control register 0 defs ------------------------------- +#define C66XX_BOOTCFG_MAINPLLCTL0_BWADJ_BITMASK 0xff000000 +#define C66XX_BOOTCFG_MAINPLLCTL0_BWADJ_BITSHIFT 24 +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLM_BITMASK 0x7f000 +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLM_BITSHIFT 12 +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLD_BITMASK 0x3f +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLD_BITSHIFT 0 + + +//------------ Main PLL Control register 1 defs ------------------------------- +#define C66XX_BOOTCFG_MAINPLLCTL1_ENSAT_BITMASK 0x40 +#define C66XX_BOOTCFG_MAINPLLCTL1_ENSAT_BITSHIFT 6 +#define C66XX_BOOTCFG_MAINPLLCTL1_BWADJ_BITMASK 0xf +#define C66XX_BOOTCFG_MAINPLLCTL1_BWADJ_BITSHIFT 0 + + +//------------ DDR3 PLL Control register 0 defs ------------------------------- +#define C66XX_BOOTCFG_DDR3PLLCTL0_BWADJ_BITMASK 0xff000000 +#define C66XX_BOOTCFG_DDR3PLLCTL0_BWADJ_BITSHIFT 24 +#define C66XX_BOOTCFG_DDR3PLLCTL0_BYPASS_BITMASK 0x800000 +#define C66XX_BOOTCFG_DDR3PLLCTL0_BYPASS_BITSHIFT 23 +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLM_BITMASK 0x7ffc0 +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLM_BITSHIFT 6 +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLD_BITMASK 0x3f +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLD_BITSHIFT 0 + + +//------------ DDR3 PLL Control register 1 defs ------------------------------- +#define C66XX_BOOTCFG_DDR3PLLCTL1_PLLRST_BITMASK 0x2000 +#define C66XX_BOOTCFG_DDR3PLLCTL1_PLLRST_BITSHIFT 13 +#define C66XX_BOOTCFG_DDR3PLLCTL1_ENSAT_BITMASK 0x40 +#define C66XX_BOOTCFG_DDR3PLLCTL1_ENSAT_BITSHIFT 6 +#define C66XX_BOOTCFG_DDR3PLLCTL1_BWADJ_BITMASK 0xf +#define C66XX_BOOTCFG_DDR3PLLCTL1_BWADJ_BITSHIFT 0 + + +//------------ PASS PLL Control register 0 defs ------------------------------- +#define C66XX_BOOTCFG_PASSPLLCTL0_BWADJ_BITMASK 0xff000000 +#define C66XX_BOOTCFG_PASSPLLCTL0_BWADJ_BITSHIFT 24 +#define C66XX_BOOTCFG_PASSPLLCTL0_BYPASS_BITMASK 0x800000 +#define C66XX_BOOTCFG_PASSPLLCTL0_BYPASS_BITSHIFT 23 +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLM_BITMASK 0x7ffc0 +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLM_BITSHIFT 6 +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLD_BITMASK 0x3f +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLD_BITSHIFT 0 + + +//------------ PASS PLL Control register 1 defs ------------------------------- +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLRST_BITMASK 0x4000 +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLRST_BITSHIFT 14 +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLSELECT_BITMASK 0x2000 +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLSELECT_BITSHIFT 13 +#define C66XX_BOOTCFG_PASSPLLCTL1_ENSAT_BITMASK 0x40 +#define C66XX_BOOTCFG_PASSPLLCTL1_ENSAT_BITSHIFT 6 +#define C66XX_BOOTCFG_PASSPLLCTL1_BWADJ_BITMASK 0xf +#define C66XX_BOOTCFG_PASSPLLCTL1_BWADJ_BITSHIFT 0 + + +//------------ Device speed register defs ------------------------------------- +#define C66XX_BOOTCFG_DEVSPEED_DEVSPEED_BITMASK 0xff800000 +#define C66XX_BOOTCFG_DEVSPEED_DEVSPEED_BITSHIFT 23 + +// DSP core speed defs in MHz +#define C66XX_DSP_CORE_SPEED_800MHZ 800 +#define C66XX_DSP_CORE_SPEED_1000MHZ 1000 +#define C66XX_DSP_CORE_SPEED_1200MHZ 1200 +#define C66XX_DSP_CORE_SPEED_1250MHZ 1250 +#define C66XX_DSP_CORE_SPEED_1400MHZ 1400 + + +//------------ MACID2 register defs ------------------------------------------- +#define C66XX_BOOTCFG_MACID2_MACID_BITMASK 0xffff +#define C66XX_BOOTCFG_MACID2_MACID_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ Power & sleep controller definitions =========================== +//============================================================================= +/* + * !!! Note that this section contains only those definitions + * that are missed in TI C6000 Chip Support Library (CSL) !!! + */ + +// Power Domains Definitions +#define C66XX_PSC_PD_ALWAYSON 0 +#define C66XX_PSC_PD_TETB 1 +#define C66XX_PSC_PD_PA 2 +#define C66XX_PSC_PD_PCIE 3 +#define C66XX_PSC_PD_SRIO 4 +#define C66XX_PSC_PD_HYPERLINK 5 +#define C66XX_PSC_PD_MSM_SRAM 7 +#define C66XX_PSC_PD_DSP0 8 +#define C66XX_PSC_PD_DSP1 9 +#define C66XX_PSC_PD_DSP2 10 +#define C66XX_PSC_PD_DSP3 11 +#define C66XX_PSC_PD_DSP4 12 +#define C66XX_PSC_PD_DSP5 13 +#define C66XX_PSC_PD_DSP6 14 +#define C66XX_PSC_PD_DSP7 15 +#define C66XX_PSC_PD_COUNT (C66XX_PSC_PD_DSP7 + 1) + +// Power Domains State Definitions +#define C66XX_PSC_PD_STATE_OFF PSC_PDSTATE_OFF +#define C66XX_PSC_PD_STATE_ON PSC_PDSTATE_ON + + +// Power & Sleep Controller Clock Domains Definitions +#define C66XX_PSC_LPSC_SHARED_LPSC 0 +#define C66XX_PSC_LPSC_SMARTREFLEX 1 +#define C66XX_PSC_LPSC_DDR3_EMIF 2 +#define C66XX_PSC_LPSC_EMIF16_SPI 3 +#define C66XX_PSC_LPSC_TSIP 4 +#define C66XX_PSC_LPSC_DEBUG_TRACE 5 +#define C66XX_PSC_LPSC_TETB 6 +#define C66XX_PSC_LPSC_PA 7 +#define C66XX_PSC_LPSC_ETHERNET 8 +#define C66XX_PSC_LPSC_SA 9 +#define C66XX_PSC_LPSC_PCIE 10 +#define C66XX_PSC_LPSC_SRIO 11 +#define C66XX_PSC_LPSC_HYPERLINK 12 +#define C66XX_PSC_LPSC_MSM_SRAM 14 +#define C66XX_PSC_LPSC_DSP0 15 +#define C66XX_PSC_LPSC_DSP1 16 +#define C66XX_PSC_LPSC_DSP2 17 +#define C66XX_PSC_LPSC_DSP3 18 +#define C66XX_PSC_LPSC_DSP4 19 +#define C66XX_PSC_LPSC_DSP5 20 +#define C66XX_PSC_LPSC_DSP6 21 +#define C66XX_PSC_LPSC_DSP7 22 +#define C66XX_PSC_LPSC_COUNT (C66XX_PSC_LPSC_DSP7 + 1) + +// Clock Domains State Definitions +#define C66XX_PSC_LPSC_STATE_OFF PSC_MODSTATE_SWRSTDISABLE +#define C66XX_PSC_LPSC_STATE_ON PSC_MODSTATE_ENABLE + +//============================================================================= + + + +//============================================================================= +//============ I2C definitions ================================================ +//============================================================================= +/* + * !!! Note that this section contains only those definitions + * that are missed in TI C6000 Chip Support Library (CSL) !!! + */ + +// I2C own address register - r/w +#define C66XX_I2C_ICOAR_RG_OFFSET 0x00 +// I2C interrupt mask register - r/w +#define C66XX_I2C_ICIMR_RG_OFFSET 0x04 +// I2C interrupt status register - r/w +#define C66XX_I2C_ICSTR_RG_OFFSET 0x08 +// I2C clock low-time divider register - r/w +#define C66XX_I2C_ICCLKL_RG_OFFSET 0x0c +// I2C clock high-time divider register - r/w +#define C66XX_I2C_ICCLKH_RG_OFFSET 0x10 +// I2C data count register - r/w +#define C66XX_I2C_ICCNT_RG_OFFSET 0x14 +// I2C data receive register - r-only +#define C66XX_I2C_ICDRR_RG_OFFSET 0x18 +// I2C slave address register - r/w +#define C66XX_I2C_ICSAR_RG_OFFSET 0x1c +// I2C data transmit register - r/w +#define C66XX_I2C_ICDXR_RG_OFFSET 0x20 +// I2C mode register - r/w +#define C66XX_I2C_ICMDR_RG_OFFSET 0x24 +// I2C interrupt vector register - r/w +#define C66XX_I2C_ICIVR_RG_OFFSET 0x28 +// I2C extended mode register - r/w +#define C66XX_I2C_ICEMDR_RG_OFFSET 0x2c +// I2C prescaler register - r/w +#define C66XX_I2C_ICPSC_RG_OFFSET 0x30 +// I2C peripheral identification 1 register - r/w +#define C66XX_I2C_ICPID1_RG_OFFSET 0x34 +// I2C peripheral identification 2 register - r/w +#define C66XX_I2C_ICPID2_RG_OFFSET 0x38 + +#define C66XX_I2C_ICOAR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICOAR_RG_OFFSET) +#define C66XX_I2C_ICIMR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICIMR_RG_OFFSET) +#define C66XX_I2C_ICSTR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICSTR_RG_OFFSET) +#define C66XX_I2C_ICCLKL_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICCLKL_RG_OFFSET) +#define C66XX_I2C_ICCLKH_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICCLKH_RG_OFFSET) +#define C66XX_I2C_ICCNT_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICCNT_RG_OFFSET) +#define C66XX_I2C_ICDRR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICDRR_RG_OFFSET) +#define C66XX_I2C_ICSAR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICSAR_RG_OFFSET) +#define C66XX_I2C_ICDXR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICDXR_RG_OFFSET) +#define C66XX_I2C_ICMDR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICMDR_RG_OFFSET) +#define C66XX_I2C_ICIVR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICIVR_RG_OFFSET) +#define C66XX_I2C_ICEMDR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICEMDR_RG_OFFSET) +#define C66XX_I2C_ICPSC_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICPSC_RG_OFFSET) +#define C66XX_I2C_ICPID1_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICPID1_RG_OFFSET) +#define C66XX_I2C_ICPID2_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICPID2_RG_OFFSET) + + +//------------ I2C own address register defs ---------------------------------- +#define C66XX_I2C_ICOAR_OADDR_BITMASK 0x3ff +#define C66XX_I2C_ICOAR_OADDR_BITSHIFT 0 + + +//------------ I2C interrupt mask register defs ------------------------------- +#define C66XX_I2C_ICIMR_AAS_BITMASK 0x40 +#define C66XX_I2C_ICIMR_AAS_BITSHIFT 6 +#define C66XX_I2C_ICIMR_SCD_BITMASK 0x20 +#define C66XX_I2C_ICIMR_SCD_BITSHIFT 5 +#define C66XX_I2C_ICIMR_ICXRDY_BITMASK 0x10 +#define C66XX_I2C_ICIMR_ICXRDY_BITSHIFT 4 +#define C66XX_I2C_ICIMR_ICRDRDY_BITMASK 0x8 +#define C66XX_I2C_ICIMR_ICRDRDY_BITSHIFT 3 +#define C66XX_I2C_ICIMR_ARDY_BITMASK 0x4 +#define C66XX_I2C_ICIMR_ARDY_BITSHIFT 2 +#define C66XX_I2C_ICIMR_NACK_BITMASK 0x2 +#define C66XX_I2C_ICIMR_NACK_BITSHIFT 1 +#define C66XX_I2C_ICIMR_AL_BITMASK 0x1 +#define C66XX_I2C_ICIMR_AL_BITSHIFT 0 +#define C66XX_I2C_ICIMR_RG_BITMASK 0x7f + + +//------------ I2C interrupt status register defs ----------------------------- +#define C66XX_I2C_ICSTR_SDIR_BITMASK 0x4000 +#define C66XX_I2C_ICSTR_SDIR_BITSHIFT 14 +#define C66XX_I2C_ICSTR_NACKSNT_BITMASK 0x2000 +#define C66XX_I2C_ICSTR_NACKSNT_BITSHIFT 13 +#define C66XX_I2C_ICSTR_BB_BITMASK 0x1000 +#define C66XX_I2C_ICSTR_BB_BITSHIFT 12 +#define C66XX_I2C_ICSTR_RSFULL_BITMASK 0x800 +#define C66XX_I2C_ICSTR_RSFULL_BITSHIFT 11 +#define C66XX_I2C_ICSTR_XSMT_BITMASK 0x400 +#define C66XX_I2C_ICSTR_XSMT_BITSHIFT 10 +#define C66XX_I2C_ICSTR_AAS_BITMASK 0x200 +#define C66XX_I2C_ICSTR_AAS_BITSHIFT 9 +#define C66XX_I2C_ICSTR_AD0_BITMASK 0x100 +#define C66XX_I2C_ICSTR_AD0_BITSHIFT 8 +#define C66XX_I2C_ICSTR_SCD_BITMASK 0x20 +#define C66XX_I2C_ICSTR_SCD_BITSHIFT 5 +#define C66XX_I2C_ICSTR_ICXRDY_BITMASK 0x10 +#define C66XX_I2C_ICSTR_ICXRDY_BITSHIFT 4 +#define C66XX_I2C_ICSTR_ICRDRDY_BITMASK 0x8 +#define C66XX_I2C_ICSTR_ICRDRDY_BITSHIFT 3 +#define C66XX_I2C_ICSTR_ARDY_BITMASK 0x4 +#define C66XX_I2C_ICSTR_ARDY_BITSHIFT 2 +#define C66XX_I2C_ICSTR_NACK_BITMASK 0x2 +#define C66XX_I2C_ICSTR_NACK_BITSHIFT 1 +#define C66XX_I2C_ICSTR_AL_BITMASK 0x1 +#define C66XX_I2C_ICSTR_AL_BITSHIFT 0 + + +//------------ I2C clock low-time divider register defs ----------------------- +#define C66XX_I2C_ICCLKL_ICCL_BITMASK 0xffff +#define C66XX_I2C_ICCLKL_ICCL_BITSHIFT 0 + + +//------------ I2C clock high-time divider register defs ---------------------- +#define C66XX_I2C_ICCLKH_ICCH_BITMASK 0xffff +#define C66XX_I2C_ICCLKH_ICCH_BITSHIFT 0 + + +//------------ I2C data count register defs ----------------------------------- +#define C66XX_I2C_ICCNT_ICDC_BITMASK 0xffff +#define C66XX_I2C_ICCNT_ICDC_BITSHIFT 0 + + +//------------ I2C data receive register defs --------------------------------- +#define C66XX_I2C_ICDRR_D_BITMASK 0xff +#define C66XX_I2C_ICDRR_D_BITSHIFT 0 + + +//------------ I2C slave address register defs -------------------------------- +#define C66XX_I2C_ICSAR_SADDR_BITMASK 0x3ff +#define C66XX_I2C_ICSAR_SADDR_BITSHIFT 0 + + +//------------ I2C data transmit register defs -------------------------------- +#define C66XX_I2C_ICDXR_D_BITMASK 0xff +#define C66XX_I2C_ICDXR_D_BITSHIFT 0 + + +//------------ I2C mode register defs ----------------------------------------- +#define C66XX_I2C_ICMDR_NACKMOD_BITMASK 0x8000 +#define C66XX_I2C_ICMDR_NACKMOD_BITSHIFT 15 +#define C66XX_I2C_ICMDR_FREE_BITMASK 0x4000 +#define C66XX_I2C_ICMDR_FREE_BITSHIFT 14 +#define C66XX_I2C_ICMDR_STT_BITMASK 0x2000 +#define C66XX_I2C_ICMDR_STT_BITSHIFT 13 +#define C66XX_I2C_ICMDR_STP_BITMASK 0x800 +#define C66XX_I2C_ICMDR_STP_BITSHIFT 11 +#define C66XX_I2C_ICMDR_MST_BITMASK 0x400 +#define C66XX_I2C_ICMDR_MST_BITSHIFT 10 +#define C66XX_I2C_ICMDR_TRX_BITMASK 0x200 +#define C66XX_I2C_ICMDR_TRX_BITSHIFT 9 +#define C66XX_I2C_ICMDR_XA_BITMASK 0x100 +#define C66XX_I2C_ICMDR_XA_BITSHIFT 8 +#define C66XX_I2C_ICMDR_RM_BITMASK 0x80 +#define C66XX_I2C_ICMDR_RM_BITSHIFT 7 +#define C66XX_I2C_ICMDR_DLB_BITMASK 0x40 +#define C66XX_I2C_ICMDR_DLB_BITSHIFT 6 +#define C66XX_I2C_ICMDR_IRS_BITMASK 0x20 +#define C66XX_I2C_ICMDR_IRS_BITSHIFT 5 +#define C66XX_I2C_ICMDR_STB_BITMASK 0x10 +#define C66XX_I2C_ICMDR_STB_BITSHIFT 4 +#define C66XX_I2C_ICMDR_FDF_BITMASK 0x8 +#define C66XX_I2C_ICMDR_FDF_BITSHIFT 3 +#define C66XX_I2C_ICMDR_BC_BITMASK 0x7 +#define C66XX_I2C_ICMDR_BC_BITSHIFT 0 + + +//------------ I2C interrupt vector register defs ----------------------------- +#define C66XX_I2C_ICIVR_INTCODE_BITMASK 0x7 +#define C66XX_I2C_ICIVR_INTCODE_BITSHIFT 0 + + +//------------ I2C extended mode register defs -------------------------------- +#define C66XX_I2C_ICEMDR_IGNACK_BITMASK 0x2 +#define C66XX_I2C_ICEMDR_IGNACK_BITSHIFT 1 +#define C66XX_I2C_ICEMDR_BCM_BITMASK 0x1 +#define C66XX_I2C_ICEMDR_BCM_BITSHIFT 0 + + +//------------ I2C prescaler register defs ------------------------------------ +#define C66XX_I2C_ICPSC_IPSC_BITMASK 0xff +#define C66XX_I2C_ICPSC_IPSC_BITSHIFT 0 + + +//------------ I2C peripheral identification 1 register defs ------------------ +#define C66XX_I2C_ICPID1_CLASS_BITMASK 0xff00 +#define C66XX_I2C_ICPID1_CLASS_BITSHIFT 8 +#define C66XX_I2C_ICPID1_REVISION_BITMASK 0xff +#define C66XX_I2C_ICPID1_REVISION_BITSHIFT 0 + + +//------------ I2C peripheral identification 2 register defs ------------------ +#define C66XX_I2C_ICPID2_TYPE_BITMASK 0xffff +#define C66XX_I2C_ICPID2_TYPE_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ EMIF16 configuration registers ================================= +//============================================================================= +// Revision code and status register - r-only +#define C66XX_EMIF16_RCSR_RG_OFFSET 0x00 +// Async wait cycle config register - r/w +#define C66XX_EMIF16_AWCCR_RG_OFFSET 0x04 +// Async 1 (CE0) config register - r/w +#define C66XX_EMIF16_A1CR_RG_OFFSET 0x10 +// Async 2 (CE1) config register - r/w +#define C66XX_EMIF16_A2CR_RG_OFFSET 0x14 +// Async 3 (CE2) config register - r/w +#define C66XX_EMIF16_A3CR_RG_OFFSET 0x18 +// Async 4 (CE3) config register - r/w +#define C66XX_EMIF16_A4CR_RG_OFFSET 0x1c +// Interrupt raw register - r/w +#define C66XX_EMIF16_IRR_RG_OFFSET 0x40 +// Interrupt masked register - r/w +#define C66XX_EMIF16_IMR_RG_OFFSET 0x44 +// Interrupt mask set register - r/w +#define C66XX_EMIF16_IMSR_RG_OFFSET 0x48 +// Interrupt mask clear register - r/w +#define C66XX_EMIF16_IMCR_RG_OFFSET 0x4c +// Page mode control register - r/w +#define C66XX_EMIF16_PMCR_RG_OFFSET 0x68 + +#define C66XX_EMIF16_RCSR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_RCSR_RG_OFFSET) +#define C66XX_EMIF16_AWCCR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_AWCCR_RG_OFFSET) +#define C66XX_EMIF16_A1CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A1CR_RG_OFFSET) +#define C66XX_EMIF16_A2CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A2CR_RG_OFFSET) +#define C66XX_EMIF16_A3CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A3CR_RG_OFFSET) +#define C66XX_EMIF16_A4CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A4CR_RG_OFFSET) +#define C66XX_EMIF16_IRR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IRR_RG_OFFSET) +#define C66XX_EMIF16_IMR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IMR_RG_OFFSET) +#define C66XX_EMIF16_IMSR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IMSR_RG_OFFSET) +#define C66XX_EMIF16_IMCR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IMCR_RG_OFFSET) +#define C66XX_EMIF16_PMCR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_PMCR_RG_OFFSET) + + +//------------ Revision code and status register defs ------------------------- +#define C66XX_EMIF16_RCSR_BE_BITMASK 0x80000000 +#define C66XX_EMIF16_RCSR_BE_BITSHIFT 31 +#define C66XX_EMIF16_RCSR_MOD_ID_BITMASK 0x3fff0000 +#define C66XX_EMIF16_RCSR_MOD_ID_BITSHIFT 16 +#define C66XX_EMIF16_RCSR_MJ_REV_BITMASK 0xff00 +#define C66XX_EMIF16_RCSR_MJ_REV_BITSHIFT 8 +#define C66XX_EMIF16_RCSR_MIN_REV_BITMASK 0xff +#define C66XX_EMIF16_RCSR_MIN_REV_BITSHIFT 0 + +#define C66XX_EMIF16_RCSR_MOD_ID_DEFAULT_VALUE 0x46 +#define C66XX_EMIF16_RCSR_MJ_REV_DEFAULT_VALUE 0x4 +#define C66XX_EMIF16_RCSR_MIN_REV_DEFAULT_VALUE 0x0 + + +//------------ Async wait cycle config register defs -------------------------- +#define C66XX_EMIF16_AWCCR_WP1_BITMASK 0x20000000 +#define C66XX_EMIF16_AWCCR_WP1_BITSHIFT 29 +#define C66XX_EMIF16_AWCCR_WP0_BITMASK 0x10000000 +#define C66XX_EMIF16_AWCCR_WP0_BITSHIFT 28 +#define C66XX_EMIF16_AWCCR_CS5_WAIT_BITMASK 0xc00000 +#define C66XX_EMIF16_AWCCR_CS5_WAIT_BITSHIFT 22 +#define C66XX_EMIF16_AWCCR_CS4_WAIT_BITMASK 0x300000 +#define C66XX_EMIF16_AWCCR_CS4_WAIT_BITSHIFT 20 +#define C66XX_EMIF16_AWCCR_CS3_WAIT_BITMASK 0xc0000 +#define C66XX_EMIF16_AWCCR_CS3_WAIT_BITSHIFT 18 +#define C66XX_EMIF16_AWCCR_CS2_WAIT_BITMASK 0x30000 +#define C66XX_EMIF16_AWCCR_CS2_WAIT_BITSHIFT 16 +#define C66XX_EMIF16_AWCCR_MAX_EXT_WAIT_BITMASK 0xff +#define C66XX_EMIF16_AWCCR_MAX_EXT_WAIT_BITSHIFT 0 + + +//------------ Async 1 config register defs ----------------------------------- +#define C66XX_EMIF16_A1CR_SS_BITMASK 0x80000000 +#define C66XX_EMIF16_A1CR_SS_BITSHIFT 31 +#define C66XX_EMIF16_A1CR_EW_BITMASK 0x40000000 +#define C66XX_EMIF16_A1CR_EW_BITSHIFT 30 +#define C66XX_EMIF16_A1CR_W_SETUP_BITMASK 0x3c000000 +#define C66XX_EMIF16_A1CR_W_SETUP_BITSHIFT 26 +#define C66XX_EMIF16_A1CR_W_STROBE_BITMASK 0x3f00000 +#define C66XX_EMIF16_A1CR_W_STROBE_BITSHIFT 20 +#define C66XX_EMIF16_A1CR_W_HOLD_BITMASK 0xe0000 +#define C66XX_EMIF16_A1CR_W_HOLD_BITSHIFT 17 +#define C66XX_EMIF16_A1CR_R_SETUP_BITMASK 0x1e000 +#define C66XX_EMIF16_A1CR_R_SETUP_BITSHIFT 13 +#define C66XX_EMIF16_A1CR_R_STROBE_BITMASK 0x1f80 +#define C66XX_EMIF16_A1CR_R_STROBE_BITSHIFT 7 +#define C66XX_EMIF16_A1CR_R_HOLD_BITMASK 0x70 +#define C66XX_EMIF16_A1CR_R_HOLD_BITSHIFT 4 +#define C66XX_EMIF16_A1CR_TA_BITMASK 0xc +#define C66XX_EMIF16_A1CR_TA_BITSHIFT 2 +#define C66XX_EMIF16_A1CR_ASIZE_BITMASK 0x3 +#define C66XX_EMIF16_A1CR_ASIZE_BITSHIFT 0 + +#define C66XX_EMIF16_A1CR_ASIZE_8BIT 0 +#define C66XX_EMIF16_A1CR_ASIZE_16BIT 1 + + +//------------ Interrupt raw register defs ------------------------------------ +#define C66XX_EMIF16_IRR_WR_BITMASK 0x3c +#define C66XX_EMIF16_IRR_WR_BITSHIFT 2 +#define C66XX_EMIF16_IRR_AT_BITMASK 0x1 +#define C66XX_EMIF16_IRR_AT_BITSHIFT 0 + + +//------------ Interrupt masked register defs --------------------------------- +#define C66XX_EMIF16_IMR_WR_MASKED_BITMASK 0x3c +#define C66XX_EMIF16_IMR_WR_MASKED_BITSHIFT 2 +#define C66XX_EMIF16_IMR_AT_MASKED_BITMASK 0x1 +#define C66XX_EMIF16_IMR_AT_MASKED_BITSHIFT 0 + + +//------------ Interrupt mask set register defs ------------------------------- +#define C66XX_EMIF16_IMSR_WR_MASK_SET_BITMASK 0x3c +#define C66XX_EMIF16_IMSR_WR_MASK_SET_BITSHIFT 2 +#define C66XX_EMIF16_IMSR_AT_MASK_SET_BITMASK 0x1 +#define C66XX_EMIF16_IMSR_AT_MASK_SET_BITSHIFT 0 + + +//------------ Interrupt mask clear register defs ----------------------------- +#define C66XX_EMIF16_IMCR_WR_MASK_CLR_BITMASK 0x3c +#define C66XX_EMIF16_IMCR_WR_MASK_CLR_BITSHIFT 2 +#define C66XX_EMIF16_IMCR_AT_MASK_CLR_BITMASK 0x1 +#define C66XX_EMIF16_IMCR_AT_MASK_CLR_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ Timer definitions ============================================== +//============================================================================= + +// Emulation Management and Clock Speed register - r-only +#define C66XX_TIMER_EMUMGT_CLKSPD_RG_OFFSET 0x0004 +// Counter register low register - r/w +#define C66XX_TIMER_CNTLO_RG_OFFSET 0x0010 +// Counter register high register - r/w +#define C66XX_TIMER_CNTHI_RG_OFFSET 0x0014 +// Period register low register - r/w +#define C66XX_TIMER_PRDLO_RG_OFFSET 0x0018 +// Period register high register - r/w +#define C66XX_TIMER_PRDHI_RG_OFFSET 0x001c +// Timer control register - r/w +#define C66XX_TIMER_TCR_RG_OFFSET 0x0020 +// Timer global control register - r/w +#define C66XX_TIMER_TGCR_RG_OFFSET 0x0024 +// Watchdog timer control register - r/w +#define C66XX_TIMER_WDTCR_RG_OFFSET 0x0028 +// Timer Reload register low register - r/w +#define C66XX_TIMER_RELLO_RG_OFFSET 0x0034 +// Timer Reload register high register - r/w +#define C66XX_TIMER_RELHI_RG_OFFSET 0x0038 +// Timer Capture register low register - r/w +#define C66XX_TIMER_CAPLO_RG_OFFSET 0x003c +// Timer Capture register high register - r/w +#define C66XX_TIMER_CAPHI_RG_OFFSET 0x0040 +// Timer interrupt control and status register - r/w +#define C66XX_TIMER_INTCTLSTAT_RG_OFFSET 0x0044 + +// Timer 0-15 registers area offset addresses +#define C66XX_TIMER_RG_AREA_OFFSET 0x00010000 +// Timer 0-15 registers addresses: timer = 0-15 +#define C66XX_TIMER_EMUMGT_CLKSPD_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_EMUMGT_CLKSPD_RG_OFFSET) +#define C66XX_TIMER_CNTLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CNTLO_RG_OFFSET) +#define C66XX_TIMER_CNTHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CNTHI_RG_OFFSET) +#define C66XX_TIMER_PRDLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_PRDLO_RG_OFFSET) +#define C66XX_TIMER_PRDHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_PRDHI_RG_OFFSET) +#define C66XX_TIMER_TCR_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_TCR_RG_OFFSET) +#define C66XX_TIMER_TGCR_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_TGCR_RG_OFFSET) +#define C66XX_TIMER_WDTCR_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_WDTCR_RG_OFFSET) +#define C66XX_TIMER_RELLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_RELLO_RG_OFFSET) +#define C66XX_TIMER_RELHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_RELHI_RG_OFFSET) +#define C66XX_TIMER_CAPLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CAPLO_RG_OFFSET) +#define C66XX_TIMER_CAPHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CAPHI_RG_OFFSET) +#define C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_INTCTLSTAT_RG_OFFSET) + + +//------------ Emulation Management and Clock Speed register defs ------------- +#define C66XX_TIMER_EMUMGT_CLKSPD_CLKDIV_BITMASK 0x000f0000 +#define C66XX_TIMER_EMUMGT_CLKSPD_CLKDIV_BITSHIFT 16 + + +//------------ Timer control register defs ------------------------------------ +#define C66XX_TIMER_TCR_READRSTMODE_HI_BITMASK 0x04000000 +#define C66XX_TIMER_TCR_READRSTMODE_HI_BITSHIFT 26 +#define C66XX_TIMER_TCR_ENAMODE_HI_BITMASK 0x00c00000 +#define C66XX_TIMER_TCR_ENAMODE_HI_BITSHIFT 22 +#define C66XX_TIMER_TCR_PWID_HI_BITMASK 0x00300000 +#define C66XX_TIMER_TCR_PWID_HI_BITSHIFT 20 +#define C66XX_TIMER_TCR_CP_HI_BITMASK 0x00080000 +#define C66XX_TIMER_TCR_CP_HI_BITSHIFT 19 +#define C66XX_TIMER_TCR_INVOUTP_HI_BITMASK 0x00020000 +#define C66XX_TIMER_TCR_INVOUTP_HI_BITSHIFT 17 +#define C66XX_TIMER_TCR_TSTAT_HI_BITMASK 0x00010000 +#define C66XX_TIMER_TCR_TSTAT_HI_BITSHIFT 16 +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_BITMASK 0x00003000 +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_BITSHIFT 12 +#define C66XX_TIMER_TCR_CAPMODE_LO_BITMASK 0x00000800 +#define C66XX_TIMER_TCR_CAPMODE_LO_BITSHIFT 11 +#define C66XX_TIMER_TCR_READRSTMODE_LO_BITMASK 0x00000400 +#define C66XX_TIMER_TCR_READRSTMODE_LO_BITSHIFT 10 +#define C66XX_TIMER_TCR_TIEN_LO_BITMASK 0x00000200 +#define C66XX_TIMER_TCR_TIEN_LO_BITSHIFT 9 +#define C66XX_TIMER_TCR_CLKSRC_LO_BITMASK 0x00000100 +#define C66XX_TIMER_TCR_CLKSRC_LO_BITSHIFT 8 +#define C66XX_TIMER_TCR_ENAMODE_LO_BITMASK 0x000000c0 +#define C66XX_TIMER_TCR_ENAMODE_LO_BITSHIFT 6 +#define C66XX_TIMER_TCR_PWID_LO_BITMASK 0x00000030 +#define C66XX_TIMER_TCR_PWID_LO_BITSHIFT 4 +#define C66XX_TIMER_TCR_CP_LO_BITMASK 0x00000008 +#define C66XX_TIMER_TCR_CP_LO_BITSHIFT 3 +#define C66XX_TIMER_TCR_INVINP_LO_BITMASK 0x00000004 +#define C66XX_TIMER_TCR_INVINP_LO_BITSHIFT 2 +#define C66XX_TIMER_TCR_INVOUTP_LO_BITMASK 0x00000002 +#define C66XX_TIMER_TCR_INVOUTP_LO_BITSHIFT 1 +#define C66XX_TIMER_TCR_TSTAT_LO_BITMASK 0x00000001 +#define C66XX_TIMER_TCR_TSTAT_LO_BITSHIFT 0 + +#define C66XX_TIMER_TCR_ENAMODE_DISABLED 0 +#define C66XX_TIMER_TCR_ENAMODE_ONE_SHOT 1 +#define C66XX_TIMER_TCR_ENAMODE_CONT 2 +#define C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD 3 + +#define C66XX_TIMER_TCR_PWID_1_CLK 0 +#define C66XX_TIMER_TCR_PWID_2_CLK 1 +#define C66XX_TIMER_TCR_PWID_3_CLK 2 +#define C66XX_TIMER_TCR_PWID_4_CLK 3 + +#define C66XX_TIMER_TCR_CAPEVTMODE_RISING_EDGE 0 +#define C66XX_TIMER_TCR_CAPEVTMODE_FALLING_EDGE 1 +#define C66XX_TIMER_TCR_CAPEVTMODE_ANY_EDGE 2 + + +//------------ Timer global control register defs ----------------------------- +#define C66XX_TIMER_TGCR_TDDRHI_BITMASK 0x0000f000 +#define C66XX_TIMER_TGCR_TDDRHI_BITSHIFT 12 +#define C66XX_TIMER_TGCR_PSCHI_BITMASK 0x00000f00 +#define C66XX_TIMER_TGCR_PSCHI_BITSHIFT 8 +#define C66XX_TIMER_TGCR_PLUSEN_BITMASK 0x00000010 +#define C66XX_TIMER_TGCR_PLUSEN_BITSHIFT 4 +#define C66XX_TIMER_TGCR_TIMMODE_BITMASK 0x0000000c +#define C66XX_TIMER_TGCR_TIMMODE_BITSHIFT 2 +#define C66XX_TIMER_TGCR_TIMHIRS_BITMASK 0x00000002 +#define C66XX_TIMER_TGCR_TIMHIRS_BITSHIFT 1 +#define C66XX_TIMER_TGCR_TIMLORS_BITMASK 0x00000001 +#define C66XX_TIMER_TGCR_TIMLORS_BITSHIFT 0 + +#define C66XX_TIMER_TGCR_TIMMODE_64BIT_GPT 0 +#define C66XX_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED 1 +#define C66XX_TIMER_TGCR_TIMMODE_64BIT_WDT 2 +#define C66XX_TIMER_TGCR_TIMMODE_32BIT_CHAINED 3 + + +//------------ Watchdog Timer Control Register defs --------------------------- +#define C66XX_TIMER_WDTCR_WDKEY_BITMASK 0xffff0000 +#define C66XX_TIMER_WDTCR_WDKEY_BITSHIFT 16 +#define C66XX_TIMER_WDTCR_WDFLAG_BITMASK 0x00008000 +#define C66XX_TIMER_WDTCR_WDFLAG_BITSHIFT 15 +#define C66XX_TIMER_WDTCR_WDEN_BITMASK 0x00004000 +#define C66XX_TIMER_WDTCR_WDEN_BITSHIFT 14 + +#define C66XX_TIMER_WDTCR_WDKEY_FIRST_KEY 0xa5c6 +#define C66XX_TIMER_WDTCR_WDKEY_SECOND_KEY 0xda7e + + +//------------ Timer interrupt control and status register defs --------------- +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_HI_BITMASK 0x00080000 +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_HI_BITSHIFT 19 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_HI_BITMASK 0x00040000 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_HI_BITSHIFT 18 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_HI_BITMASK 0x00020000 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_HI_BITSHIFT 17 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_HI_BITMASK 0x00010000 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_HI_BITSHIFT 16 +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_LO_BITMASK 0x00000008 +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_LO_BITSHIFT 3 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_LO_BITMASK 0x00000004 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_LO_BITSHIFT 2 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_LO_BITMASK 0x00000002 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_LO_BITSHIFT 1 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_LO_BITMASK 0x00000001 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_LO_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +#endif /* __C66XX_DEF_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx b/ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx new file mode 100644 index 00000000..8564e44d --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx @@ -0,0 +1,1693 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + (C) MicroLAB Systems, 2014-2015 + + File: C66xx DSP SDK API functions declarations + ----- + + Notes: + ------ + 1. This C-header file contains C66xx DSP SDK API functions declarations + and is used with C66XX.h C-header file. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file C66XX_FUNCTIONS.hxx + * + * @brief SDK API functions declarations + * + * This file contains C66xx DSP SDK API functions declarations + * + */ + + +#ifndef __C66XX_FUNCTIONS_HXX__ // check for this file has been already included +#define __C66XX_FUNCTIONS_HXX__ 1 + + + +//============================================================================= +//============ Returned error codes =========================================== +//============================================================================= +/** @addtogroup C66XX_ERRORS DSP SDK API returned error codes + * @{ + */ +#define C66XX_OK 0 /**< No errors */ +#define C66XX_PARAM_ERR -1 /**< Invalid function parameter */ +#define C66XX_INVALID_HW_ERR -2 /**< Invalid H/W error (invalid board, etc.) */ +#define C66XX_HW_ERR -3 /**< H/W error (error writing to the DSP control registers, etc) */ +#define C66XX_I2C_ERR -10 /**< I2C module is not correctly operated */ +#define C66XX_I2C_AL_ERR -11 /**< I2C module arbitration lost error */ +#define C66XX_I2C_RSFULL_ERR -12 /**< I2C module overrun error */ +#define C66XX_I2C_XSMT_ERR -13 /**< I2C module underflow error */ +#define C66XX_I2C_NACK_ERR -14 /**< I2C module no-acknowledgement error */ +#define C66XX_I2C_ARDY_ERR -15 /**< I2C module register-access-ready error */ +#define C66XX_I2C_READ_ERR -16 /**< I2C module read error */ +#define C66XX_I2C_WRITE_ERR -17 /**< I2C module write error */ +#define C66XX_I2C_TIMEOUT_ERR -18 /**< I2C bus timeout error */ +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ SDK API functions ID defs ====================================== +//============================================================================= +/** @addtogroup C66XX_FUNCTIONS_ID SDK API functions ID defs + * @{ + */ + +enum +{ + C66XX_GET_ERROR_MESSAGE_FUNCTION_ID = 0, + C66XX_GET_FUNCTION_NAME_FUNCTION_ID, + C66XX_SYS_SET_CORE_RESET_STATE_FUNCTION_ID, + C66XX_SYS_GET_CORE_RESET_STATE_FUNCTION_ID, + C66XX_SYS_GET_CORE_RESET_SOURCE_FUNCTION_ID, + C66XX_SYS_SET_CORE_BOOT_ADDRESS_FUNCTION_ID, + C66XX_SYS_INIT_MAIN_PLL_FUNCTION_ID, + C66XX_SYS_GET_MAIN_PLL_SETTINGS_FUNCTION_ID, + C66XX_SYS_INIT_DDR3_PLL_FUNCTION_ID, + C66XX_SYS_GET_DDR3_PLL_SETTINGS_FUNCTION_ID, + C66XX_SYS_INIT_PASS_PLL_FUNCTION_ID, + C66XX_SYS_GET_PASS_PLL_SETTINGS_FUNCTION_ID, + C66XX_SYS_ENABLE_POWER_DOMAIN_FUNCTION_ID, + C66XX_MEM_INIT_XMC_MPAX_SEGMENT_FUNCTION_ID, + C66XX_MEM_INIT_DDR3_FUNCTION_ID, + C66XX_INT_INIT_CORE_FUNCTION_ID, + C66XX_INT_MAP_CORE_EVENT_HANDLER_FUNCTION_ID, + C66XX_INT_UNMAP_CORE_EVENT_HANDLER_FUNCTION_ID, + C66XX_INT_INIT_CHIP_FUNCTION_ID, + C66XX_GPIO_INIT_FUNCTION_ID, + C66XX_TIMER_INIT_FUNCTION_ID, + C66XX_TIMER_START_FUNCTION_ID, + C66XX_TIMER_STOP_FUNCTION_ID, + C66XX_TIMER_RESET_FUNCTION_ID, + C66XX_TIMER_ENABLE_INTERRUPTS_FUNCTION_ID, + C66XX_TIMER_DISABLE_INTERRUPTS_FUNCTION_ID, + C66XX_UART_INIT_FUNCTION_ID, + C66XX_I2C_INIT_FUNCTION_ID, + C66XX_I2C_WRITE_DATA_FUNCTION_ID, + C66XX_I2C_READ_DATA_FUNCTION_ID, + C66XX_GBE_INIT_SERDES_FUNCTION_ID, + C66XX_GBE_INIT_SGMII_FUNCTION_ID, + C66XX_SRIO_INIT_FUNCTION_ID, + C66XX_SRIO_MAP_TX_QUEUE_FUNCTION_ID, + C66XX_SRIO_ROUTE_DOORBELL_INTERRUPT_FUNCTION_ID, + C66XX_NUMBER_OF_FUNCTIONS +}; +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +extern "C" { +#endif + + +//============================================================================= +//============ General SDK API functions declarations ========================= +//============================================================================= + +/** @addtogroup C66XX_GENERAL_FUNCTIONS General DSP SDK API functions + * @{ + */ + +/*------------ C66XX_get_last_error() function ---------------------------*//** + * @brief Function returns error code of last executed API function + * + * @return Error code of last executed API function + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_last_error(void); + + +/*------------ C66XX_get_error_flag() function ---------------------------*//** + * @brief Function returns status of ERROR_FLAG for API functions + * + * ERROR_FLAG is set by each API function in case error has been detected. + * ERROR_FLAG can be reset by C66XX_clear_error_flag() API function + * + * @param[out] error_code - pointer to a variable to receive the error code in + * case error has been detected. In case pointer is NULL, then + * no error code is returned; + * @param[out] error_function_id - pointer to a variable to receive ID of the + * first API function, which has returned with error. In case + * pointer is NULL, then no function ID is returned; + * + * @return Status of ERROR_FLAG: ON or OFF + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_error_flag(int32_t *error_code, int32_t *error_function_id); + + +/*------------ C66XX_clear_error_flag() function -------------------------*//** + * @brief Function clear ERROR_FLAG for API functions + * + * @return Always OK + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_clear_error_flag(void); + + +/*------------ C66XX_get_error_message() function ------------------------*//** + * @brief Function returns the text interpretation of the error code. + * + * @param[in] error - error code to be interpreted; + * @param[out] error_message - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_error_message(int32_t error, char *error_message); + + +/*------------ C66XX_get_function_name() function ------------------------*//** + * @brief Function returns the text interpretation of API function. + * + * @param[in] function_id - ID of the API function to be interpreted; + * @param[out] function_name - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_function_name(int32_t function_id, char *function_name); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ System functions =============================================== +//============================================================================= + +/** @addtogroup C66XX_SYS System functions + * @{ + */ + + +/** DSP core reset source is global reset */ +#define C66XX_DSP_CORE_RESET_SRC_IS_GLOBAL_RESET 1 +/** DSP core reset source is local reset */ +#define C66XX_DSP_CORE_RESET_SRC_IS_LOCAL_RESET 2 + + +/** Main PLL Multiplier bitmask */ +#define C66XX_MAIN_PLL_PLLM_BITMASK 0x1fff +/** Main PLL Divider bitmask */ +#define C66XX_MAIN_PLL_PLLD_BITMASK 0x3f +/** Number of PLL dividers */ +#define C66XX_MAIN_PLL_PLLDIV_COUNT 16 + +/** Main PLL divider data descriptor */ +typedef struct +{ + uint32_t enable; /**< PLL divider enable flag */ + uint32_t ratio; /**< PLL divider value (8-bit) */ +} C66XX_MAIN_PLL_PLLDIV_DD; + +// Main PLL divider data descriptor length in bytes +#define C66XX_MAIN_PLL_PLLDIV_DD_LEN sizeof(C66XX_MAIN_PLL_PLLDIV_DD) + + +/** Main PLL data descriptor (contains parameters which are used to init PLL) */ +typedef struct +{ + uint32_t bypass; /**< PLL mode: bypass or not */ + uint32_t pllm; /**< PLL multiplier value (13-bit) */ + uint32_t plld; /**< PLL divider value (6-bit) */ + uint32_t output_divide; /**< PLL output divider value (4-bit) */ + C66XX_MAIN_PLL_PLLDIV_DD plldiv[C66XX_MAIN_PLL_PLLDIV_COUNT]; /**< PLL dividers */ +} C66XX_MAIN_PLL_DD; + +// Main PLL data descriptor length in bytes +#define C66XX_MAIN_PLL_DD_LEN sizeof(C66XX_MAIN_PLL_DD) + + +/** DDR3 PLL data descriptor (contains parameters which are used to init DDR3 PLL) */ +typedef struct +{ + uint32_t pllm; /**< PLL multiplier value (13-bit) */ + uint32_t plld; /**< PLL divider value (6-bit) */ +} C66XX_DDR3_PLL_DD; + +// DDR3 PLL data descriptor length in bytes +#define C66XX_DDR3_PLL_DD_LEN sizeof(C66XX_DDR3_PLL_DD) + + +/** PASS PLL data descriptor (contains parameters which are used to init PASS PLL) */ +typedef struct +{ + uint32_t pllm; /**< PLL multiplier value (13-bit) */ + uint32_t plld; /**< PLL divider value (6-bit) */ +} C66XX_PASS_PLL_DD; + +// PASS PLL data descriptor length in bytes +#define C66XX_PASS_PLL_DD_LEN sizeof(C66XX_PASS_PLL_DD) + + +/*------------ C66XX_SYS_get_core_number() function ----------------------*//** + * @brief Function returns DSP core number at which the program is running + * + * @return DSP core number + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_SYS_get_core_number(void); + + +/*------------ C66XX_SYS_get_max_core_freq() function --------------------*//** + * @brief Function returns DSP core max speed in MHz + * + * @return DSP core max speed in MHz + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_SYS_get_max_core_freq(void); + + +/*------------ C66XX_SYS_set_core_reset_state() function -----------------*//** + * @brief Function sets or releases DSP core local reset + * + * @param[in] core - DSP core number to set or release from local reset + * @param[in] state - DSP core local reset state: ON or OFF + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_set_core_reset_state(uint32_t core, uint32_t state); + + +/*------------ C66XX_SYS_get_core_reset_state() function -----------------*//** + * @brief Function returns DSP core local reset state + * + * @param[in] core - DSP core number to return local reset state + * @param[out] state - pointer to a variable to receive DSP core local reset + * state: ON or OFF + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_core_reset_state(uint32_t core, uint32_t *state); + + +/*------------ C66XX_SYS_get_core_reset_source() function ----------------*//** + * @brief Function returns DSP core reset source: global or local + * + * @param[in] core - DSP core number to return reset source + * @param[out] state - pointer to a variable to receive DSP core reset source: + * global or local + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_core_reset_source(uint32_t core, uint32_t *source); + + +/*------------ C66XX_SYS_set_core_boot_address() function ----------------*//** + * @brief Function sets DSP core boot address. After releasing DSP core from + * reset it will start execution from this memory address. + * Note that DSP core boot address should be 1024 bytes aligned + * + * @param[in] core - DSP core number to set boot address + * @param[in] addr - DSP core boot address: should be 1024 bytes aligned + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_set_core_boot_address(uint32_t core, uint32_t addr); + + +/*------------ C66XX_SYS_init_main_pll() function ------------------------*//** + * @brief Function inits DSP Main PLL according to supplied parameters + * + * @param[in] pll_dd - Main PLL data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_init_main_pll(C66XX_MAIN_PLL_DD *pll_dd); + + +/*------------ C66XX_SYS_get_main_pll_settings() function ----------------*//** + * @brief Function returns DSP Main PLL settings + * + * @param[out] pll_dd - Pointer to a main PLL data descriptor to receive data + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_main_pll_settings(C66XX_MAIN_PLL_DD *pll_dd); + + +/*------------ C66XX_SYS_init_ddr3_pll() function ------------------------*//** + * @brief Function inits DSP DDR3 PLL according to supplied parameters + * + * @param[in] ddr3_pll_dd - DDR3 PLL data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_init_ddr3_pll(C66XX_DDR3_PLL_DD *ddr3_pll_dd); + + +/*------------ C66XX_SYS_get_ddr3_pll_settings() function ----------------*//** + * @brief Function returns DSP DDR3 PLL settings + * + * @param[out] ddr3_pll_dd - Pointer to DDR3 PLL data descriptor to receive +* data + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_ddr3_pll_settings(C66XX_DDR3_PLL_DD *ddr3_pll_dd); + + +/*------------ C66XX_SYS_init_pass_pll() function ------------------------*//** + * @brief Function inits DSP PASS PLL according to supplied parameters + * + * @param[in] pass_pll_dd - PASS PLL data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_init_pass_pll(C66XX_PASS_PLL_DD *pass_pll_dd); + + +/*------------ C66XX_SYS_get_pass_pll_settings() function ----------------*//** + * @brief Function returns DSP PASS PLL settings + * + * @param[out] pass_pll_dd - Pointer to PASS PLL data descriptor to receive +* data + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_pass_pll_settings(C66XX_PASS_PLL_DD *pass_pll_dd); + + +/*------------ C66XX_SYS_enable_power_domain() function ------------------*//** + * @brief Function powers up selected power domain + * + * @param[in] domain - power domain number to enable + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_enable_power_domain(uint32_t domain); + + +/** @}*/ +//============================================================================= + + +//============================================================================= +//============ DSP memory controller functions ================================ +//============================================================================= + +/** @addtogroup C66XX_MEM DSP memory controller functions + * @{ + */ + + +/** DSP L1 (P or D) cache sizes */ +#define C66XX_CACHE_L1_0KB CACHE_L1_0KCACHE +#define C66XX_CACHE_L1_4KB CACHE_L1_4KCACHE +#define C66XX_CACHE_L1_8KB CACHE_L1_8KCACHE +#define C66XX_CACHE_L1_16KB CACHE_L1_16KCACHE +#define C66XX_CACHE_L1_32KB CACHE_L1_32KCACHE +#define C66XX_CACHE_L1_MAX_SIZE CACHE_L1_MAXIM3 + + +/** DSP L2 cache sizes */ +#define C66XX_CACHE_L2_0KB CACHE_0KCACHE +#define C66XX_CACHE_L2_32KB CACHE_32KCACHE +#define C66XX_CACHE_L2_64KB CACHE_64KCACHE +#define C66XX_CACHE_L2_128KB CACHE_128KCACHE +#define C66XX_CACHE_L2_256KB CACHE_256KCACHE +#define C66XX_CACHE_L2_512KB CACHE_512KCACHE +#define C66XX_CACHE_L2_MAX_SIZE C66XX_CACHE_L2_512KB + + +/** DDR3 controller initialization data descriptor (contains parameters which are used to init DDR3 controller) */ +typedef struct +{ + EMIF4F_TIMING1_CONFIG timing1_config; /**< DDR3 controller Timing 1 configuration */ + EMIF4F_TIMING2_CONFIG timing2_config; /**< DDR3 controller Timing 2 configuration */ + EMIF4F_TIMING3_CONFIG timing3_config; /**< DDR3 controller Timing 3 configuration */ + EMIF4F_SDRAM_CONFIG sdram_config; /**< DDR3 controller SDRAM configuration */ +} C66XX_DDR3_EMIF_DD; + +// DDR3 controller initialization data descriptor length in bytes +#define C66XX_DDR3_EMIF_DD_LEN sizeof(C66XX_DDR3_EMIF_DD) + + +/** DDR3 controller physical interface (PHY) data descriptor (contains parameters which are used to perform leveling) */ +// All these values should be obtained from DDR3 PHY Calc spreadsheet (sprabl2) provided by TI +typedef struct +{ + uint32_t data0_wrlvl_init_ratio; /**< DDR3 byte lane 7 write leveling initialization ratio */ + uint32_t data1_wrlvl_init_ratio; /**< DDR3 byte lane 6 write leveling initialization ratio */ + uint32_t data2_wrlvl_init_ratio; /**< DDR3 byte lane 5 write leveling initialization ratio */ + uint32_t data3_wrlvl_init_ratio; /**< DDR3 byte lane 4 write leveling initialization ratio */ + uint32_t data4_wrlvl_init_ratio; /**< DDR3 byte lane 3 write leveling initialization ratio */ + uint32_t data5_wrlvl_init_ratio; /**< DDR3 byte lane 2 write leveling initialization ratio */ + uint32_t data6_wrlvl_init_ratio; /**< DDR3 byte lane 1 write leveling initialization ratio */ + uint32_t data7_wrlvl_init_ratio; /**< DDR3 byte lane 0 write leveling initialization ratio */ + uint32_t data8_wrlvl_init_ratio; /**< DDR3 ECC byte lane write leveling initialization ratio */ + uint32_t data0_gatelvl_init_ratio; /**< DDR3 byte lane 7 gate leveling initialization ratio */ + uint32_t data1_gatelvl_init_ratio; /**< DDR3 byte lane 6 gate leveling initialization ratio */ + uint32_t data2_gatelvl_init_ratio; /**< DDR3 byte lane 5 gate leveling initialization ratio */ + uint32_t data3_gatelvl_init_ratio; /**< DDR3 byte lane 4 gate leveling initialization ratio */ + uint32_t data4_gatelvl_init_ratio; /**< DDR3 byte lane 3 gate leveling initialization ratio */ + uint32_t data5_gatelvl_init_ratio; /**< DDR3 byte lane 2 gate leveling initialization ratio */ + uint32_t data6_gatelvl_init_ratio; /**< DDR3 byte lane 1 gate leveling initialization ratio */ + uint32_t data7_gatelvl_init_ratio; /**< DDR3 byte lane 0 gate leveling initialization ratio */ + uint32_t data8_gatelvl_init_ratio; /**< DDR3 ECC byte lane gate leveling initialization ratio */ + uint32_t ddr3_config_reg_12_bitmask; /**< DDR3 configuration 12 register bitmask for INVERT_CLK_OUT field */ +} C66XX_DDR3_PHY_DD; + +// DDR3 controller initialization data descriptor length in bytes +#define C66XX_DDR3_PHY_DD_LEN sizeof(C66XX_DDR3_PHY_DD) + + +/*------------ C66XX_MEM_set_L1P_cache_size() function -------------------*//** + * @brief Function sets DSP L1P cache to the new size + * + * @param[in] new_size - new size of DSP L1P cache + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_MEM_set_L1P_cache_size(uint32_t new_size); + + +/*------------ C66XX_MEM_get_L1P_cache_size() function -------------------*//** + * @brief Function returns DSP L1P cache size + * + * @return DSP L1P cache size + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_L1P_cache_size() CACHE_getL1PSize() + + +/*------------ C66XX_MEM_set_L1D_cache_size() function -------------------*//** + * @brief Function sets DSP L1D cache to the new size + * + * @param[in] new_size - new size of DSP L1D cache + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_MEM_set_L1D_cache_size(uint32_t new_size); + + +/*------------ C66XX_MEM_get_L1D_cache_size() function -------------------*//** + * @brief Function returns DSP L1D cache size + * + * @return DSP L1D cache size + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_L1D_cache_size() CACHE_getL1DSize() + + +/*------------ C66XX_MEM_set_L2_cache_size() function --------------------*//** + * @brief Function sets DSP L2 cache to the new size + * + * @param[in] new_size - new size of DSP L2 cache + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_MEM_set_L2_cache_size(uint32_t new_size); + + +/*------------ C66XX_MEM_get_L2_cache_size() function --------------------*//** + * @brief Function returns DSP L2 cache size + * + * @return DSP L2 cache size + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_L2_cache_size() CACHE_getL2Size() + + +/*------------ C66XX_MEM_set_memory_region_cache_config() function -------*//** + * @brief Function enables or disables DSP caching for specified memory region + * + * @param[in] mar - MAR register number from 0 to 255 (note that the first 12 + * memory regions are read-only) + * @param[in] cacheable - cache mode to set: ON - enable caching, + * OFF - disable caching + * @param[in] prefetchable - DSP XMC controller prefetch mode to set: + * ON - enable prefetch support, OFF - disable prefetch support + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_set_memory_region_cache_config(mar, cacheable, prefetchable) CACHE_setMemRegionInfo(mar, cacheable, prefetchable) + + +/*------------ C66XX_MEM_get_memory_region_cache_config() function -------*//** + * @brief Function returns DSP cache configuration for specified memory region + * + * @param[in] mar - MAR register number from 0 to 255 (note that the first 12 + * memory regions are read-only) + * @param[in] cacheable - pointer to a variable to receive current cache mode: + * ON - caching is enabled, OFF - caching is disabled + * @param[in] prefetchable - pointer to a variable to receive current DSP XMC + * controller prefetch mode: ON - prefetch support is enabled, + * OFF - prefetch support is disabled + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_memory_region_cache_config(mar, cacheable, prefetchable) CACHE_getMemRegionInfo(mar, cacheable, prefetchable) + + +/*------------ C66XX_MEM_init_xmc_mpax_segment() function ----------------*//** + * @brief Function configures XMC MPAX segment according to supplied + * parameters + * + * @param[in] index - MPAX segment index from 0 to 15 (note that the first 2 + * segments are already configured by default) + * @param[in] baddr - upper 20 bit of base 32-bit address to remap + * @param[in] size - encoded segment size + * @param[in] raddr - upper 24 bit of replacement 36-bit address + * @param[in] perm - access types allowed in this segment + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_MEM_init_xmc_mpax_segment(uint32_t index, uint32_t baddr, uint32_t size, uint32_t raddr, uint32_t perm); + + +/*------------ C66XX_MEM_convert_local_to_global_address() function ------*//** + * @brief Function converts local DSP core address to global address + * + * @param[in] addr - local DSP core address to be converted + * + * @return Global address + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_MEM_convert_local_to_global_address(uint32_t addr); + + +/*------------ C66XX_MEM_init_ddr3() function --------------------------------*//** + * @brief Function inits DDR3 controller according to supplied parameters + * + * @param[in] ddr3_emif_dd - DDR3 controller initialization data descriptor + * @param[in] ddr3_phy_dd - DDR3 PHY controller initialization data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_MEM_init_ddr3(C66XX_DDR3_EMIF_DD *ddr3_emif_dd, C66XX_DDR3_PHY_DD *ddr3_phy_dd); + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Timer TSC functions ============================================ +//============================================================================= + +/** @addtogroup C66XX_TSC DSP 64-bit Time Stamp Counter (TSC) functions + * @{ + */ + +/*------------ C66XX_TSC_get_current_value() function --------------------*//** + * @brief Function returns DSP TSC current value + * + * @return 64-bit Time Stamp Counter value + * +-----------------------------------------------------------------------------*/ +uint64_t C66XX_TSC_get_current_value(void); + + +/*------------ C66XX_TSC_get_duration_s() function -----------------------*//** + * @brief Function returns time duration in seconds from Time Stamp Counter + * start value + * + * @param[in] start - 64-bit Time Stamp Counter value + * + * @return Time duration in seconds + * +-----------------------------------------------------------------------------*/ +double C66XX_TSC_get_duration_s(uint64_t start); + + +/*------------ C66XX_TSC_set_delay_us() function -------------------------*//** + * @brief Function is used to delay the execution for selected number of + * microseconds + * + * @param[in] us - Number of microseconds to delay + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_TSC_set_delay_us(uint32_t us); + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ C66xx interrupt controller functions =========================== +//============================================================================= + +/** @addtogroup C66XX_INT C66xx interrupt controller functions + * @{ + */ + + +/** DSP interrupt vector IDs */ +#define C66XX_DSP_VECTID_NMI CSL_INTC_VECTID_NMI +#define C66XX_DSP_VECTID_4 CSL_INTC_VECTID_4 +#define C66XX_DSP_VECTID_5 CSL_INTC_VECTID_5 +#define C66XX_DSP_VECTID_6 CSL_INTC_VECTID_6 +#define C66XX_DSP_VECTID_7 CSL_INTC_VECTID_7 +#define C66XX_DSP_VECTID_8 CSL_INTC_VECTID_8 +#define C66XX_DSP_VECTID_9 CSL_INTC_VECTID_9 +#define C66XX_DSP_VECTID_10 CSL_INTC_VECTID_10 +#define C66XX_DSP_VECTID_11 CSL_INTC_VECTID_11 +#define C66XX_DSP_VECTID_12 CSL_INTC_VECTID_12 +#define C66XX_DSP_VECTID_13 CSL_INTC_VECTID_13 +#define C66XX_DSP_VECTID_14 CSL_INTC_VECTID_14 +#define C66XX_DSP_VECTID_15 CSL_INTC_VECTID_15 +#define C66XX_DSP_VECTID_COMBINE CSL_INTC_VECTID_COMBINE +#define C66XX_DSP_VECTID_EXCEP CSL_INTC_VECTID_EXCEP + + +/*------------ C66XX_INT_init_core() function ----------------------------*//** + * @brief Function initializes C66x CorePac interrupt controller (INTC) using + * CSL library. + * + * If SYS/BIOS RTOS is used, then it's recommended to use the relevant + * SYS/BIOS interrupt API (HWI, EventCombiner and CpIntc), as there will be + * conflicts since both CSL and SYS/BIOS will use their own Interrupt Service + * Table Pointer (ISTP). + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_init_core(void); + + +/*------------ C66XX_INT_map_core_event_handler() function ---------------*//** + * @brief Function maps DSP interrupt vector to INTC input event ID, plugs + * the specified function as DSP interrupt handler function, and enables DSP + * interrupt + * + * @param[in] dsp_vector_id - DSP interrupt vector + * @param[in] input_event_id - INTC input event ID + * @param[in] handler - pointer to DSP interrupt handler function + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_map_core_event_handler(uint32_t dsp_vector_id, uint32_t input_event_id, CSL_IntcEventHandler handler); + + +/*------------ C66XX_INT_unmap_core_event_handler() function -------------*//** + * @brief Function unmaps DSP interrupt vector and disables the corresponding + * DSP interrupt. + * + * @param[in] dsp_vector_id - DSP interrupt vector + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_unmap_core_event_handler(uint32_t dsp_vector_id); + + +/*------------ C66XX_INT_set_core_dsp_interrupt_handler() function -------*//** + * @brief Function sets the specified function as a direct handler for DSP + * interrupt vector ID. + * + * This handler function will be branched to from DSP interrupt vector table + * for specified DSP interrupt vector ID, so either it should be declared in C + * with "interrupt" keyword or manually save and restore interrupt context and + * return with "B IRP" assembler instruction. + * The specified DSP interrupt will be enabled too. + * + * @param[in] dsp_vector_id - DSP interrupt vector + * @param[in] isr_handler - direct handler function for DSP interrupt vector + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_set_core_dsp_interrupt_handler(uint32_t dsp_vector_id, void *isr_handler); + + +/** Chip interrupt controllers defs */ +#define C66XX_CPINTC_ID_0 0 +#define C66XX_CPINTC_ID_1 1 +#define C66XX_CPINTC_ID_2 2 +#define C66XX_CPINTC_ID_3 3 + + +/*------------ C66XX_INT_init_chip() function ----------------------------*//** + * @brief Function initializes the specified chip interrupt controller + * (CPINTC or CIC) and returns a handle which should be used in all subsequent + * CPINTC function calls. + * + * @param[in] cpintc_id - chip interrupt controller number to initialize (0-3) + * + * @return Handle to the CPINTC instance: >0 - OK, + * 0 - error is occurred + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_INT_init_chip(uint32_t cpintc_id); + + +/*------------ C66XX_INT_map_chip_system_to_host_event() function --------*//** + * @brief Function maps chip-level event (system event) to CPINTC output event + * (host event) end enables it. + * + * System events are those events generated by a hardware module in the system. + * These events are inputs into CPINTC. + * Host events are the output events of CPINTC, which act as event inputs to + * C66x CorePac interrupt controllers (INTC). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] system_event_id - chip-level (system) event from a hardware + * module in the system. + * @param[in] host_event_id - CPINTC output event ID + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_map_chip_system_to_host_event(uint32_t cpintc_handle, uint32_t system_event_id, uint32_t host_event_id); + + +/*------------ C66XX_INT_enable_chip_host_event() function ---------------*//** + * @brief Function enables CPINTC output event (host event). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] host_event_id - CPINTC output event ID to enable + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +#define C66XX_INT_enable_chip_host_event(cpintc_handle, host_event_id) CSL_CPINTC_enableHostInterrupt(cpintc_handle, host_event_id) + + +/*------------ C66XX_INT_disable_chip_host_event() function --------------*//** + * @brief Function disables CPINTC output event (host event). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] host_event_id - CPINTC output event ID to disable + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +#define C66XX_INT_disable_chip_host_event(cpintc_handle, host_event_id) CSL_CPINTC_disableHostInterrupt(cpintc_handle, host_event_id) + + +/*------------ C66XX_INT_clear_chip_system_event() function --------------*//** + * @brief Function clears CPINTC input event (system event). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] sys_event_id - CPINTC input event ID to clear + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +#define C66XX_INT_clear_chip_system_event(cpintc_handle, sys_event_id) CSL_CPINTC_clearSysInterrupt(cpintc_handle, sys_event_id) + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ General purpose I/O (GPIO) functions =========================== +//============================================================================= + +/** @addtogroup C66XX_GPIO DSP GPIO functions + * @{ + */ + +/** GPIO pins number defs */ +enum C66XX_GPIO_PINS +{ + C66XX_GPIO_PIN_0 = 0, + C66XX_GPIO_PIN_1, + C66XX_GPIO_PIN_2, + C66XX_GPIO_PIN_3, + C66XX_GPIO_PIN_4, + C66XX_GPIO_PIN_5, + C66XX_GPIO_PIN_6, + C66XX_GPIO_PIN_7, + C66XX_GPIO_PIN_8, + C66XX_GPIO_PIN_9, + C66XX_GPIO_PIN_10, + C66XX_GPIO_PIN_11, + C66XX_GPIO_PIN_12, + C66XX_GPIO_PIN_13, + C66XX_GPIO_PIN_14, + C66XX_GPIO_PIN_15 +}; + +/** GPIO pins bitmask defs */ +enum C66XX_GPIO_PIN_BITMASKS +{ + C66XX_GPIO_PIN_0_BITMASK = 0x0001, + C66XX_GPIO_PIN_1_BITMASK = 0x0002, + C66XX_GPIO_PIN_2_BITMASK = 0x0004, + C66XX_GPIO_PIN_3_BITMASK = 0x0008, + C66XX_GPIO_PIN_4_BITMASK = 0x0010, + C66XX_GPIO_PIN_5_BITMASK = 0x0020, + C66XX_GPIO_PIN_6_BITMASK = 0x0040, + C66XX_GPIO_PIN_7_BITMASK = 0x0080, + C66XX_GPIO_PIN_8_BITMASK = 0x0100, + C66XX_GPIO_PIN_9_BITMASK = 0x0200, + C66XX_GPIO_PIN_10_BITMASK = 0x0400, + C66XX_GPIO_PIN_11_BITMASK = 0x0800, + C66XX_GPIO_PIN_12_BITMASK = 0x1000, + C66XX_GPIO_PIN_13_BITMASK = 0x2000, + C66XX_GPIO_PIN_14_BITMASK = 0x4000, + C66XX_GPIO_PIN_15_BITMASK = 0x8000 +}; + + +/** GPIO bank number for CSL utilities */ +#define C66XX_GPIO_BANK_NUMBER 0 +/** GPIO data definitions */ +#define C66XX_GPIO_DATA_OFF 0 +#define C66XX_GPIO_DATA_ON 1 +/** GPIO direction definitions */ +#define C66XX_GPIO_DIR_OUT 0 +#define C66XX_GPIO_DIR_IN 1 +/** GPIO pin edge defs */ +#define C66XX_GPIO_PIN_EDGE_RISING 0 +#define C66XX_GPIO_PIN_EDGE_FALLING 1 +#define C66XX_GPIO_PIN_EDGE_ANY 2 +/** GPIO pins bitmask definitions */ +#define C66XX_GPIO_DATA_BITMASK 0x0000ffff + + +/*------------ C66XX_GPIO_init() function --------------------------------*//** + * @brief Function inits the GPIO peripheral: all pins are configured as + * inputs, interrupts are disabled + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_GPIO_init(void); + + +/*------------ C66XX_GPIO_set_pin_direction() function -------------------*//** + * @brief Function configures the specified GPIO pin direction + * + * @param[in] pin_number - GPIO pin number to configure + * @param[in] direction - GPIO direction definition + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_pin_direction(uint32_t pin_number, uint32_t direction); + + +/*------------ C66XX_GPIO_get_pin_direction() function -------------------*//** + * @brief Function returns the specified GPIO pin direction + * + * @param[in] pin_number - GPIO pin number to get direction + * + * @return GPIO direction definition + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_pin_direction(uint32_t pin_number); + + +/*------------ C66XX_GPIO_set_pin_data() function ------------------------*//** + * @brief Function sets the specified GPIO pin state to data + * + * @param[in] pin_number - GPIO pin number to configure + * @param[in] data - GPIO pin state: ON or OFF + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_pin_data(uint32_t pin_number, uint32_t data); + + +/*------------ C66XX_GPIO_get_pin_data() function ------------------------*//** + * @brief Function returns the specified GPIO pin state + * + * @param[in] pin_number - GPIO pin number to get pin state + * + * @return GPIO pin state: ON or OFF + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_pin_data(uint32_t pin_number); + + +/*------------ C66XX_GPIO_set_direction() function -----------------------*//** + * @brief Function configures the specified GPIO pins direction + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to configure + * @param[in] direction - GPIO direction definition + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_direction(uint32_t pin_bitmask, uint32_t direction); + + +/*------------ C66XX_GPIO_get_direction() function -----------------------*//** + * @brief Function returns the specified GPIO pins direction + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to get pins direction + * + * @return Specified GPIO pins direction + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_direction(uint32_t pin_bitmask); + + +/*------------ C66XX_GPIO_set_data() function ----------------------------*//** + * @brief Function sets the specified GPIO pins state to data + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to configure + * @param[in] data - GPIO pins state: ON or OFF + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_data(uint32_t pin_bitmask, uint32_t data); + + +/*------------ C66XX_GPIO_get_data() function ----------------------------*//** + * @brief Function returns the specified GPIO pins state + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to get pins state + * + * @return Specified GPIO pins state + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_data(uint32_t pin_bitmask); + + +/*------------ C66XX_GPIO_enable_interrupts() function -------------------*//** + * @brief Function enables GPIO peripheral interrupts + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_enable_interrupts(void); + + +/*------------ C66XX_GPIO_disable_interrupts() function ------------------*//** + * @brief Function disables GPIO peripheral interrupts + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_disable_interrupts(void); + + +/*------------ C66XX_GPIO_enable_edge_interrupt() function ---------------*//** + * @brief Function enables the specified GPIO pin edge interrupt + * + * @param[in] pin - GPIO pin number to configure + * @param[in] edge - GPIO pin edge which triggers GPIO interrupt + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_enable_edge_interrupt(uint32_t pin, uint32_t edge); + + +/*------------ C66XX_GPIO_disable_edge_interrupt() function --------------*//** + * @brief Function disables the specified GPIO pin edge interrupt + * + * @param[in] pin - GPIO pin number to configure + * @param[in] edge - GPIO pin edge which shouldn't trigger GPIO interrupt + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_disable_edge_interrupt(uint32_t pin, uint32_t edge); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Timer module functions ========================================= +//============================================================================= + +/** @addtogroup C66XX_TIMER DSP 64-bit Timer module functions + * @{ + */ + + +/** DSP 64-bit Timer module number defs */ +typedef enum +{ + C66XX_TIMER_0 = 0, + C66XX_TIMER_1, + C66XX_TIMER_2, + C66XX_TIMER_3, + C66XX_TIMER_4, + C66XX_TIMER_5, + C66XX_TIMER_6, + C66XX_TIMER_7, + C66XX_TIMER_8, + C66XX_TIMER_9, + C66XX_TIMER_10, + C66XX_TIMER_11, + C66XX_TIMER_12, + C66XX_TIMER_13, + C66XX_TIMER_14, + C66XX_TIMER_15 +} C66XX_TIMER; + + +/** DSP 64-bit Timer mode defs */ +typedef enum +{ + C66XX_TIMER_MODE_64BIT_GPT = 0, + C66XX_TIMER_MODE_32BIT_UNCHAINED, + C66XX_TIMER_MODE_64BIT_WDT, + C66XX_TIMER_MODE_32BIT_CHAINED +} C66XX_TIMER_MODE; + + +/** DSP 64-bit Timer hardware configuration defs */ +typedef enum +{ + C66XX_TIMER_HW_CFG_64BIT = 0, + C66XX_TIMER_HW_CFG_32BIT_LOW, + C66XX_TIMER_HW_CFG_32BIT_HIGH +} C66XX_TIMER_HW_CFG; + + +/** DSP 64-bit Timer count mode defs */ +typedef enum +{ + C66XX_TIMER_COUNT_MODE_DISABLED = 0, + C66XX_TIMER_COUNT_MODE_ONE_SHOT, + C66XX_TIMER_COUNT_MODE_CONTINUOUSLY, + C66XX_TIMER_COUNT_MODE_CONTINUOUSLY_RELOAD +} C66XX_TIMER_COUNT_MODE; + + +/** DSP timer input enable defs */ +typedef enum +{ + C66XX_TIMER_CLK_INPUT_DISABLED = 0, + C66XX_TIMER_CLK_INPUT_ENABLED +} C66XX_TIMER_CLK_INPUT; + + +/** DSP timer input inverter control defs */ +typedef enum +{ + C66XX_TIMER_CLK_INPUT_INVERTER_DISABLED = 0, + C66XX_TIMER_CLK_INPUT_INVERTER_ENABLED +} C66XX_TIMER_CLK_INPUT_INVERTER; + + +/** DSP timer clock source defs */ +typedef enum +{ + C66XX_TIMER_CLK_SRC_INTERNAL = 0, + C66XX_TIMER_CLK_SRC_EXTERNAL +} C66XX_TIMER_CLK_SRC; + + +/** DSP timer clock/pulse mode for timer output defs */ +typedef enum +{ + C66XX_TIMER_CLK_OUTPUT_MODE_PULSE = 0, + C66XX_TIMER_CLK_OUTPUT_MODE_CLK +} C66XX_TIMER_CLK_OUTPUT_MODE; + + +/** DSP timer pulse width used in pulse mode for timer output defs */ +typedef enum +{ + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_1CLK = 0, + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_2CLK, + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_3CLK, + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_4CLK +} C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH; + + +/** DSP timer output inverter control defs */ +typedef enum +{ + C66XX_TIMER_CLK_OUTPUT_INVERTER_DISABLED = 0, + C66XX_TIMER_CLK_OUTPUT_INVERTER_ENABLED +} C66XX_TIMER_CLK_OUTPUT_INVERTER; + + +/** DSP 32-bit Timer configuration data descriptor */ +typedef struct +{ + C66XX_TIMER_CLK_SRC clk_src; /**< Clock source for 32-bit timer */ + C66XX_TIMER_CLK_INPUT clk_input_enabled; /**< Timer clock is gated by the timer input for 32-bit timer */ + C66XX_TIMER_CLK_INPUT_INVERTER clk_input_inverter_enabled; /**< An inverted timer input drives the 32-bit timer */ + C66XX_TIMER_CLK_OUTPUT_MODE clk_src_output_mode; /**< Clock output mode for 32-bit timer */ + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH clk_src_output_pulse_width; /**< Clock output pulse width used in pulse mode for 32-bit timer */ + C66XX_TIMER_CLK_OUTPUT_INVERTER clk_output_inverter_enabled; /**< 32-bit timer output is inverted */ +} C66XX_TIMER_32BIT_CFG_DD; + + +/** DSP 64-bit Timer module configuration data descriptor */ +typedef struct +{ + C66XX_TIMER_MODE timer_mode; /**< Timer mode: 64-bit GPT, 64-bit WDT, dual 32-bit unchained or chained */ + C66XX_TIMER_32BIT_CFG_DD timer_high; /**< Configuration data descriptor for 32-bit HIGH timer */ + C66XX_TIMER_32BIT_CFG_DD timer_low; /**< Configuration data descriptor for 32-bit LOW timer */ +} C66XX_TIMER_CFG_DD; + +// DSP 64-bit Timer module configuration data descriptor length in bytes +#define C66XX_TIMER_CFG_DD_LEN sizeof(C66XX_TIMER_CFG_DD) + + +/*------------ C66XX_TIMER_init() function -------------------------------*//** + * @brief Function configures selected DSP 64-bit timer module + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] frequency - DSP timer output frequency in Hz + * @param[in] cfg_dd - pointer to filled DSP 64-bit timer module configuration + * data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_init(C66XX_TIMER timer_number, uint32_t frequency, C66XX_TIMER_CFG_DD *cfg_dd); + + +/*------------ C66XX_TIMER_start() function ------------------------------*//** + * @brief Function starts selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_start - hardware timer to start (64BIT/32BIT_LOW/ + * 32BIT_HIGH) + * @param[in] count_mode - DSP timer counting mode (DISABLED/ONE_SHOT/ + * CONTINUOUSLY/CONTINUOUSLY_RELOAD) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_start(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_start, C66XX_TIMER_COUNT_MODE count_mode); + + +/*------------ C66XX_TIMER_stop() function -------------------------------*//** + * @brief Function stops selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_stop - hardware timer to stop (64BIT/32BIT_LOW/ + * 32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_stop(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_stop); + + +/*------------ C66XX_TIMER_reset() function ------------------------------*//** + * @brief Function resets selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_reset - hardware timer to reset (64BIT/32BIT_LOW/ + * 32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_reset(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_reset); + + +/*------------ C66XX_TIMER_enable_interrupts() function ------------------*//** + * @brief Function enables interrupts from selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_enable - hardware timer to enable interrupts from + * (64BIT/32BIT_LOW/32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_enable_interrupts(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_enable); + + +/*------------ C66XX_TIMER_disable_interrupts() function ------------------*//** + * @brief Function disables interrupts from selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_disable - hardware timer to disable interrupts from + * (64BIT/32BIT_LOW/32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_disable_interrupts(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_disable); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ UART functions ================================================= +//============================================================================= + +/** @addtogroup C66XX_UART DSP UART functions + * @{ + */ + +// UART baud rate defs (max 128 kBauds) +#define C66XX_UART_BAUD_RATE_2400 2400 /**< UART baud rate 2400 bps */ +#define C66XX_UART_BAUD_RATE_4800 4800 /**< UART baud rate 4800 bps */ +#define C66XX_UART_BAUD_RATE_9600 9600 /**< UART baud rate 9600 bps */ +#define C66XX_UART_BAUD_RATE_19200 19200 /**< UART baud rate 19200 bps */ +#define C66XX_UART_BAUD_RATE_38400 38400 /**< UART baud rate 38400 bps */ +#define C66XX_UART_BAUD_RATE_57600 57600 /**< UART baud rate 57600 bps */ +#define C66XX_UART_BAUD_RATE_115200 115200 /**< UART baud rate 115200 bps */ + +// UART data bits defs +#define C66XX_UART_DATA_BITS_5BITS 5 /**< UART 5-bits data words */ +#define C66XX_UART_DATA_BITS_6BITS 6 /**< UART 6-bits data words */ +#define C66XX_UART_DATA_BITS_7BITS 7 /**< UART 7-bits data words */ +#define C66XX_UART_DATA_BITS_8BITS 8 /**< UART 8-bits data words */ + +// UART parity parameter defs +#define C66XX_UART_PARITY_NONE 0 /**< no parity */ +#define C66XX_UART_PARITY_EVEN 1 /**< even parity */ +#define C66XX_UART_PARITY_ODD 2 /**< odd parity */ + +// UART stop bits defs +#define C66XX_UART_STOP_BITS_1BIT 0 /**< one stop bit */ +#define C66XX_UART_STOP_BITS_1_5BITS 1 /**< one and a half stop bits */ +#define C66XX_UART_STOP_BITS_2BITS 2 /**< two stop bits */ + +// UART key defs +#define C66XX_UART_KEY_BEEP 0x7 /**< BELL value in HEX */ +#define C66XX_UART_KEY_ESC 0x1b /**< ESC value in HEX */ +#define C66XX_UART_KEY_CR 0xd /**< Carriage Return value in HEX */ +#define C66XX_UART_KEY_BS 0x8 /**< Back space value in HEX */ +#define C66XX_UART_LINE_LEN_MAX 80 /**< Maximum available received line length */ + + + +/*------------ C66XX_UART_init() function --------------------------------*//** + * @brief Function inits the UART peripheral + * + * @param[in] core_clk - DSP core clock frequency in MHz; + * @param[in] baud_rate - desired baud rate; + * @param[in] data_bits - number of data bits; + * @param[in] parity - parity bit; + * @param[in] stop_bits - number of stop bits; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_UART_init(uint32_t core_clk, uint32_t baud_rate, uint32_t data_bits, uint32_t parity, uint32_t stop_bits); + + +/*------------ C66XX_UART_receiver_is_ready() function -------------------*//** + * @brief Function checks if a character is received over UART + * + * @return 1 - a character is received over UART, + * 0 - otherwise + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_UART_receiver_is_ready(void); + + +/*------------ C66XX_UART_receive_char() function ------------------------*//** + * @brief Function receives a character over UART + * + * @return Received character + * +-----------------------------------------------------------------------------*/ +uint8_t C66XX_UART_receive_char(void); + + +/*------------ C66XX_UART_transmit_char() function -----------------------*//** + * @brief Function transmits a character over UART + * + * @param[in] c - A character to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_UART_transmit_char(uint8_t c); + + +/*------------ C66XX_UART_transmit_string() function ---------------------*//** + * @brief Function transmits a string until '0' character + * + * @param[in] s - A pointer to the string to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_UART_transmit_string(char *s); + + +/*------------ C66XX_UART_receive_line_string() function -----------------*//** + * @brief Function receives a line ended with CR character, and stores + * received characters into string with '\0' symbol. + * + * Note that maximum received line length should not exceed + * C66XX_UART_LINE_LEN_MAX value! + * + * @param[in] s - Pointer to a string to store received characters + * + * @return Number of received characters without '\0' symbol. + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_UART_receive_line_string(char *s); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ I2C functions ================================================== +//============================================================================= + +/** @addtogroup C66XX_I2C DSP I2C functions + * @{ + */ + + +// I2C interrupt codes +#define C66XX_I2C_INTCODE_NONE 0 /**< No interrupt */ +#define C66XX_I2C_INTCODE_AL 1 /**< Arbitration-lost interrupt */ +#define C66XX_I2C_INTCODE_NACK 2 /**< No-acknowledge interrupt */ +#define C66XX_I2C_INTCODE_ARDY 3 /**< Register-access-ready interrupt */ +#define C66XX_I2C_INTCODE_ICRRDY 4 /**< Receive-data-ready interrupt */ +#define C66XX_I2C_INTCODE_ICXRDY 5 /**< Transmit-data-ready interrupt */ +#define C66XX_I2C_INTCODE_SCD 6 /**< Stop-condition-detected interrupt */ +#define C66XX_I2C_INTCODE_AAS 7 /**< Address-as-slave interrupt */ + + +/*------------ C66XX_I2C_init() function ---------------------------------*//** + * @brief Function inits the I2C peripheral + * + * @param[in] core_clk - DSP core clock frequency in MHz; + * @param[in] i2c_clk - I2C clock in Hz; + * @param[in] own_addr - I2C own slave address; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_I2C_init(uint32_t core_clk, uint32_t i2c_clk, uint32_t own_addr); + + +/*------------ C66XX_I2C_write_data() function ---------------------------*//** + * @brief Function writes data[len] to I2C chip_addr at mem_addr memory + * address + * + * @param[in] chip_addr - I2C chip address; + * @param[in] mem_addr - memory (register) address within the chip; + * @param[in] mem_addr_len - number of bytes to use for mem_addr (typically 1, + * 2 for larger memories, 0 for register type devices with only + * one register); + * @param[in] data - pointer to data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_I2C_write_data(uint8_t chip_addr, uint32_t mem_addr, uint32_t mem_addr_len, uint8_t *data, uint32_t len); + + +/*------------ C66XX_I2C_read_data() function ----------------------------*//** + * @brief Function reads data[len] from I2C chip_addr at mem_addr memory + * + * @param[in] chip_addr - I2C chip address; + * @param[in] mem_addr - memory (register) address within the chip; + * @param[in] mem_addr_len - number of bytes to use for mem_addr (typically 1, + * 2 for larger memories, 0 for register type devices with only + * one register); + * @param[out] buf - pointer to data buffer to store data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_I2C_read_data(uint8_t chip_addr, uint32_t mem_addr, uint32_t mem_addr_len, uint8_t *buf, uint32_t len); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Gigabit Ethernet (GbE) Switch functions ======================== +//============================================================================= + +/** @addtogroup C66XX_GBE DSP Gigabit Ethernet Switch functions + * @{ + */ + +/*------------ C66XX_GBE_get_mac_id() function ---------------------------*//** + * @brief Function returns DSP MAC address for this device + * + * @return 64-bit variable that contains 48-bit MAC ID + * +-----------------------------------------------------------------------------*/ +uint64_t C66XX_GBE_get_mac_id(void); + + +/*------------ C66XX_GBE_init_serdes() function --------------------------*//** + * @brief Function inits Gigabit Ethernet Serdes block to the default state + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_GBE_init_serdes(void); + + +/** SGMII port Slave operation mode */ +#define C66XX_SGMII_PORT_SLAVE_MODE 0 +/** SGMII port Master operation mode */ +#define C66XX_SGMII_PORT_MASTER_MODE 1 + + +/** SGMII port autonegotiation disabled */ +#define C66XX_SGMII_PORT_AUTONEGOTIATION_DISABLED 0 +/** SGMII port autonegotiation enabled */ +#define C66XX_SGMII_PORT_AUTONEGOTIATION_ENABLED 1 + + +/*------------ C66XX_GBE_init_sgmii() function ---------------------------*//** + * @brief Function inits Gigabit Ethernet SGMII block + * + * Note that this function requires the presence of link partner connected + * at specified SGMII port - PHY or another SGMII. + * + * @param[in] port - MAC port number for which the SGMII port setup should + * be performed + * @param[in] mode - SGMII port operation mode: master or slave. + * @param[in] autoneg - flag to enable autonegotiation on this SGMII port. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_GBE_init_sgmii(uint32_t port, uint32_t mode, uint32_t autoneg); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ SRIO functions ================================================= +//============================================================================= + +/** @addtogroup C66XX_SRIO DSP SRIO functions + * @{ + */ + +/** SRIO vendor identifier */ +#define C66XX_SRIO_DEVICE_VENDOR_ID 0x30 +/** SRIO device revision */ +#define C66XX_SRIO_DEVICE_REVISION 0x0 +/** SRIO assembly identifier */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_ID 0x0 +/** SRIO assembly vendor identifier */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_VENDOR_ID C66XX_SRIO_DEVICE_VENDOR_ID +/** SRIO assembly device revision */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_REVISION C66XX_SRIO_DEVICE_REVISION +/** SRIO assembly extension features */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_FEATURES 0x0100 + + +/** SRIO link rate 1.25 Gbps */ +#define C66XX_SRIO_LINK_RATE_1_25GB 1 +/** SRIO link rate 2.5 Gbps */ +#define C66XX_SRIO_LINK_RATE_2_5GB 2 +/** SRIO link rate 3.125 Gbps */ +#define C66XX_SRIO_LINK_RATE_3_125GB 3 +/** SRIO link rate 5 Gbps */ +#define C66XX_SRIO_LINK_RATE_5GB 4 + + +// SRIO port widths defs - corresponds to SRIO path modes +/** SRIO port width with 1 receive and transmit lane */ +#define C66XX_SRIO_PORT_WIDTH_1X 0 +/** SRIO port width with 2 receive and transmit lanes */ +#define C66XX_SRIO_PORT_WIDTH_2X 3 +/** SRIO port width with 4 receive and transmit lanes */ +#define C66XX_SRIO_PORT_WIDTH_4X 4 + + +/** SRIO port 0 */ +#define C66XX_SRIO_PORT_0 0 +/** SRIO port 1 */ +#define C66XX_SRIO_PORT_1 1 +/** SRIO port 2 */ +#define C66XX_SRIO_PORT_2 2 +/** SRIO port 3 */ +#define C66XX_SRIO_PORT_3 3 + + +/** SRIO peripheral normal operation mode */ +#define C66XX_SRIO_OPMODE_NORMAL 0 +/** SRIO peripheral loopback operation mode - used to test the peripheral */ +#define C66XX_SRIO_OPMODE_LOOPBACK 1 + + +/** SRIO device identificator data descriptor */ +typedef struct +{ + uint32_t dev_id_8bit; /**< SRIO 8-bit device identificator */ + uint32_t dev_id_16bit; /**< SRIO 16-bit device identificator */ +} C66XX_SRIO_DEVICE_ID_DD; + +// SRIO device identificator data descriptor length in bytes +#define C66XX_SRIO_DEVICE_ID_DD_LEN sizeof(C66XX_SRIO_DEVICE_ID_DD) + + +/** SRIO destination device identificators number */ +#define C66XX_SRIO_DESTINATION_DEVICE_ID_COUNT 4 + + +/** SRIO messages (Type9 and Type11) transmit queues mapping data descriptor */ +typedef struct +{ + uint32_t port; /**< SRIO port to which the queue is mapped */ + uint32_t priority; /**< priority bit */ +} C66XX_SRIO_TX_QUEUE_SCH_DD; + +// SRIO messages (Type9 and Type11) transmit queues mapping data descriptor length in bytes +#define C66XX_SRIO_TX_QUEUE_SCH_DD_LEN sizeof(C66XX_SRIO_TX_QUEUE_SCH_DD) + + +/** SRIO peripheral initialization data descriptor */ +typedef struct +{ + uint32_t mode; /**< SRIO peripheral operation mode */ + uint32_t link_rate; /**< SRIO link rate definition */ + uint32_t port_width; /**< SRIO port width definition (1x, 2x, or 4x) */ + C66XX_SRIO_DEVICE_ID_DD src_dev_id_dd; /**< SRIO base device identificators */ + C66XX_SRIO_DEVICE_ID_DD dst_dev_id_dd[C66XX_SRIO_DESTINATION_DEVICE_ID_COUNT]; /**< SRIO destination device identificators */ +} C66XX_SRIO_DD; + +// SRIO peripheral initialization data descriptor length in bytes +#define C66XX_SRIO_DD_LEN sizeof(C66XX_SRIO_DD) + + +/*------------ C66XX_SRIO_init() function --------------------------------*//** + * @brief Function inits the SRIO peripheral + * + * The function does the following: + * 1. SRIO peripheral supports directIO, doorbell, data messaging (Type9 + * packets) and data streaming (Type11 packets) operations. + * 2. Max MTU length is set to 256 bytes. + * 3. SRIO 8-bit and 16-bit base device IDs are set to supplied parameters. + * 4. Available destination SRIO 8-bit and 16-bit device IDs are set + * according to supplied parameters. + * 5. Operation mode is set according to supplied parameter. + * 6. Link rate and ports configuration (4 ports are available) are set + * according to supplied parameters. + * 7. SRIO transmit queues used in data message (Type9 and Type11) operations + * are configured by default: all 16 queues send packets onto Port 0 and + * operate at the same minimum priority level. In case the different mapping + * is needed then C66XX_srio_map_tx_queue() function should be called. + * 8. 64 SRIO doorbell interrupts are configured by default: the first 16 + * interrupts (0-15) are routed to INTDST16 (Interrupt destination 16), + * 16-31 - to INTDST17 (Interrupt destination 17), 32-47 - to INTDST18 + * (Interrupt destination 18), 48-63 - to INTDST19 (Interrupt destination + * 19). In case the different interrupt routing is needed then + * C66XX_srio_route_doorbell_interrupt() function should be called. + * 9. GARBAGE queues, which can used by the TXU, are not configured. + * + * @param[in] srio_dd - SRIO peripheral initialization data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SRIO_init(C66XX_SRIO_DD *srio_dd); + + +/*------------ C66XX_SRIO_map_tx_queue() function ------------------------*//** + * @brief Function configures the selected SRIO transmit queue according to + * supplied parameters: SRIO port to which the queue is mapped and priority + * bit + * + * @param[in] queue - transmit queue number (0 - 15) + * @param[in] tx_queue_sch_dd - transmit queue mapping data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SRIO_map_tx_queue(uint32_t queue, C66XX_SRIO_TX_QUEUE_SCH_DD *tx_queue_sch_dd); + + +/*------------ C66XX_SRIO_route_doorbell_interrupt() function ------------*//** + * @brief Function configures the selected SRIO doorbell interrupt to + * specified interrupt destination number + * + * @param[in] doorbell - SRIO doorbell interrupt number (0 - 63) + * @param[in] intdst - interrupt destination number (0 - 23) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SRIO_route_doorbell_interrupt(uint32_t doorbell, uint32_t intdst); + + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __C66XX_FUNCTIONS_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx b/ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx new file mode 100644 index 00000000..54e7ef57 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx @@ -0,0 +1,1154 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + (C) MicroLAB Systems, 2014-2015 + + File: Macros + ----- + + Notes: + ------ + 1. This C-header file contains C66xx DSP macro definitions and + is used with C66XX.h C-header file. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file C66XX_MACROS.hxx + * + * @brief Macros + * + * This file contains C66xx DSP macro definitions + * + */ + + +#ifndef __C66XX_MACROS_HXX__ // check for this file has been already included +#define __C66XX_MACROS_HXX__ 1 + + +//============================================================================= +//------------ I/O peripherals data type selector for C66xx DSP --------------- +// C66xx DSP has all I/O peripherals aligned as LSB of 32-bit words, then +// I/O peripherals should be accessed as UNSIGNED only. + +// The declared __C66XX_IO_DATA_TYPE__ is used to unify below macros and +// functions and to make particular selection at the run-time compilation time. +//================================================================ + +typedef volatile uint32_t __C66XX_IO_DATA_TYPE__; + +// read-back data bitmask for DSP memory-mapped registers (32-bit wide) +#define C66XX_RG_DATA_BITMASK 0xffffffff +//============================================================================= + + + +//============================================================================= +//============ General register access macros ================================= +//============================================================================= +// Macro to get selected register value +#define C66XX_GET_RG_VALUE(addr) ((*(__C66XX_IO_DATA_TYPE__ *) addr) & C66XX_RG_DATA_BITMASK) + +// Macro to set selected register to value +#define C66XX_SET_RG_VALUE(addr, val) ((*(__C66XX_IO_DATA_TYPE__ *) addr) = (val & C66XX_RG_DATA_BITMASK)) + +// Macro to make FIELD for the supplied value +#define C66XX_MAKE_FIELD(FIELD, val) (((val) << C66XX_##FIELD##_BITSHIFT) & C66XX_##FIELD##_BITMASK) + +// Macro to get FIELD value from the selected register +#define C66XX_GET_FIELD_VALUE(addr, FIELD) (((*(__C66XX_IO_DATA_TYPE__ *) addr) & C66XX_##FIELD##_BITMASK) >> C66XX_##FIELD##_BITSHIFT) + +// Macro to set FIELD to value in the selected register +#define C66XX_SET_FIELD_VALUE(addr, FIELD, val) ((*(__C66XX_IO_DATA_TYPE__ *) addr) = ((*(__C66XX_IO_DATA_TYPE__ *) addr) & ~C66XX_##FIELD##_BITMASK) | C66XX_MAKE_FIELD(FIELD, val)) + +//============================================================================= + + + +//============================================================================= +//============ DSP core registers macros ====================================== +//============================================================================= + +//------------ DSP CorePack revision register macros -------------------------- +#define C66XX_get_core_mm_revid_rg() C66XX_GET_RG_VALUE(C66XX_CORE_MM_REVID_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_core_mm_revid_version() C66XX_GET_FIELD_VALUE(C66XX_CORE_MM_REVID_RG_ADDR, CORE_MM_REVID_VERSION) +#define C66XX_get_core_mm_revid_revision() C66XX_GET_FIELD_VALUE(C66XX_CORE_MM_REVID_RG_ADDR, CORE_MM_REVID_REVISION) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_CORE_MM_REVID_VERSION_IS_C6678 (C66XX_get_core_mm_revid_version() == C66XX_CORE_MM_REVID_VERSION_C6678) +#define C66XX_CORE_MM_REVID_REVISION_IS_1_0 (C66XX_get_core_mm_revid_revision() == C66XX_CORE_MM_REVID_REVISION_1_0) +#define C66XX_CORE_MM_REVID_REVISION_IS_2_0 (C66XX_get_core_mm_revid_revision() == C66XX_CORE_MM_REVID_REVISION_2_0) + +//------------ DSP interrupt controller registers macros ---------------------- +// i index corresonds to DSP Event registers number +// Note that i index should be from 0 to 3 !!! +#define C66XX_get_core_evtflag_rg_addr(i) (C66XX_CORE_EVTFLAG_RG_BADDR + i * C66XX_CORE_EVTFLAG_RG_OFFSET) +#define C66XX_get_core_evtflag_rg(i) C66XX_GET_RG_VALUE(C66XX_get_core_evtflag_rg_addr(i)) + +#define C66XX_get_core_evtset_rg_addr(i) (C66XX_CORE_EVTSET_RG_BADDR + i * C66XX_CORE_EVTSET_RG_OFFSET) +#define C66XX_set_core_evtset_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_core_evtset_rg_addr(i), v) + +#define C66XX_get_core_evtclr_rg_addr(i) (C66XX_CORE_EVTCLR_RG_BADDR + i * C66XX_CORE_EVTCLR_RG_OFFSET) +#define C66XX_set_core_evtclr_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_core_evtclr_rg_addr(i), v) + +#define C66XX_get_core_evtmask_rg_addr(i) (C66XX_CORE_EVTMASK_RG_BADDR + i * C66XX_CORE_EVTMASK_RG_OFFSET) +#define C66XX_get_core_evtmask_rg(i) C66XX_GET_RG_VALUE(C66XX_get_core_evtmask_rg_addr(i)) +#define C66XX_set_core_evtmask_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_core_evtmask_rg_addr(i), v) + +//------------ DSP interrupt macros ------------------------------------------- +// These macros are used to set/get particular DSP Event in DSP Event registers +// i index corresonds to DSP Event ID number (0 - 127) +#define C66XX_get_core_event_id_rg(i) (i / 32) +#define C66XX_get_core_event_id_bitmask(i) (0x1 << (i % 32)) + +#define C66XX_get_core_event_id_flag(i) (C66XX_get_core_evtflag_rg(C66XX_get_core_event_id_rg(i)) & C66XX_get_core_event_id_bitmask(i)) +#define C66XX_set_core_event_id_flag(i) (C66XX_set_core_evtset_rg(C66XX_get_core_event_id_rg(i), C66XX_get_core_event_id_bitmask(i))) +#define C66XX_clear_core_event_id_flag(i) (C66XX_set_core_evtclr_rg(C66XX_get_core_event_id_rg(i), C66XX_get_core_event_id_bitmask(i))) +#define C66XX_get_core_event_id_mask(i) (C66XX_get_core_evtmask_rg(C66XX_get_core_event_id_rg(i)) & C66XX_get_core_event_id_bitmask(i)) +#define C66XX_set_core_event_id_mask(i) (C66XX_set_core_evtmask_rg(C66XX_get_core_event_id_rg(i), C66XX_get_core_event_id_bitmask(i))) + +//============================================================================= + + + +//============================================================================= +//============ PLL controller registers macros ================================ +//============================================================================= + +//------------ PLL control register macros ------------------------------------ +#define C66XX_get_pll_pllctl_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLCTL_RG_ADDR) +#define C66XX_set_pll_pllctl_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllctl_pllensrc() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLENSRC) +#define C66XX_set_pll_pllctl_pllensrc(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLENSRC, v) +#define C66XX_get_pll_pllctl_pllrst() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLRST) +#define C66XX_set_pll_pllctl_pllrst(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLRST, v) +#define C66XX_get_pll_pllctl_pllpwrdn() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLPWRDN) +#define C66XX_set_pll_pllctl_pllpwrdn(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLPWRDN, v) +#define C66XX_get_pll_pllctl_pllen() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLEN) +#define C66XX_set_pll_pllctl_pllen(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLEN, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLCTL_PLLENSRC_ON C66XX_set_pll_pllctl_pllensrc(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLENSRC_OFF C66XX_set_pll_pllctl_pllensrc(C66XX_OFF) +#define C66XX_SET_PLL_PLLCTL_PLLRST_ON C66XX_set_pll_pllctl_pllrst(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLRST_OFF C66XX_set_pll_pllctl_pllrst(C66XX_OFF) +#define C66XX_SET_PLL_PLLCTL_PLLPWRDN_ON C66XX_set_pll_pllctl_pllpwrdn(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLPWRDN_OFF C66XX_set_pll_pllctl_pllpwrdn(C66XX_OFF) +#define C66XX_SET_PLL_PLLCTL_PLLEN_ON C66XX_set_pll_pllctl_pllen(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLEN_OFF C66XX_set_pll_pllctl_pllen(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLCTL_PLLENSRC_IS_ON (C66XX_get_pll_pllctl_pllensrc() == C66XX_ON) +#define C66XX_PLL_PLLCTL_PLLRST_IS_ON (C66XX_get_pll_pllctl_pllrst() == C66XX_ON) +#define C66XX_PLL_PLLCTL_PLLPWRDN_IS_ON (C66XX_get_pll_pllctl_pllpwrdn() == C66XX_ON) +#define C66XX_PLL_PLLCTL_PLLEN_IS_ON (C66XX_get_pll_pllctl_pllen() == C66XX_ON) + + +//------------ PLL secondary control register macros -------------------------- +#define C66XX_get_pll_secctl_rg() C66XX_GET_RG_VALUE(C66XX_PLL_SECCTL_RG_ADDR) +#define C66XX_set_pll_secctl_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_SECCTL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_secctl_bypass() C66XX_GET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_BYPASS) +#define C66XX_set_pll_secctl_bypass(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_BYPASS, v) +#define C66XX_get_pll_secctl_output_divide() C66XX_GET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_OUTPUT_DIVIDE) +#define C66XX_set_pll_secctl_output_divide(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_OUTPUT_DIVIDE, v) + + // direct bit set macros +#define C66XX_SET_PLL_SECCTL_BYPASS_ON C66XX_set_pll_secctl_bypass(C66XX_ON) +#define C66XX_SET_PLL_SECCTL_BYPASS_OFF C66XX_set_pll_secctl_bypass(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_SECCTL_BYPASS_IS_ON (C66XX_get_pll_secctl_bypass() == C66XX_ON) + + +//------------ PLL multiplier control register macros ------------------------- +#define C66XX_get_pll_pllm_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLM_RG_ADDR) +#define C66XX_set_pll_pllm_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLM_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllm_pllm() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLM_RG_ADDR, PLL_PLLM_PLLM) +#define C66XX_set_pll_pllm_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLM_RG_ADDR, PLL_PLLM_PLLM, v) + + +//------------ PLL controller divider registers macros ------------------------ +// i index corresonds to PLL controller divider registers number +// Note that i index should be from 0 to 15 instead of 1 to 16 !!! +#define C66XX_get_pll_plldiv_rg_addr(i) (i < 3 ? (C66XX_PLL_PLLDIV1_RG_ADDR + i * 0x4) : (C66XX_PLL_PLLDIV4_RG_ADDR + (i - 3) * 0x4)) +#define C66XX_get_pll_plldiv_rg(i) C66XX_GET_RG_VALUE(C66XX_get_pll_plldiv_rg_addr(i)) +#define C66XX_set_pll_plldiv_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_pll_plldiv_rg_addr(i), v) + + // dedicated bit specific macros +#define C66XX_get_pll_plldiv_den(i) C66XX_GET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_DEN) +#define C66XX_set_pll_plldiv_den(i, v) C66XX_SET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_DEN, v) +#define C66XX_get_pll_plldiv_ratio(i) C66XX_GET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_RATIO) +#define C66XX_set_pll_plldiv_ratio(i, v) C66XX_SET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_RATIO, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLDIV_DEN_ON(i) C66XX_set_pll_plldiv_den(i, C66XX_ON) +#define C66XX_SET_PLL_PLLDIV_DEN_OFF(i) C66XX_set_pll_plldiv_den(i, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLDIV_DEN_IS_ON(i) (C66XX_get_pll_plldiv_den(i) == C66XX_ON) + + +//------------ PLL controller command register macros ------------------------- +#define C66XX_get_pll_pllcmd_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLCMD_RG_ADDR) +#define C66XX_set_pll_pllcmd_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLCMD_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllcmd_goset() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCMD_RG_ADDR, PLL_PLLCMD_GOSET) +#define C66XX_set_pll_pllcmd_goset(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCMD_RG_ADDR, PLL_PLLCMD_GOSET, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLCMD_GOSET_ON C66XX_set_pll_pllcmd_goset(C66XX_ON) +#define C66XX_SET_PLL_PLLCMD_GOSET_OFF C66XX_set_pll_pllcmd_goset(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLCMD_GOSET_IS_ON (C66XX_get_pll_pllcmd_goset() == C66XX_ON) + + +//------------ PLL controller status register macros -------------------------- +#define C66XX_get_pll_pllstat_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR) +#define C66XX_set_pll_pllstat_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllstat_gostat() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR, PLL_PLLSTAT_GOSTAT) +#define C66XX_set_pll_pllstat_gostat(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR, PLL_PLLSTAT_GOSTAT, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLSTAT_GOSTAT_ON C66XX_set_pll_pllstat_gostat(C66XX_ON) +#define C66XX_SET_PLL_PLLSTAT_GOSTAT_OFF C66XX_set_pll_pllstat_gostat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLSTAT_GOSTAT_IS_ON (C66XX_get_pll_pllstat_gostat() == C66XX_ON) + + +//------------ PLL controller clock align control register macros ------------- +#define C66XX_get_pll_alnctl_rg() C66XX_GET_RG_VALUE(C66XX_PLL_ALNCTL_RG_ADDR) +#define C66XX_set_pll_alnctl_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_ALNCTL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_alnctl_aln() C66XX_GET_FIELD_VALUE(C66XX_PLL_ALNCTL_RG_ADDR, PLL_ALNCTL_ALN) +#define C66XX_set_pll_alnctl_aln(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_ALNCTL_RG_ADDR, PLL_ALNCTL_ALN, v) + + +//------------ PLL controller divider ratio change status register macros ----- +#define C66XX_get_pll_dchange_rg() C66XX_GET_RG_VALUE(C66XX_PLL_DCHANGE_RG_ADDR) +#define C66XX_set_pll_dchange_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_DCHANGE_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_dchange_sys() C66XX_GET_FIELD_VALUE(C66XX_PLL_DCHANGE_RG_ADDR, PLL_DCHANGE_SYS) +#define C66XX_set_pll_dchange_sys(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_DCHANGE_RG_ADDR, PLL_DCHANGE_SYS, v) + + +//------------ SYSCLK status register macros ---------------------------------- +#define C66XX_get_pll_systat_rg() C66XX_GET_RG_VALUE(C66XX_PLL_SYSTAT_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_pll_systat_syson() C66XX_GET_FIELD_VALUE(C66XX_PLL_SYSTAT_RG_ADDR, PLL_SYSTAT_SYSON) + +//============================================================================= + + + +//============================================================================= +//============ Device State Control registers macros ========================== +//============================================================================= + +//------------ Main PLL Control register 0 macros ----------------------------- +#define C66XX_get_bootcfg_mainpllctl0_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR) +#define C66XX_set_bootcfg_mainpllctl0_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_mainpllctl0_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_BWADJ) +#define C66XX_set_bootcfg_mainpllctl0_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_BWADJ, v) +#define C66XX_get_bootcfg_mainpllctl0_pllm() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLM) +#define C66XX_set_bootcfg_mainpllctl0_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLM, v) +#define C66XX_get_bootcfg_mainpllctl0_plld() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLD) +#define C66XX_set_bootcfg_mainpllctl0_plld(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLD, v) + + +//------------ Main PLL Control register 1 macros ----------------------------- +#define C66XX_get_bootcfg_mainpllctl1_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR) +#define C66XX_set_bootcfg_mainpllctl1_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_mainpllctl1_ensat() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_ENSAT) +#define C66XX_set_bootcfg_mainpllctl1_ensat(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_ENSAT, v) +#define C66XX_get_bootcfg_mainpllctl1_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_BWADJ) +#define C66XX_set_bootcfg_mainpllctl1_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_BWADJ, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_MAINPLLCTL1_ENSAT_ON C66XX_set_bootcfg_mainpllctl1_ensat(C66XX_ON) +#define C66XX_SET_BOOTCFG_MAINPLLCTL1_ENSAT_OFF C66XX_set_bootcfg_mainpllctl1_ensat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_MAINPLLCTL1_ENSAT_IS_ON (C66XX_get_bootcfg_mainpllctl1_ensat() == C66XX_ON) + + +//------------ DDR3 PLL Control register 0 macros ----------------------------- +#define C66XX_get_bootcfg_ddr3pllctl0_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR) +#define C66XX_set_bootcfg_ddr3pllctl0_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_ddr3pllctl0_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BWADJ) +#define C66XX_set_bootcfg_ddr3pllctl0_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BWADJ, v) +#define C66XX_get_bootcfg_ddr3pllctl0_bypass() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BYPASS) +#define C66XX_set_bootcfg_ddr3pllctl0_bypass(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BYPASS, v) +#define C66XX_get_bootcfg_ddr3pllctl0_pllm() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLM) +#define C66XX_set_bootcfg_ddr3pllctl0_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLM, v) +#define C66XX_get_bootcfg_ddr3pllctl0_plld() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLD) +#define C66XX_set_bootcfg_ddr3pllctl0_plld(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLD, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_DDR3PLLCTL0_BYPASS_ON C66XX_set_bootcfg_ddr3pllctl0_bypass(C66XX_ON) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL0_BYPASS_OFF C66XX_set_bootcfg_ddr3pllctl0_bypass(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_DDR3PLLCTL0_BYPASS_IS_ON (C66XX_get_bootcfg_ddr3pllctl0_bypass() == C66XX_ON) + + +//------------ DDR3 PLL Control register 1 macros ----------------------------- +#define C66XX_get_bootcfg_ddr3pllctl1_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR) +#define C66XX_set_bootcfg_ddr3pllctl1_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_ddr3pllctl1_pllrst() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_PLLRST) +#define C66XX_set_bootcfg_ddr3pllctl1_pllrst(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_PLLRST, v) +#define C66XX_get_bootcfg_ddr3pllctl1_ensat() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_ENSAT) +#define C66XX_set_bootcfg_ddr3pllctl1_ensat(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_ENSAT, v) +#define C66XX_get_bootcfg_ddr3pllctl1_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_BWADJ) +#define C66XX_set_bootcfg_ddr3pllctl1_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_BWADJ, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_PLLRST_ON C66XX_set_bootcfg_ddr3pllctl1_pllrst(C66XX_ON) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_PLLRST_OFF C66XX_set_bootcfg_ddr3pllctl1_pllrst(C66XX_OFF) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_ENSAT_ON C66XX_set_bootcfg_ddr3pllctl1_ensat(C66XX_ON) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_ENSAT_OFF C66XX_set_bootcfg_ddr3pllctl1_ensat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_DDR3PLLCTL1_PLLRST_IS_ON (C66XX_get_bootcfg_ddr3pllctl1_pllrst() == C66XX_ON) +#define C66XX_BOOTCFG_DDR3PLLCTL1_ENSAT_IS_ON (C66XX_get_bootcfg_ddr3pllctl1_ensat() == C66XX_ON) + + +//------------ PASS PLL Control register 0 macros ----------------------------- +#define C66XX_get_bootcfg_passpllctl0_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR) +#define C66XX_set_bootcfg_passpllctl0_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_passpllctl0_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BWADJ) +#define C66XX_set_bootcfg_passpllctl0_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BWADJ, v) +#define C66XX_get_bootcfg_passpllctl0_bypass() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BYPASS) +#define C66XX_set_bootcfg_passpllctl0_bypass(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BYPASS, v) +#define C66XX_get_bootcfg_passpllctl0_pllm() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLM) +#define C66XX_set_bootcfg_passpllctl0_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLM, v) +#define C66XX_get_bootcfg_passpllctl0_plld() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLD) +#define C66XX_set_bootcfg_passpllctl0_plld(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLD, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_PASSPLLCTL0_BYPASS_ON C66XX_set_bootcfg_passpllctl0_bypass(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL0_BYPASS_OFF C66XX_set_bootcfg_passpllctl0_bypass(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_PASSPLLCTL0_BYPASS_IS_ON (C66XX_get_bootcfg_passpllctl0_bypass() == C66XX_ON) + + +//------------ PASS PLL Control register 1 macros ----------------------------- +#define C66XX_get_bootcfg_passpllctl1_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR) +#define C66XX_set_bootcfg_passpllctl1_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_passpllctl1_pllrst() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLRST) +#define C66XX_set_bootcfg_passpllctl1_pllrst(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLRST, v) +#define C66XX_get_bootcfg_passpllctl1_pllselect() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLSELECT) +#define C66XX_set_bootcfg_passpllctl1_pllselect(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLSELECT, v) +#define C66XX_get_bootcfg_passpllctl1_ensat() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_ENSAT) +#define C66XX_set_bootcfg_passpllctl1_ensat(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_ENSAT, v) +#define C66XX_get_bootcfg_passpllctl1_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_BWADJ) +#define C66XX_set_bootcfg_passpllctl1_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_BWADJ, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLRST_ON C66XX_set_bootcfg_passpllctl1_pllrst(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLRST_OFF C66XX_set_bootcfg_passpllctl1_pllrst(C66XX_OFF) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLSELECT_ON C66XX_set_bootcfg_passpllctl1_pllselect(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLSELECT_OFF C66XX_set_bootcfg_passpllctl1_pllselect(C66XX_OFF) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_ENSAT_ON C66XX_set_bootcfg_passpllctl1_ensat(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_ENSAT_OFF C66XX_set_bootcfg_passpllctl1_ensat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLRST_IS_ON (C66XX_get_bootcfg_passpllctl1_pllrst() == C66XX_ON) +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLSELECT_IS_ON (C66XX_get_bootcfg_passpllctl1_pllselect() == C66XX_ON) +#define C66XX_BOOTCFG_PASSPLLCTL1_ENSAT_IS_ON (C66XX_get_bootcfg_passpllctl1_ensat() == C66XX_ON) + + +//------------ Device speed register macros ----------------------------------- +#define C66XX_get_bootcfg_devspeed_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_DEVSPEED_RG_ADDR) + // dedicated bit specific macros +#define C66XX_get_bootcfg_devspeed_devspeed() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DEVSPEED_RG_ADDR, BOOTCFG_DEVSPEED_DEVSPEED) + +//============================================================================= + + + +//============================================================================= +//============ I2C registers macros =========================================== +//============================================================================= + +//------------ I2C own address register macros -------------------------------- +#define C66XX_get_i2c_icoar_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICOAR_RG_ADDR) +#define C66XX_set_i2c_icoar_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICOAR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icoar_oaddr() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICOAR_RG_ADDR, I2C_ICOAR_OADDR) +#define C66XX_set_i2c_icoar_oaddr(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICOAR_RG_ADDR, I2C_ICOAR_OADDR, v) + + +//------------ I2C interrupt mask register macros ----------------------------- +#define C66XX_get_i2c_icimr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICIMR_RG_ADDR) +#define C66XX_set_i2c_icimr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICIMR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icimr_aas() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AAS) +#define C66XX_set_i2c_icimr_aas(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AAS, v) +#define C66XX_get_i2c_icimr_scd() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_SCD) +#define C66XX_set_i2c_icimr_scd(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_SCD, v) +#define C66XX_get_i2c_icimr_icxrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICXRDY) +#define C66XX_set_i2c_icimr_icxrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICXRDY, v) +#define C66XX_get_i2c_icimr_icrdrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICRDRDY) +#define C66XX_set_i2c_icimr_icrdrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICRDRDY, v) +#define C66XX_get_i2c_icimr_ardy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ARDY) +#define C66XX_set_i2c_icimr_ardy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ARDY, v) +#define C66XX_get_i2c_icimr_nack() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_NACK) +#define C66XX_set_i2c_icimr_nack(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_NACK, v) +#define C66XX_get_i2c_icimr_al() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AL) +#define C66XX_set_i2c_icimr_al(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AL, v) + + // direct bit set macros +#define C66XX_SET_I2C_ICIMR_AAS_ON C66XX_set_i2c_icimr_aas(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_AAS_OFF C66XX_set_i2c_icimr_aas(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_SCD_ON C66XX_set_i2c_icimr_scd(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_SCD_OFF C66XX_set_i2c_icimr_scd(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_ICXRDY_ON C66XX_set_i2c_icimr_icxrdy(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_ICXRDY_OFF C66XX_set_i2c_icimr_icxrdy(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_ICRDRDY_ON C66XX_set_i2c_icimr_icrdrdy(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_ICRDRDY_OFF C66XX_set_i2c_icimr_icrdrdy(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_ARDY_ON C66XX_set_i2c_icimr_ardy(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_ARDY_OFF C66XX_set_i2c_icimr_ardy(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_NACK_ON C66XX_set_i2c_icimr_nack(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_NACK_OFF C66XX_set_i2c_icimr_nack(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_AL_ON C66XX_set_i2c_icimr_al(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_AL_OFF C66XX_set_i2c_icimr_al(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICIMR_AAS_IS_ON (C66XX_get_i2c_icimr_aas() == C66XX_ON) +#define C66XX_I2C_ICIMR_SCD_IS_ON (C66XX_get_i2c_icimr_scd() == C66XX_ON) +#define C66XX_I2C_ICIMR_ICXRDY_IS_ON (C66XX_get_i2c_icimr_icxrdy() == C66XX_ON) +#define C66XX_I2C_ICIMR_ICRDRDY_IS_ON (C66XX_get_i2c_icimr_icrdrdy() == C66XX_ON) +#define C66XX_I2C_ICIMR_ARDY_IS_ON (C66XX_get_i2c_icimr_ardy() == C66XX_ON) +#define C66XX_I2C_ICIMR_NACK_IS_ON (C66XX_get_i2c_icimr_nack() == C66XX_ON) +#define C66XX_I2C_ICIMR_AL_IS_ON (C66XX_get_i2c_icimr_al() == C66XX_ON) + + +//------------ I2C interrupt status register macros --------------------------- +#define C66XX_get_i2c_icstr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICSTR_RG_ADDR) +#define C66XX_set_i2c_icstr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICSTR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icstr_sdir() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SDIR) +#define C66XX_set_i2c_icstr_sdir(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SDIR, v) +#define C66XX_get_i2c_icstr_nacksnt() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACKSNT) +#define C66XX_set_i2c_icstr_nacksnt(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACKSNT, v) +#define C66XX_get_i2c_icstr_bb() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_BB) +#define C66XX_set_i2c_icstr_bb(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_BB, v) +#define C66XX_get_i2c_icstr_rsfull() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_RSFULL) +#define C66XX_get_i2c_icstr_xsmt() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_XSMT) +#define C66XX_get_i2c_icstr_aas() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AAS) +#define C66XX_get_i2c_icstr_ad0() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AD0) +#define C66XX_get_i2c_icstr_scd() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SCD) +#define C66XX_set_i2c_icstr_scd(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SCD, v) +#define C66XX_get_i2c_icstr_icxrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICXRDY) +#define C66XX_set_i2c_icstr_icxrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICXRDY, v) +#define C66XX_get_i2c_icstr_icrdrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICRDRDY) +#define C66XX_set_i2c_icstr_icrdrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICRDRDY, v) +#define C66XX_get_i2c_icstr_ardy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ARDY) +#define C66XX_set_i2c_icstr_ardy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ARDY, v) +#define C66XX_get_i2c_icstr_nack() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACK) +#define C66XX_set_i2c_icstr_nack(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACK, v) +#define C66XX_get_i2c_icstr_al() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AL) +#define C66XX_set_i2c_icstr_al(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AL, v) + + // direct bit set macros +#define C66XX_CLEAR_I2C_ICSTR_SDIR C66XX_set_i2c_icstr_sdir(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_NACKSNT C66XX_set_i2c_icstr_nacksnt(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_BB C66XX_set_i2c_icstr_bb(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_SCD C66XX_set_i2c_icstr_scd(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_ICXRDY C66XX_set_i2c_icstr_icxrdy(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_ICRDRDY C66XX_set_i2c_icstr_icrdrdy(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_ARDY C66XX_set_i2c_icstr_ardy(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_NACK C66XX_set_i2c_icstr_nack(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_AL C66XX_set_i2c_icstr_al(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICSTR_SDIR_IS_ON (C66XX_get_i2c_icstr_sdir() == C66XX_ON) +#define C66XX_I2C_ICSTR_NACKSNT_IS_ON (C66XX_get_i2c_icstr_nacksnt() == C66XX_ON) +#define C66XX_I2C_ICSTR_BB_IS_ON (C66XX_get_i2c_icstr_bb() == C66XX_ON) +#define C66XX_I2C_ICSTR_RSFULL_IS_ON (C66XX_get_i2c_icstr_rsfull() == C66XX_ON) +#define C66XX_I2C_ICSTR_XSMT_IS_ON (C66XX_get_i2c_icstr_xsmt() == C66XX_ON) +#define C66XX_I2C_ICSTR_AAS_IS_ON (C66XX_get_i2c_icstr_aas() == C66XX_ON) +#define C66XX_I2C_ICSTR_AD0_IS_ON (C66XX_get_i2c_icstr_ad0() == C66XX_ON) +#define C66XX_I2C_ICSTR_SCD_IS_ON (C66XX_get_i2c_icstr_scd() == C66XX_ON) +#define C66XX_I2C_ICSTR_ICXRDY_IS_ON (C66XX_get_i2c_icstr_icxrdy() == C66XX_ON) +#define C66XX_I2C_ICSTR_ICRDRDY_IS_ON (C66XX_get_i2c_icstr_icrdrdy() == C66XX_ON) +#define C66XX_I2C_ICSTR_ARDY_IS_ON (C66XX_get_i2c_icstr_ardy() == C66XX_ON) +#define C66XX_I2C_ICSTR_NACK_IS_ON (C66XX_get_i2c_icstr_nack() == C66XX_ON) +#define C66XX_I2C_ICSTR_AL_IS_ON (C66XX_get_i2c_icstr_al() == C66XX_ON) + + +//------------ I2C clock low-time divider register macros --------------------- +#define C66XX_get_i2c_icclkl_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICCLKL_RG_ADDR) +#define C66XX_set_i2c_icclkl_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICCLKL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icclkl_iccl() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICCLKL_RG_ADDR, I2C_ICCLKL_ICCL) +#define C66XX_set_i2c_icclkl_iccl(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICCLKL_RG_ADDR, I2C_ICCLKL_ICCL, v) + + +//------------ I2C clock high-time divider register macros -------------------- +#define C66XX_get_i2c_icclkh_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICCLKH_RG_ADDR) +#define C66XX_set_i2c_icclkh_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICCLKH_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icclkh_icch() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICCLKH_RG_ADDR, I2C_ICCLKH_ICCH) +#define C66XX_set_i2c_icclkh_icch(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICCLKH_RG_ADDR, I2C_ICCLKH_ICCH, v) + + +//------------ I2C data count register macros --------------------------------- +#define C66XX_get_i2c_iccnt_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICCNT_RG_ADDR) +#define C66XX_set_i2c_iccnt_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICCNT_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_iccnt_icdc() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICCNT_RG_ADDR, I2C_ICCNT_ICDC) +#define C66XX_set_i2c_iccnt_icdc(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICCNT_RG_ADDR, I2C_ICCNT_ICDC, v) + + +//------------ I2C data receive register macros ------------------------------- +#define C66XX_get_i2c_icdrr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICDRR_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_i2c_icdrr_d() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICDRR_RG_ADDR, I2C_ICDRR_D) + + +//------------ I2C slave address register macros ------------------------------ +#define C66XX_get_i2c_icsar_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICSAR_RG_ADDR) +#define C66XX_set_i2c_icsar_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICSAR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icsar_saddr() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSAR_RG_ADDR, I2C_ICSAR_SADDR) +#define C66XX_set_i2c_icsar_saddr(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSAR_RG_ADDR, I2C_ICSAR_SADDR, v) + + +//------------ I2C data transmit register macros ------------------------------ +#define C66XX_get_i2c_icdxr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICDXR_RG_ADDR) +#define C66XX_set_i2c_icdxr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICDXR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icdxr_d() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICDXR_RG_ADDR, I2C_ICDXR_D) +#define C66XX_set_i2c_icdxr_d(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICDXR_RG_ADDR, I2C_ICDXR_D, v) + + +//------------ I2C mode register macros --------------------------------------- +#define C66XX_get_i2c_icmdr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICMDR_RG_ADDR) +#define C66XX_set_i2c_icmdr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICMDR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icmdr_nackmod() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_NACKMOD) +#define C66XX_set_i2c_icmdr_nackmod(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_NACKMOD, v) +#define C66XX_get_i2c_icmdr_free() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FREE) +#define C66XX_set_i2c_icmdr_free(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FREE, v) +#define C66XX_get_i2c_icmdr_stt() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STT) +#define C66XX_set_i2c_icmdr_stt(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STT, v) +#define C66XX_get_i2c_icmdr_stp() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STP) +#define C66XX_set_i2c_icmdr_stp(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STP, v) +#define C66XX_get_i2c_icmdr_mst() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_MST) +#define C66XX_set_i2c_icmdr_mst(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_MST, v) +#define C66XX_get_i2c_icmdr_trx() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_TRX) +#define C66XX_set_i2c_icmdr_trx(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_TRX, v) +#define C66XX_get_i2c_icmdr_xa() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_XA) +#define C66XX_set_i2c_icmdr_xa(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_XA, v) +#define C66XX_get_i2c_icmdr_rm() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_RM) +#define C66XX_set_i2c_icmdr_rm(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_RM, v) +#define C66XX_get_i2c_icmdr_dlb() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_DLB) +#define C66XX_set_i2c_icmdr_dlb(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_DLB, v) +#define C66XX_get_i2c_icmdr_irs() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_IRS) +#define C66XX_set_i2c_icmdr_irs(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_IRS, v) +#define C66XX_get_i2c_icmdr_stb() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STB) +#define C66XX_set_i2c_icmdr_stb(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STB, v) +#define C66XX_get_i2c_icmdr_fdf() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FDF) +#define C66XX_set_i2c_icmdr_fdf(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FDF, v) +#define C66XX_get_i2c_icmdr_bc() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_BC) +#define C66XX_set_i2c_icmdr_bc(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_BC, v) + + // direct bit set macros +#define C66XX_SET_I2C_ICMDR_NACKMOD_ON C66XX_set_i2c_icmdr_nackmod(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_NACKMOD_OFF C66XX_set_i2c_icmdr_nackmod(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_FREE_ON C66XX_set_i2c_icmdr_free(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_FREE_OFF C66XX_set_i2c_icmdr_free(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_STT_ON C66XX_set_i2c_icmdr_stt(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_STT_OFF C66XX_set_i2c_icmdr_stt(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_STP_ON C66XX_set_i2c_icmdr_stp(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_STP_OFF C66XX_set_i2c_icmdr_stp(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_MST_ON C66XX_set_i2c_icmdr_mst(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_MST_OFF C66XX_set_i2c_icmdr_mst(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_TRX_ON C66XX_set_i2c_icmdr_trx(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_TRX_OFF C66XX_set_i2c_icmdr_trx(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_XA_OFF C66XX_set_i2c_icmdr_xa(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_XA_ON C66XX_set_i2c_icmdr_xa(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_RM_OFF C66XX_set_i2c_icmdr_rm(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_RM_ON C66XX_set_i2c_icmdr_rm(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_DLB_OFF C66XX_set_i2c_icmdr_dlb(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_DLB_ON C66XX_set_i2c_icmdr_dlb(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_IRS_OFF C66XX_set_i2c_icmdr_irs(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_IRS_ON C66XX_set_i2c_icmdr_irs(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_STB_OFF C66XX_set_i2c_icmdr_stb(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_STB_ON C66XX_set_i2c_icmdr_stb(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_FDF_OFF C66XX_set_i2c_icmdr_fdf(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_FDF_ON C66XX_set_i2c_icmdr_fdf(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICMDR_NACKMOD_IS_ON (C66XX_get_i2c_icmdr_nackmod() == C66XX_ON) +#define C66XX_I2C_ICMDR_FREE_IS_ON (C66XX_get_i2c_icmdr_free() == C66XX_ON) +#define C66XX_I2C_ICMDR_STT_IS_ON (C66XX_get_i2c_icmdr_stt() == C66XX_ON) +#define C66XX_I2C_ICMDR_STP_IS_ON (C66XX_get_i2c_icmdr_stp() == C66XX_ON) +#define C66XX_I2C_ICMDR_MST_IS_ON (C66XX_get_i2c_icmdr_mst() == C66XX_ON) +#define C66XX_I2C_ICMDR_TRX_IS_ON (C66XX_get_i2c_icmdr_trx() == C66XX_ON) +#define C66XX_I2C_ICMDR_XA_IS_ON (C66XX_get_i2c_icmdr_xa() == C66XX_ON) +#define C66XX_I2C_ICMDR_RM_IS_ON (C66XX_get_i2c_icmdr_rm() == C66XX_ON) +#define C66XX_I2C_ICMDR_DLB_IS_ON (C66XX_get_i2c_icmdr_dlb() == C66XX_ON) +#define C66XX_I2C_ICMDR_IRS_IS_ON (C66XX_get_i2c_icmdr_irs() == C66XX_ON) +#define C66XX_I2C_ICMDR_STB_IS_ON (C66XX_get_i2c_icmdr_stb() == C66XX_ON) +#define C66XX_I2C_ICMDR_FDF_IS_ON (C66XX_get_i2c_icmdr_fdf() == C66XX_ON) + + +//------------ I2C interrupt vector register macros --------------------------- +#define C66XX_get_i2c_icivr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICIVR_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_i2c_icivr_intcode() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIVR_RG_ADDR, I2C_ICIVR_INTCODE) + + +//------------ I2C extended mode register macros ------------------------------ +#define C66XX_get_i2c_icemdr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICEMDR_RG_ADDR) +#define C66XX_set_i2c_icemdr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icemdr_ignack() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_IGNACK) +#define C66XX_set_i2c_icemdr_ignack(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_IGNACK, v) +#define C66XX_get_i2c_icemdr_bcm() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_BCM) +#define C66XX_set_i2c_icemdr_bcm(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_BCM, v) + + // direct bit set macros +#define C66XX_SET_I2C_ICEMDR_IGNACK_ON C66XX_set_i2c_icemdr_ignack(C66XX_ON) +#define C66XX_SET_I2C_ICEMDR_IGNACK_OFF C66XX_set_i2c_icemdr_ignack(C66XX_OFF) +#define C66XX_SET_I2C_ICEMDR_BCM_ON C66XX_set_i2c_icemdr_bcm(C66XX_ON) +#define C66XX_SET_I2C_ICEMDR_BCM_OFF C66XX_set_i2c_icemdr_bcm(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICEMDR_IGNACK_IS_ON (C66XX_get_i2c_icemdr_ignack() == C66XX_ON) +#define C66XX_I2C_ICEMDR_BCM_IS_ON (C66XX_get_i2c_icemdr_bcm() == C66XX_ON) + + +//------------ I2C prescaler register macros ---------------------------------- +#define C66XX_get_i2c_icpsc_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICPSC_RG_ADDR) +#define C66XX_set_i2c_icpsc_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICPSC_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icpsc_ipsc() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPSC_RG_ADDR, I2C_ICPSC_IPSC) +#define C66XX_set_i2c_icpsc_ipsc(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPSC_RG_ADDR, I2C_ICPSC_IPSC, v) + + +//------------ I2C peripheral identification 1 register macros ---------------- +#define C66XX_get_i2c_icpid1_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICPID1_RG_ADDR) +#define C66XX_set_i2c_icpid1_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICPID1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icpid1_class() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_CLASS) +#define C66XX_set_i2c_icpid1_class(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_CLASS, v) +#define C66XX_get_i2c_icpid1_revision() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_REVISION) +#define C66XX_set_i2c_icpid1_revision(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_REVISION, v) + + +//------------ I2C peripheral identification 2 register macros ---------------- +#define C66XX_get_i2c_icpid2_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICPID2_RG_ADDR) +#define C66XX_set_i2c_icpid2_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICPID2_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icpid2_type() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPID2_RG_ADDR, I2C_ICPID2_TYPE) +#define C66XX_set_i2c_icpid2_type(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPID2_RG_ADDR, I2C_ICPID2_TYPE, v) +//============================================================================= + + + +//============================================================================= +//============ EMIF16 configuration macros ==================================== +//============================================================================= + +//------------ Revision code and status register macros ----------------------- +#define C66XX_get_emif16_rcsr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_RCSR_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_emif16_rcsr_be() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_BE) +#define C66XX_get_emif16_rcsr_mod_id() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_MOD_ID) +#define C66XX_get_emif16_rcsr_mj_rev() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_MJ_REV) +#define C66XX_get_emif16_rcsr_min_rev() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_MIN_REV) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_RCSR_BE_IS_ON (C66XX_get_emif16_rcsr_be() == C66XX_ON) +#define C66XX_EMIF16_RCSR_MOD_ID_IS_DEFAULT_VALUE (C66XX_get_emif16_rcsr_mod_id() == C66XX_EMIF16_RCSR_MOD_ID_DEFAULT_VALUE) +#define C66XX_EMIF16_RCSR_MJ_REV_IS_DEFAULT_VALUE (C66XX_get_emif16_rcsr_mj_rev() == C66XX_EMIF16_RCSR_MJ_REV_DEFAULT_VALUE) +#define C66XX_EMIF16_RCSR_MIN_REV_IS_DEFAULT_VALUE (C66XX_get_emif16_rcsr_min_rev() == C66XX_EMIF16_RCSR_MIN_REV_DEFAULT_VALUE) + + +//------------ Async wait cycle config register macros ------------------------ +#define C66XX_get_emif16_awccr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR) +#define C66XX_set_emif16_awccr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_awccr_wp1() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP1) +#define C66XX_set_emif16_awccr_wp1(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP1, v) +#define C66XX_get_emif16_awccr_wp0() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP0) +#define C66XX_set_emif16_awccr_wp0(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP0, v) +#define C66XX_get_emif16_awccr_cs5_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS5_WAIT) +#define C66XX_set_emif16_awccr_cs5_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS5_WAIT, v) +#define C66XX_get_emif16_awccr_cs4_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS4_WAIT) +#define C66XX_set_emif16_awccr_cs4_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS4_WAIT, v) +#define C66XX_get_emif16_awccr_cs3_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS3_WAIT) +#define C66XX_set_emif16_awccr_cs3_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS3_WAIT, v) +#define C66XX_get_emif16_awccr_cs2_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS2_WAIT) +#define C66XX_set_emif16_awccr_cs2_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS2_WAIT, v) +#define C66XX_get_emif16_awccr_max_ext_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_MAX_EXT_WAIT) +#define C66XX_set_emif16_awccr_max_ext_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_MAX_EXT_WAIT, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_AWCCR_WP1_ON C66XX_set_emif16_awccr_wp1(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_WP1_OFF C66XX_set_emif16_awccr_wp1(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_WP0_ON C66XX_set_emif16_awccr_wp0(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_WP0_OFF C66XX_set_emif16_awccr_wp0(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS5_WAIT1 C66XX_set_emif16_awccr_cs5_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS5_WAIT0 C66XX_set_emif16_awccr_cs5_wait(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS4_WAIT1 C66XX_set_emif16_awccr_cs4_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS4_WAIT0 C66XX_set_emif16_awccr_cs4_wait(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS3_WAIT1 C66XX_set_emif16_awccr_cs3_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS3_WAIT0 C66XX_set_emif16_awccr_cs3_wait(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS2_WAIT1 C66XX_set_emif16_awccr_cs2_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS2_WAIT0 C66XX_set_emif16_awccr_cs2_wait(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_AWCCR_WP1_IS_ON (C66XX_get_emif16_awccr_wp1() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_WP0_IS_ON (C66XX_get_emif16_awccr_wp0() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS5_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs5_wait() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS4_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs4_wait() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS3_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs3_wait() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS2_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs2_wait() == C66XX_ON) + + +//------------ Async config registers macros ---------------------------------- +// i index corresonds to Async config registers number +#define C66XX_get_emif16_acr_rg_addr(i) (C66XX_EMIF16_A1CR_RG_ADDR + i * 0x4) +#define C66XX_get_emif16_acr_rg(i) C66XX_GET_RG_VALUE(C66XX_get_emif16_acr_rg_addr(i)) +#define C66XX_set_emif16_acr_rg(i,v) C66XX_SET_RG_VALUE(C66XX_get_emif16_acr_rg_addr(i), v) + + // dedicated bit specific macros +#define C66XX_get_emif16_acr_ss(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_SS) +#define C66XX_set_emif16_acr_ss(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_SS, v) +#define C66XX_get_emif16_acr_ew(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_EW) +#define C66XX_set_emif16_acr_ew(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_EW, v) +#define C66XX_get_emif16_acr_w_setup(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_SETUP) +#define C66XX_set_emif16_acr_w_setup(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_SETUP, v) +#define C66XX_get_emif16_acr_w_strobe(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_STROBE) +#define C66XX_set_emif16_acr_w_strobe(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_STROBE, v) +#define C66XX_get_emif16_acr_w_hold(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_HOLD) +#define C66XX_set_emif16_acr_w_hold(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_HOLD, v) +#define C66XX_get_emif16_acr_r_setup(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_SETUP) +#define C66XX_set_emif16_acr_r_setup(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_SETUP, v) +#define C66XX_get_emif16_acr_r_strobe(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_STROBE) +#define C66XX_set_emif16_acr_r_strobe(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_STROBE, v) +#define C66XX_get_emif16_acr_r_hold(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_HOLD) +#define C66XX_set_emif16_acr_r_hold(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_HOLD, v) +#define C66XX_get_emif16_acr_ta(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_TA) +#define C66XX_set_emif16_acr_ta(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_TA, v) +#define C66XX_get_emif16_acr_asize(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_ASIZE) +#define C66XX_set_emif16_acr_asize(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_ASIZE, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_ACR_SS_ON(i) C66XX_set_emif16_acr_ss(i, C66XX_ON) +#define C66XX_SET_EMIF16_ACR_SS_OFF(i) C66XX_set_emif16_acr_ss(i, C66XX_OFF) +#define C66XX_SET_EMIF16_ACR_EW_ON(i) C66XX_set_emif16_acr_ew(i, C66XX_ON) +#define C66XX_SET_EMIF16_ACR_EW_OFF(i) C66XX_set_emif16_acr_ew(i, C66XX_OFF) +#define C66XX_SET_EMIF16_ACR_ASIZE_16BIT(i) C66XX_set_emif16_acr_asize(i, C66XX_EMIF16_A1CR_ASIZE_16BIT) +#define C66XX_SET_EMIF16_ACR_ASIZE_8BIT(i) C66XX_set_emif16_acr_asize(i, C66XX_EMIF16_A1CR_ASIZE_8BIT) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_ACR_SS_IS_ON(i) (C66XX_get_emif16_acr_ss(i) == C66XX_ON) +#define C66XX_EMIF16_ACR_EW_IS_ON(i) (C66XX_get_emif16_acr_ew(i) == C66XX_ON) +#define C66XX_EMIF16_ACR_ASIZE_IS_16BIT(i) (C66XX_get_emif16_acr_asize(i) == C66XX_EMIF16_A1CR_ASIZE_16BIT) + + +//------------ Interrupt raw register macros ---------------------------------- +#define C66XX_get_emif16_irr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IRR_RG_ADDR) +#define C66XX_set_emif16_irr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IRR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_irr_wr() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_WR) +#define C66XX_set_emif16_irr_wr(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_WR, v) +#define C66XX_get_emif16_irr_at() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_AT) +#define C66XX_set_emif16_irr_at(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_AT, v) + + // direct bit set macros +#define C66XX_CLEAR_EMIF16_IRR_AT C66XX_set_emif16_irr_at(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IRR_AT_IS_ON (C66XX_get_emif16_irr_at() == C66XX_ON) + + +//------------ Interrupt masked register macros ------------------------------- +#define C66XX_get_emif16_imr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IMR_RG_ADDR) +#define C66XX_set_emif16_imr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IMR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_imr_wr_masked() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_WR_MASKED) +#define C66XX_set_emif16_imr_wr_masked(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_WR_MASKED, v) +#define C66XX_get_emif16_imr_at_masked() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_AT_MASKED) +#define C66XX_set_emif16_imr_at_masked(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_AT_MASKED, v) + + // direct bit set macros +#define C66XX_CLEAR_EMIF16_IMR_AT_MASKED C66XX_set_emif16_imr_at_masked(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IMR_AT_MASKED_IS_ON (C66XX_get_emif16_imr_at_masked() == C66XX_ON) + + +//------------ Interrupt mask set register macros ----------------------------- +#define C66XX_get_emif16_imsr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IMSR_RG_ADDR) +#define C66XX_set_emif16_imsr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_imsr_wr_mask_set() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_WR_MASK_SET) +#define C66XX_set_emif16_imsr_wr_mask_set(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_WR_MASK_SET, v) +#define C66XX_get_emif16_imsr_at_mask_set() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_AT_MASK_SET) +#define C66XX_set_emif16_imsr_at_mask_set(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_AT_MASK_SET, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_IMSR_AT_MASK_SET_ON C66XX_set_emif16_imsr_at_mask_set(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IMSR_AT_MASK_SET_IS_ON (C66XX_get_emif16_imsr_at_mask_set() == C66XX_ON) + + +//------------ Interrupt mask clear register macros ----------------------------- +#define C66XX_get_emif16_imcr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IMCR_RG_ADDR) +#define C66XX_set_emif16_imcr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_imcr_wr_mask_clr() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_WR_MASK_CLR) +#define C66XX_set_emif16_imcr_wr_mask_clr(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_WR_MASK_CLR, v) +#define C66XX_get_emif16_imcr_at_mask_clr() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_AT_MASK_CLR) +#define C66XX_set_emif16_imcr_at_mask_clr(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_AT_MASK_CLR, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_IMCR_AT_MASK_CLR_ON C66XX_set_emif16_imcr_at_mask_clr(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IMCR_AT_MASK_CLR_IS_ON (C66XX_get_emif16_imcr_at_mask_clr() == C66XX_ON) +//============================================================================= + + + +//============================================================================= +//============ Timer registers macros ========================================= +//============================================================================= + +//------------ Emulation Management and Clock Speed register macros ----------- +#define C66XX_get_timer_emumgt_clkspd_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_EMUMGT_CLKSPD_RG_ADDR(timer)) + + // dedicated bit specific macros +#define C66XX_get_timer_emumgt_clkspd_clkdiv(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_EMUMGT_CLKSPD_RG_ADDR(timer), TIMER_EMUMGT_CLKSPD_CLKDIV) + + +//------------ Counter register low register macros --------------------------- +#define C66XX_get_timer_cntlo_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CNTLO_RG_ADDR(timer)) +#define C66XX_set_timer_cntlo_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CNTLO_RG_ADDR(timer), v) + + +//------------ Counter register high register macros -------------------------- +#define C66XX_get_timer_cnthi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CNTHI_RG_ADDR(timer)) +#define C66XX_set_timer_cnthi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CNTHI_RG_ADDR(timer), v) + + +//------------ Period register low register macros ---------------------------- +#define C66XX_get_timer_prdlo_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_PRDLO_RG_ADDR(timer)) +#define C66XX_set_timer_prdlo_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_PRDLO_RG_ADDR(timer), v) + + +//------------ Period register high register macros --------------------------- +#define C66XX_get_timer_prdhi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_PRDHI_RG_ADDR(timer)) +#define C66XX_set_timer_prdhi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_PRDHI_RG_ADDR(timer), v) + + +//------------ Timer control register macros ---------------------------------- +#define C66XX_get_timer_tcr_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer)) +#define C66XX_set_timer_tcr_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_tcr_readrstmode_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_HI) +#define C66XX_set_timer_tcr_readrstmode_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_HI, v) +#define C66XX_get_timer_tcr_enamode_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_HI) +#define C66XX_set_timer_tcr_enamode_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_HI, v) +#define C66XX_get_timer_tcr_pwid_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_HI) +#define C66XX_set_timer_tcr_pwid_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_HI, v) +#define C66XX_get_timer_tcr_cp_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_HI) +#define C66XX_set_timer_tcr_cp_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_HI, v) +#define C66XX_get_timer_tcr_invoutp_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_HI) +#define C66XX_set_timer_tcr_invoutp_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_HI, v) +#define C66XX_get_timer_tcr_tstat_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TSTAT_HI) +#define C66XX_get_timer_tcr_capevtmode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPEVTMODE_LO) +#define C66XX_set_timer_tcr_capevtmode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPEVTMODE_LO, v) +#define C66XX_get_timer_tcr_capmode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPMODE_LO) +#define C66XX_set_timer_tcr_capmode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPMODE_LO, v) +#define C66XX_get_timer_tcr_readrstmode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_LO) +#define C66XX_set_timer_tcr_readrstmode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_LO, v) +#define C66XX_get_timer_tcr_tien_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TIEN_LO) +#define C66XX_set_timer_tcr_tien_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TIEN_LO, v) +#define C66XX_get_timer_tcr_clksrc_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CLKSRC_LO) +#define C66XX_set_timer_tcr_clksrc_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CLKSRC_LO, v) +#define C66XX_get_timer_tcr_enamode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_LO) +#define C66XX_set_timer_tcr_enamode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_LO, v) +#define C66XX_get_timer_tcr_pwid_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_LO) +#define C66XX_set_timer_tcr_pwid_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_LO, v) +#define C66XX_get_timer_tcr_cp_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_LO) +#define C66XX_set_timer_tcr_cp_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_LO, v) +#define C66XX_get_timer_tcr_invinp_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVINP_LO) +#define C66XX_set_timer_tcr_invinp_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVINP_LO, v) +#define C66XX_get_timer_tcr_invoutp_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_LO) +#define C66XX_set_timer_tcr_invoutp_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_LO, v) +#define C66XX_get_timer_tcr_tstat_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TSTAT_LO) + + // direct bit set macros +#define C66XX_SET_TIMER_TCR_READRSTMODE_HI_ON(timer) C66XX_set_timer_tcr_readrstmode_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_READRSTMODE_HI_OFF(timer) C66XX_set_timer_tcr_readrstmode_hi(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_DISABLED(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_ONE_SHOT(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_CONT(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_CONT_RELOAD(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_SET_TIMER_TCR_PWID_HI_1_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_SET_TIMER_TCR_PWID_HI_2_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_SET_TIMER_TCR_PWID_HI_3_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_SET_TIMER_TCR_PWID_HI_4_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_SET_TIMER_TCR_CP_HI_ON(timer) C66XX_set_timer_tcr_cp_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CP_HI_OFF(timer) C66XX_set_timer_tcr_cp_hi(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_INVOUTP_HI_ON(timer) C66XX_set_timer_tcr_invoutp_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_INVOUTP_HI_OFF(timer) C66XX_set_timer_tcr_invoutp_hi(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_CAPEVTMODE_LO_RISING_EDGE(timer) C66XX_set_timer_tcr_capevtmode_lo(timer, C66XX_TIMER_TCR_CAPEVTMODE_RISING_EDGE) +#define C66XX_SET_TIMER_TCR_CAPEVTMODE_LO_FALLING_EDGE(timer) C66XX_set_timer_tcr_capevtmode_lo(timer, C66XX_TIMER_TCR_CAPEVTMODE_FALLING_EDGE) +#define C66XX_SET_TIMER_TCR_CAPEVTMODE_LO_ANY_EDGE(timer) C66XX_set_timer_tcr_capevtmode_lo(timer, C66XX_TIMER_TCR_CAPEVTMODE_ANY_EDGE) +#define C66XX_SET_TIMER_TCR_CAPMODE_LO_ON(timer) C66XX_set_timer_tcr_capmode_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CAPMODE_LO_OFF(timer) C66XX_set_timer_tcr_capmode_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_READRSTMODE_LO_ON(timer) C66XX_set_timer_tcr_readrstmode_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_READRSTMODE_LO_OFF(timer) C66XX_set_timer_tcr_readrstmode_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_TIEN_LO_ON(timer) C66XX_set_timer_tcr_tien_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_TIEN_LO_OFF(timer) C66XX_set_timer_tcr_tien_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_CLKSRC_LO_ON(timer) C66XX_set_timer_tcr_clksrc_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CLKSRC_LO_OFF(timer) C66XX_set_timer_tcr_clksrc_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_DISABLED(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_ONE_SHOT(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_CONT(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_CONT_RELOAD(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_SET_TIMER_TCR_PWID_LO_1_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_SET_TIMER_TCR_PWID_LO_2_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_SET_TIMER_TCR_PWID_LO_3_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_SET_TIMER_TCR_PWID_LO_4_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_SET_TIMER_TCR_CP_LO_ON(timer) C66XX_set_timer_tcr_cp_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CP_LO_OFF(timer) C66XX_set_timer_tcr_cp_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_INVINP_LO_ON(timer) C66XX_set_timer_tcr_invinp_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_INVINP_LO_OFF(timer) C66XX_set_timer_tcr_invinp_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_INVOUTP_LO_ON(timer) C66XX_set_timer_tcr_invoutp_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_INVOUTP_LO_OFF(timer) C66XX_set_timer_tcr_invoutp_lo(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_TCR_READRSTMODE_HI_IS_ON(timer) (C66XX_get_timer_tcr_readrstmode_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_DISABLED(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_ONE_SHOT(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_CONT(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_CONT_RELOAD(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_TIMER_TCR_PWI_HI_IS_1_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_TIMER_TCR_PWI_HI_IS_2_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_TIMER_TCR_PWI_HI_IS_3_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_TIMER_TCR_PWI_HI_IS_4_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_TIMER_TCR_CP_HI_IS_ON(timer) (C66XX_get_timer_tcr_cp_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_INVOUTP_HI_IS_ON(timer) (C66XX_get_timer_tcr_invoutp_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_TSTAT_HI_IS_ON(timer) (C66XX_get_timer_tcr_tstat_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_IS_RISING_EDGE(timer) (C66XX_get_timer_tcr_capevtmode_lo(timer) == C66XX_TIMER_TCR_CAPEVTMODE_RISING_EDGE) +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_IS_FALLING_EDGE(timer) (C66XX_get_timer_tcr_capevtmode_lo(timer) == C66XX_TIMER_TCR_CAPEVTMODE_FALLING_EDGE) +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_IS_ANY_EDGE(timer) (C66XX_get_timer_tcr_capevtmode_lo(timer) == C66XX_TIMER_TCR_CAPEVTMODE_ANY_EDGE) +#define C66XX_TIMER_TCR_CAPMODE_LO_IS_ON(timer) (C66XX_get_timer_tcr_capmode_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_READRSTMODE_LO_IS_ON(timer) (C66XX_get_timer_tcr_readrstmode_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_TIEN_LO_IS_ON(timer) (C66XX_get_timer_tcr_tien_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_CLKSRC_LO_IS_ON(timer) (C66XX_get_timer_tcr_clksrc_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_DISABLED(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_ONE_SHOT(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_CONT(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_CONT_RELOAD(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_TIMER_TCR_PWI_LO_IS_1_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_TIMER_TCR_PWI_LO_IS_2_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_TIMER_TCR_PWI_LO_IS_3_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_TIMER_TCR_PWI_LO_IS_4_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_TIMER_TCR_CP_LO_IS_ON(timer) (C66XX_get_timer_tcr_cp_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_INVINP_LO_IS_ON(timer) (C66XX_get_timer_tcr_invinp_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_INVOUTP_LO_IS_ON(timer) (C66XX_get_timer_tcr_invoutp_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_TSTAT_LO_IS_ON(timer) (C66XX_get_timer_tcr_tstat_lo(timer) == C66XX_ON) + + +//------------ Timer global control register macros --------------------------- +#define C66XX_get_timer_tgcr_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer)) +#define C66XX_set_timer_tgcr_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_tgcr_tddrhi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TDDRHI) +#define C66XX_set_timer_tgcr_tddrhi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TDDRHI, v) +#define C66XX_get_timer_tgcr_pschi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PSCHI) +#define C66XX_set_timer_tgcr_pschi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PSCHI, v) +#define C66XX_get_timer_tgcr_plusen(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PLUSEN) +#define C66XX_set_timer_tgcr_plusen(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PLUSEN, v) +#define C66XX_get_timer_tgcr_timmode(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMMODE) +#define C66XX_set_timer_tgcr_timmode(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMMODE, v) +#define C66XX_get_timer_tgcr_timhirs(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMHIRS) +#define C66XX_set_timer_tgcr_timhirs(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMHIRS, v) +#define C66XX_get_timer_tgcr_timlors(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMLORS) +#define C66XX_set_timer_tgcr_timlors(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMLORS, v) + + // direct bit set macros +#define C66XX_SET_TIMER_TGCR_PLUSEN_ON(timer) C66XX_set_timer_tgcr_plusen(timer, C66XX_ON) +#define C66XX_SET_TIMER_TGCR_PLUSEN_OFF(timer) C66XX_set_timer_tgcr_plusen(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TGCR_TIMMODE_64BIT_GPT(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_64BIT_GPT) +#define C66XX_SET_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED) +#define C66XX_SET_TIMER_TGCR_TIMMODE_64BIT_WDT(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_64BIT_WDT) +#define C66XX_SET_TIMER_TGCR_TIMMODE_32BIT_CHAINED(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_32BIT_CHAINED) +#define C66XX_SET_TIMER_TGCR_TIMHIRS_ON(timer) C66XX_set_timer_tgcr_timhirs(timer, C66XX_ON) +#define C66XX_SET_TIMER_TGCR_TIMHIRS_OFF(timer) C66XX_set_timer_tgcr_timhirs(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TGCR_TIMLORS_ON(timer) C66XX_set_timer_tgcr_timlors(timer, C66XX_ON) +#define C66XX_SET_TIMER_TGCR_TIMLORS_OFF(timer) C66XX_set_timer_tgcr_timlors(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_TGCR_PLUSEN_IS_ON(timer) (C66XX_get_timer_tgcr_plusen(timer) == C66XX_ON) +#define C66XX_TIMER_TGCR_TIMMODE_IS_64BIT_GPT(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_64BIT_GPT) +#define C66XX_TIMER_TGCR_TIMMODE_IS_32BIT_UNCHAINED(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED) +#define C66XX_TIMER_TGCR_TIMMODE_IS_64BIT_WDT(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_64BIT_WDT) +#define C66XX_TIMER_TGCR_TIMMODE_IS_32BIT_CHAINED(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_32BIT_CHAINED) +#define C66XX_TIMER_TGCR_TIMHIRS_IS_ON(timer) (C66XX_get_timer_tgcr_timhirs(timer) == C66XX_ON) +#define C66XX_TIMER_TGCR_TIMLORS_IS_ON(timer) (C66XX_get_timer_tgcr_timlors(timer) == C66XX_ON) + + +//------------ Watchdog Timer Control Register macros ------------------------- +#define C66XX_get_timer_wdtcr_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer)) +#define C66XX_set_timer_wdtcr_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_wdtcr_wdkey(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDKEY) +#define C66XX_set_timer_wdtcr_wdkey(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDKEY, v) +#define C66XX_get_timer_wdtcr_wdflag(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDFLAG) +#define C66XX_set_timer_wdtcr_wdflag(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDFLAG, v) +#define C66XX_get_timer_wdtcr_wden(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDEN) +#define C66XX_set_timer_wdtcr_wden(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDEN, v) + + // direct bit set macros +#define C66XX_SET_TIMER_WDTCR_WDKEY_FIRST_KEY(timer) C66XX_set_timer_wdtcr_wdkey(timer, C66XX_TIMER_WDTCR_WDKEY_FIRST_KEY) +#define C66XX_SET_TIMER_WDTCR_WDKEY_SECOND_KEY(timer) C66XX_set_timer_wdtcr_wdkey(timer, C66XX_TIMER_WDTCR_WDKEY_SECOND_KEY) +#define C66XX_SET_TIMER_WDTCR_WDFLAG_ON(timer) C66XX_set_timer_wdtcr_wdflag(timer, C66XX_ON) +#define C66XX_SET_TIMER_WDTCR_WDFLAG_OFF(timer) C66XX_set_timer_wdtcr_wdflag(timer, C66XX_OFF) +#define C66XX_SET_TIMER_WDTCR_WDEN_ON(timer) C66XX_set_timer_wdtcr_wden(timer, C66XX_ON) +#define C66XX_SET_TIMER_WDTCR_WDEN_OFF(timer) C66XX_set_timer_wdtcr_wden(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_WDTCR_WDFLAG_IS_ON(timer) (C66XX_get_timer_wdtcr_wdflag(timer) == C66XX_ON) +#define C66XX_TIMER_WDTCR_WDEN_IS_ON(timer) (C66XX_get_timer_wdtcr_wden(timer) == C66XX_ON) + + +//------------ Timer Reload register low register macros ---------------------- +#define C66XX_get_timer_rello_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_RELLO_RG_ADDR(timer)) +#define C66XX_set_timer_rello_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_RELLO_RG_ADDR(timer), v) + + +//------------ Timer Reload register high register macros --------------------- +#define C66XX_get_timer_relhi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_RELHI_RG_ADDR(timer)) +#define C66XX_set_timer_relhi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_RELHI_RG_ADDR(timer), v) + + +//------------ Timer Capture register low register macros --------------------- +#define C66XX_get_timer_caplo_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CAPLO_RG_ADDR(timer)) +#define C66XX_set_timer_caplo_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CAPLO_RG_ADDR(timer), v) + + +//------------ Timer Capture register high register macros -------------------- +#define C66XX_get_timer_caphi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CAPHI_RG_ADDR(timer)) +#define C66XX_set_timer_caphi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CAPHI_RG_ADDR(timer), v) + + +//------------ Timer interrupt control and status register macros ------------- +#define C66XX_get_timer_intctlstat_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer)) +#define C66XX_set_timer_intctlstat_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_intctlstat_evtintstat_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_HI) +#define C66XX_set_timer_intctlstat_evtintstat_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_HI, v) +#define C66XX_get_timer_intctlstat_evtinten_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_HI) +#define C66XX_set_timer_intctlstat_evtinten_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_HI, v) +#define C66XX_get_timer_intctlstat_prdintstat_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_HI) +#define C66XX_set_timer_intctlstat_prdintstat_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_HI, v) +#define C66XX_get_timer_intctlstat_prdinten_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_HI) +#define C66XX_set_timer_intctlstat_prdinten_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_HI, v) +#define C66XX_get_timer_intctlstat_evtintstat_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_LO) +#define C66XX_set_timer_intctlstat_evtintstat_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_LO, v) +#define C66XX_get_timer_intctlstat_evtinten_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_LO) +#define C66XX_set_timer_intctlstat_evtinten_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_LO, v) +#define C66XX_get_timer_intctlstat_prdintstat_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_LO) +#define C66XX_set_timer_intctlstat_prdintstat_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_LO, v) +#define C66XX_get_timer_intctlstat_prdinten_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_LO) +#define C66XX_set_timer_intctlstat_prdinten_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_LO, v) + + // direct bit set macros +#define C66XX_CLEAR_TIMER_INTCTLSTAT_EVTINTSTAT_HI(timer) C66XX_set_timer_intctlstat_evtintstat_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_HI_ON(timer) C66XX_set_timer_intctlstat_evtinten_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_HI_OFF(timer) C66XX_set_timer_intctlstat_evtinten_hi(timer, C66XX_OFF) +#define C66XX_CLEAR_TIMER_INTCTLSTAT_PRDINTSTAT_HI(timer) C66XX_set_timer_intctlstat_prdintstat_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_HI_ON(timer) C66XX_set_timer_intctlstat_prdinten_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_HI_OFF(timer) C66XX_set_timer_intctlstat_prdinten_hi(timer, C66XX_OFF) +#define C66XX_CLEAR_TIMER_INTCTLSTAT_EVTINTSTAT_LO(timer) C66XX_set_timer_intctlstat_evtintstat_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_LO_ON(timer) C66XX_set_timer_intctlstat_evtinten_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_LO_OFF(timer) C66XX_set_timer_intctlstat_evtinten_lo(timer, C66XX_OFF) +#define C66XX_CLEAR_TIMER_INTCTLSTAT_PRDINTSTAT_LO(timer) C66XX_set_timer_intctlstat_prdintstat_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_LO_ON(timer) C66XX_set_timer_intctlstat_prdinten_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_LO_OFF(timer) C66XX_set_timer_intctlstat_prdinten_lo(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_evtintstat_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_evtinten_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_prdintstat_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_prdinten_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_evtintstat_lo(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_evtinten_lo(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_prdintstat_lo(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_prdinten_lo(timer) == C66XX_ON) + +//============================================================================= + + + +//============================================================================= +#endif /* __C66XX_MACROS_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/TA66XX_DSP.h b/ports/c667x/ccs/example_build/include/TA66XX_DSP.h new file mode 100644 index 00000000..04dfc4b7 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_DSP.h @@ -0,0 +1,251 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 4A. + General definitions and API functions. + (C) MicroLAB Systems, 2015-2017 + + + http://www.mlabsys.com + ftp://ftp.mlabsys.com + email: techsupport@mlabsys.com + + + Description: + ------------ + This file contains general definitions and API functions for TORNADO AMC + modules SDK and must be included in the user C-application for + TORNADO AMC modules. + + + Revision history: + ----------------- + rev.2A - 2015, initial release for TORNADO-A6678 board rev.1B; + rev.3A - 2016: + - added support for TORNADO-A6678/FMC board rev.1A; + rev.3B - 2017: + - added support for TORNADO-A6678/FMC board rev.1B; + rev.4A - 2017: + - added support for TORNADO-AZ/FMC board rev.1A; + + + Notes: + ------ + 1. This C-header file is an include file for TI C6xxx C/C++ Code + Generation Tools, which must be invoked to compile for C66xx DSP + platform. + + 2. This file is best viewed with the TAB setting set to '4'. + + + Copyright: + ---------- + This utility is supplied free of charge as it is without any obligation + from MicroLAB Systems. No responsibility is assumed for any use or misuse + of these utilities. + +******************************************************************************/ + + +/** + * @file TA66XX_DSP.h + * + * @brief Main include file + * + * This file contains general definitions and API functions for TORNADO + * AMC modules SDK + * + */ + + +#ifndef __TA66XX_DSP_H__ // check for this file has been already included +#define __TA66XX_DSP_H__ 1 + + +// General defs +#define TA66XX_ON 1 +#define TA66XX_OFF 0 + + +// Include C66xx DSP defs, macros and aux functions +#include "C66XX.h" +// Include TORNADO AMC SDK functions errors +#include "TASDK_ERR.h" + + + +//============================================================================= +/** TORNADO AMC SDK revision ID */ +#define TA66XX_SDK_REVISION_ID "4A" +//============================================================================= + + + +//============================================================================= +//============ TORNADO AMC SDK API functions ID defs ========================== +//============================================================================= +/** @addtogroup TA66XX_FUNCTIONS_ID SDK API functions ID defs + * @{ + */ + + +/**< Function name max size */ +#define TA66XX_FUNCTION_NAME_LEN_MAX 64 + + +enum +{ + TA66XX_GET_ERROR_MESSAGE_FUNCTION_ID = 0, + TA66XX_GET_FUNCTION_NAME_FUNCTION_ID, + TA66XX_BC_SET_I2C_INTERRUPT_NUMBER_FUNCTION_ID, + TA66XX_BC_SET_UART_INTERRUPT_NUMBER_FUNCTION_ID, + TA66XX_BC_INIT_FUNCTION_ID, + TA66XX_BC_MAP_DSP_GPIO_INTERRUPT_FUNCTION_ID, + TA66XX_BC_UNMAP_DSP_GPIO_INTERRUPT_FUNCTION_ID, + TA66XX_BC_INIT_UART_FUNCTION_ID, + TA66XX_BC_WRITE_EEPROM_FUNCTION_ID, + TA66XX_BC_READ_EEPROM_FUNCTION_ID, + TA66XX_BC_ERASE_EEPROM_FUNCTION_ID, + TA66XX_BC_GET_DEVICE_INFO_FUNCTION_ID, + TA66XX_BC_GET_HW_CFG_INFO_FUNCTION_ID, + TA66XX_BC_GET_FMC_INFO_FUNCTION_ID, + TA66XX_BC_GET_TEMP_STATE_FUNCTION_ID, + TA66XX_BC_GET_POWER_STATE_FUNCTION_ID, + TA66XX_BC_GET_FMC_POWER_STATE_FUNCTION_ID, + TA66XX_BC_GET_SFP_INFO_FUNCTION_ID, + TA66XX_BC_SET_FPGA_HIF_CONFIG_FUNCTION_ID, + TA66XX_BC_GET_FPGA_HIF_CONFIG_FUNCTION_ID, + TA66XX_BC_CLEAR_FPGA_CNF_FUNCTION_ID, + TA66XX_BC_LOAD_FPGA_CNF_FUNCTION_ID, + TA66XX_BC_GET_GBE_PORT_INFO_FUNCTION_ID, + TA66XX_BC_INIT_GBE_PORT_FUNCTION_ID, + TA66XX_BC_ERASE_FLASH_FUNCTION_ID, + TA66XX_BC_WRITE_FLASH_FUNCTION_ID, + TA66XX_BC_READ_FLASH_FUNCTION_ID, + TA66XX_SC_INIT_FLASH_RECORD_LIST_FUNCTION_ID, + TA66XX_SC_GET_NUMBER_OF_FLASH_RECORDS_FUNCTION_ID, + TA66XX_SC_GET_FLASH_RECORD_LIST_FUNCTION_ID, + TA66XX_SC_GET_FLASH_RECORD_INFO_FUNCTION_ID, + TA66XX_SC_READ_FLASH_RECORD_DATA_FUNCTION_ID, + TA66XX_SC_CREATE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_WRITE_FLASH_RECORD_DATA_FUNCTION_ID, + TA66XX_SC_XCLOSE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_UPDATE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_DELETE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_SQUEEZE_FLASH_RECORDS_FUNCTION_ID, + TA66XX_SC_GET_FLASH_FREE_SPACE_FUNCTION_ID, + TA66XX_SC_GET_BOOT_SEQ_FUNCTION_ID, + TA66XX_SC_DELETE_BOOT_SEQ_FUNCTION_ID, + TA66XX_SC_SET_BOOT_SEQ_FUNCTION_ID, + TA66XX_SC_LOAD_DSP_APPL_FROM_MEMORY_FUNCTION_ID, + TA66XX_SC_LOAD_DSP_APPL_FROM_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_LOAD_FPGA_CNF_FROM_FLASH_RECORD_FUNCTION_ID, + TA66XX_NUMBER_OF_FUNCTIONS +}; +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +//============================================================================= +//============ General SDK API functions declarations ========================= +//============================================================================= + +/** @addtogroup TA66XX_GENERAL TORNADO AMC SDK general API functions + * @{ + */ + +/*------------ TA66XX_set_error() function -------------------------------*//** + * @brief Function should be used on exit from SDK API functions in + * order to set error code and function ID of SDK API functions + * + * @param[in] err - error code; + * @param[in] function_id - function ID of SDK API functions; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_set_error(int32_t err, int32_t function_id); + + +/*------------ TA66XX_get_last_error() function --------------------------*//** + * @brief Function returns error code of last executed API function + * + * @return Error code of last executed API function + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_last_error(void); + + +/*------------ TA66XX_get_error_flag() function --------------------------*//** + * @brief Function returns status of ERROR_FLAG for API functions + * + * ERROR_FLAG is set by each API function in case error has been detected. + * ERROR_FLAG can be reset by TA66XX_clear_error_flag() API function + * + * @param[out] error_code - pointer to a variable to receive the error code in + * case error has been detected. In case pointer is NULL, then + * no error code is returned; + * @param[out] error_function_id - pointer to a variable to receive ID of the + * first API function, which has returned with error. In case + * pointer is NULL, then no function ID is returned; + * + * @return Status of ERROR_FLAG: ON or OFF + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_error_flag(int32_t *error_code, int32_t *error_function_id); + + +/*------------ TA66XX_clear_error_flag() function ------------------------*//** + * @brief Function clear ERROR_FLAG for API functions + * + * @return Always OK + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_clear_error_flag(void); + + +/*------------ TA66XX_get_error_message() function -----------------------*//** + * @brief Function returns the text interpretation of the error code. + * + * @param[in] error - error code to be interpreted; + * @param[out] error_message - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_error_message(int32_t error, char *error_message); + + +/*------------ TA66XX_get_function_name() function -----------------------*//** + * @brief Function returns the text interpretation of API function. + * + * @param[in] function_id - ID of the API function to be interpreted; + * @param[out] function_name - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_function_name(int32_t function_id, char *function_name); + + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __TA66XX_DSP_H__ */ + diff --git a/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h new file mode 100644 index 00000000..dbc748e0 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h @@ -0,0 +1,121 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 4A. + Definitions, macros and API functions for DSP Environment. + (C) MicroLAB Systems, 2014-2017 + + + http://www.mlabsys.com + ftp://ftp.mlabsys.com + email: techsupport@mlabsys.com + + + Description: + ------------ + This file contains definitions, macros and API functions for TORNADO AMC + modules on-board DSP environment and must be included in the user + C-application for TORNADO AMC modules. + + + Revision history: + ----------------- + rev.1A - 2014, initial release for TORNADO-A6678 board rev.1A. + rev.1B - 2015, fixed some bugs. + rev.1C - 2015, added support for TORNADO-A6678 board rev.1B: + - updated DSP external control registers area; + - updated TA66XX_init_dsp() DSP initialization + function; + - added MMC-to-DSP communication functions in DSP + I2C functions. + rev.2A - 2015, totally redesigned SDK for TORNADO-A6678 board rev.1B; + rev.3A - 2016, added support for TORNADO-A6678/FMC board rev.1A; + rev.3B - 2017: + - added support for TORNADO-A6678/FMC board rev.1B; + rev.4A - 2017: + - added support for TORNADO-AZ/FMC board rev.1A; + + + Notes: + ------ + 1. This C-header file is an include file for TI C6xxx C/C++ Code + Generation Tools, which must be invoked to compile for C66xx DSP + platform. + + 2. This file is best viewed with the TAB setting set to '4'. + + 3. This library uses dynamic memory allocation in erase FLASH functions, + so user should provide enough memory area for dynamic memory allocation + (-heap parameter) and place the section (.sysmem) in the corresponding + memory area in linker command file. + The max requested memory allocation block length is up to FLASH memory + sector length in bytes (128 KB). + + 4. This header file is externally controlled from user C-code by run-time + compiler keys definitions in order to apply board-type specific + definitions to refer to particular definitions included for different + board type: + + __TA66XX_BC_USE_BIOS__ + - if defined in user code prior inclusion of this header file, + then TI SYS/BIOS modules(HWI (Hardware Interrupt) and ECM + (Event Combiner Manager)), will be used to support + C66xx CorePac interrupt controller (INTC). + TI INTC Chip Support Library (CSL) should be used in case + NO embedded operating system is used in user application. + DEFAULT is NOT DEFINED, so CSL INTC library will be used + to support C66xx CorePac interrupt controller. + + Copyright: + ---------- + This utility is supplied free of charge as it is without any obligation + from MicroLAB Systems. No responsibility is assumed for any use or misuse + of these utilities. + +******************************************************************************/ + + +/** + * @file TA66XX_DSP_BC.h + * + * @brief Main include file + * + * This file contains definitions, macros and API functions for TORNADO + * AMC modules on-board DSP environment + * + */ + + +#ifndef __TA66XX_DSP_BC_H__ // check for this file has been already included +#define __TA66XX_DSP_BC_H__ 1 + + +#if defined __TA66XX_BC_USE_BIOS__ +// Include this file to prevent compiler errors +// when using SYS/BIOS +#include +#endif /* __TA66XX_BC_USE_BIOS__ */ + + +// Include general TORNADO AMC SDK defs +#include "TA66XX_DSP.h" + + +//============================================================================= +//------------ board-type specific run-time compiler keys processing ---------- +// (this is required in order to exclude key confusions) + +// Default setting is C6678 DSP definitions +#define __C66XX_SELECT_C6678_DSP__ 1 + +// Finally we must define C-code data type for accessing I/O areas +typedef volatile uint16_t __TA66XX_BC_DSP_XCR_RG_DATA_TYPE__; +typedef volatile uint16_t __TA66XX_BC_FLASH_DATA_TYPE__; +//============================================================================= + + +// Include TORNADO AMC SDK functions +#include "TA66XX_DSP_BC_FUNCTIONS.hxx" + + +//============================================================================= +#endif /* __TA66XX_DSP_BC_H__ */ + diff --git a/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx new file mode 100644 index 00000000..338a01ee --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx @@ -0,0 +1,1732 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 3B. + (C) MicroLAB Systems, 2014-2017 + + File: TORNADO AMC SDK functions for DSP environment declarations + ----- + + Notes: + ------ + 1. This C-header file contains TORNADO AMC modules SDK functions + for DSP environment declarations and is an include file for + TI C6xxx C/C++ Code Generation Tools, which must be invoked to compile + for TORNADO AMC platform. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file TA66XX_DSP_BC_FUNCTIONS.hxx + * + * @brief Board control (BC) SDK functions declarations + * + * This file contains declarations of TORNADO AMC modules SDK functions for + * board control + * + */ + + +#ifndef __TA66XX_DSP_BC_FUNCTIONS_HXX__ // check for this file has been already included +#define __TA66XX_DSP_BC_FUNCTIONS_HXX__ 1 + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +//============================================================================= +//============ DSP environment functions ====================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_INIT TORNADO AMC DSP environment init functions + * @{ + */ + + +/** Default DSP interrupt vector for DSP I2C interrupt */ +#define TA66XX_BC_I2C_INTERRUPT_NUMBER_USED 4 + + +/*------------ TA66XX_BC_set_i2c_interrupt_number() function -------------*//** + * @brief Function should be called before calling TA66XX_BC_init() function + * and is used to select DSP interrupt vector number for DSP I2C interrupt. + * + * @param[in] dsp_vector_id - DSP interrupt vector number, which will be used + * for DSP I2C interrupt. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_i2c_interrupt_number(uint32_t dsp_vector_id); + + +/*------------ TA66XX_BC_get_i2c_interrupt_number() function -------------*//** + * @brief Function returns current DSP interrupt vector number for DSP I2C + * interrupt. + * + * @return DSP interrupt vector number, which is used for DSP I2C interrupt. + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_i2c_interrupt_number(void); + + +/** Default DSP interrupt vector for DSP UART interrupt */ +#define TA66XX_BC_UART_INTERRUPT_NUMBER_USED 5 + + +/*------------ TA66XX_BC_set_uart_interrupt_number() function ------------*//** + * @brief Function should be called before calling TA66XX_BC_init() function + * and is used to select DSP interrupt vector number for DSP UART interrupt. + * + * @param[in] dsp_vector_id - DSP interrupt vector number, which will be used + * for DSP UART interrupt. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_uart_interrupt_number(uint32_t dsp_vector_id); + + +/*------------ TA66XX_BC_get_uart_interrupt_number() function ------------*//** + * @brief Function returns current DSP interrupt vector number for DSP UART + * interrupt. + * + * @return DSP interrupt vector number, which is used for DSP UART interrupt. + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_uart_interrupt_number(void); + + +/*------------ TA66XX_BC_init() function ---------------------------------*//** + * @brief Function performs initialization of TORNADO AMC modules + * DSP environment in accordance with board type + * + * The function does the following: + * 1. DSP on-chip caches are configured by default: L1P and L1D caches are + * enabled and set to max available size, L2 cache is disabled so L2 memory + * acts as SRAM. + * 2. DSP main PLL, DDR3 PLL and PASS PLL are configured by default: DSP core + * clock is set to TA66XX_BC_DSP_CORE_SPEED_VALUE, DDR3 and PASS controllers + * to default values + * 3. DDR3 memory is configured and ready to use + * 4. All DSP power domains are enabled + * 5. DSP EMIF-16 bus is configured. + * 6. In case external 1GE interface is installed then DSP SGMII port is + * initialized. + * 7. DSP GPIO pins are configured as outputs and cleared. + * 8. DSP LEDs are enabled. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_init(void); + + +/*------------ TA66XX_BC_get_ddr_area_base_addr() function ---------------*//** + * @brief Function returns DDR3 area base address + * + * @return DDR3 area base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_ddr_area_base_addr(void); + + +/*------------ TA66XX_BC_get_ddr_area_length() function ------------------*//** + * @brief Function returns DDR3 area length in bytes + * + * @return DDR3 area length in bytes + * +-----------------------------------------------------------------------------*/ +uint64_t TA66XX_BC_get_ddr_area_length(void); + + +//----------------------------------------------------------------------------- +// These functions are used to map either lower 2 GB DDR3 page or high 2 GB +// DDR3 page of 4GB DDR3 memory area to DSP 32-bit logical memory map. + +/** The lower 2GB DDR3 memory page */ +#define TA66XX_BC_DDR3_MEM_PAGE0 0 +/** The high 2GB DDR3 memory page */ +#define TA66XX_BC_DDR3_MEM_PAGE1 1 +//----------------------------------------------------------------------------- + +/*------------ TA66XX_BC_set_ddr_area_page() function --------------------*//** + * @brief Function sets the specified 2 GB DDR3 memory page (0 or 1) to be + * mapped to DSP 32-bit logical memory map. + * + * This function should be used only in case of 4 GB and more DDR3 memory is + * installed otherwise it does nothing. + * + * @param[in] page - 2 GB DDR3 memory page (0 or 1); + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_ddr_area_page(uint32_t page); + + +/*------------ TA66XX_BC_get_ddr_area_page() function --------------------*//** + * @brief Function returns current selected 2 GB DDR3 memory page (0 or 1) + * which is mapped to DSP 32-bit logical memory map. + * + * @return Current selected 2 GB DDR3 memory page (0 or 1) + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_ddr_area_page(void); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ DSP LED functions ============================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_DSP_LED TORNADO AMC DSP LED functions + * @{ + */ + +/** DSP LED definitions */ +enum TA66XX_BC_DSP_LEDS +{ + TA66XX_BC_DSP_LED0 = 0, /**< DSP LED-0 */ + TA66XX_BC_DSP_LED1, /**< DSP LED-1 */ + TA66XX_BC_DSP_LED2, /**< DSP LED-2 */ + TA66XX_BC_DSP_LED3, /**< DSP LED-3 */ + TA66XX_BC_DSP_LED4, /**< DSP LED-4 */ + TA66XX_BC_DSP_LED5, /**< DSP LED-5 */ + TA66XX_BC_DSP_LED6, /**< DSP LED-6 */ + TA66XX_BC_DSP_LED7 /**< DSP LED-7 */ +}; + +/** DSP LED bitmask definitions */ +enum TA66XX_BC_DSP_LED_BITMASKS +{ + TA66XX_BC_DSP_LED0_BITMASK = 0x0001, /**< DSP LED-0 bitmask */ + TA66XX_BC_DSP_LED1_BITMASK = 0x0002, /**< DSP LED-1 bitmask */ + TA66XX_BC_DSP_LED2_BITMASK = 0x0004, /**< DSP LED-2 bitmask */ + TA66XX_BC_DSP_LED3_BITMASK = 0x0008, /**< DSP LED-3 bitmask */ + TA66XX_BC_DSP_LED4_BITMASK = 0x0010, /**< DSP LED-4 bitmask */ + TA66XX_BC_DSP_LED5_BITMASK = 0x0020, /**< DSP LED-5 bitmask */ + TA66XX_BC_DSP_LED6_BITMASK = 0x0040, /**< DSP LED-6 bitmask */ + TA66XX_BC_DSP_LED7_BITMASK = 0x0080, /**< DSP LED-7 bitmask */ + TA66XX_BC_DSP_LEDS_BITMASK = 0x00ff /**< DSP LEDs bitmask */ +}; + +// Definitions for DSP LEDs used for TORNADO-A6678/FMC rev.1A and later boards +/** DSP LED GREEN-0 */ +#define TA66XX_BC_DSP_LED_GREEN0 TA66XX_BC_DSP_LED0 +#define TA66XX_BC_DSP_LED_GREEN0_BITMASK TA66XX_BC_DSP_LED0_BITMASK +/** DSP LED RED-0 */ +#define TA66XX_BC_DSP_LED_RED0 TA66XX_BC_DSP_LED1 +#define TA66XX_BC_DSP_LED_RED0_BITMASK TA66XX_BC_DSP_LED1_BITMASK +/** DSP LED GREEN-1 */ +#define TA66XX_BC_DSP_LED_GREEN1 TA66XX_BC_DSP_LED2 +#define TA66XX_BC_DSP_LED_GREEN1_BITMASK TA66XX_BC_DSP_LED2_BITMASK +/** DSP LED RED-1 */ +#define TA66XX_BC_DSP_LED_RED1 TA66XX_BC_DSP_LED3 +#define TA66XX_BC_DSP_LED_RED1_BITMASK TA66XX_BC_DSP_LED3_BITMASK +/** DSP LED GREEN-2 */ +#define TA66XX_BC_DSP_LED_GREEN2 TA66XX_BC_DSP_LED4 +#define TA66XX_BC_DSP_LED_GREEN2_BITMASK TA66XX_BC_DSP_LED4_BITMASK +/** DSP LED YELLOW-0 */ +#define TA66XX_BC_DSP_LED_YELLOW0 TA66XX_BC_DSP_LED5 +#define TA66XX_BC_DSP_LED_YELLOW0_BITMASK TA66XX_BC_DSP_LED5_BITMASK +/** DSP LED YELLOW-1 */ +#define TA66XX_BC_DSP_LED_YELLOW1 TA66XX_BC_DSP_LED6 +#define TA66XX_BC_DSP_LED_YELLOW1_BITMASK TA66XX_BC_DSP_LED6_BITMASK +/** DSP LED RED-2 */ +#define TA66XX_BC_DSP_LED_RED2 TA66XX_BC_DSP_LED7 +#define TA66XX_BC_DSP_LED_RED2_BITMASK TA66XX_BC_DSP_LED7_BITMASK + +/** DSP LED aliases for compatibility with TORNADO-A6678 rev.1B-1 board definitions */ +#define TA66XX_BC_DSP_LED_RED TA66XX_BC_DSP_LED_RED0 +#define TA66XX_BC_DSP_LED_AMBER TA66XX_BC_DSP_LED_YELLOW0 +#define TA66XX_BC_DSP_LED_BLUE TA66XX_BC_DSP_LED_GREEN2 +#define TA66XX_BC_DSP_LED_WHITE TA66XX_BC_DSP_LED_RED2 + + +// Aliases for DSP LEDs used for TORNADO-A6678 rev.1B-1 board +/** DSP LED GREEN-0 */ +#define TA6678_REV1B_BC_DSP_LED_GREEN0 TA66XX_BC_DSP_LED0 +#define TA6678_REV1B_BC_DSP_LED_GREEN0_BITMASK TA66XX_BC_DSP_LED0_BITMASK +/** DSP LED GREEN-1 */ +#define TA6678_REV1B_BC_DSP_LED_GREEN1 TA66XX_BC_DSP_LED1 +#define TA6678_REV1B_BC_DSP_LED_GREEN1_BITMASK TA66XX_BC_DSP_LED1_BITMASK +/** DSP LED YELLOW-0 */ +#define TA6678_REV1B_BC_DSP_LED_YELLOW0 TA66XX_BC_DSP_LED2 +#define TA6678_REV1B_BC_DSP_LED_YELLOW0_BITMASK TA66XX_BC_DSP_LED2_BITMASK +/** DSP LED YELLOW-1 */ +#define TA6678_REV1B_BC_DSP_LED_YELLOW1 TA66XX_BC_DSP_LED3 +#define TA6678_REV1B_BC_DSP_LED_YELLOW1_BITMASK TA66XX_BC_DSP_LED3_BITMASK +/** DSP LED AMBER */ +#define TA6678_REV1B_BC_DSP_LED_AMBER TA66XX_BC_DSP_LED4 +#define TA6678_REV1B_BC_DSP_LED_AMBER_BITMASK TA66XX_BC_DSP_LED4_BITMASK +/** DSP LED RED */ +#define TA6678_REV1B_BC_DSP_LED_RED TA66XX_BC_DSP_LED5 +#define TA6678_REV1B_BC_DSP_LED_RED_BITMASK TA66XX_BC_DSP_LED5_BITMASK +/** DSP LED BLUE */ +#define TA6678_REV1B_BC_DSP_LED_BLUE TA66XX_BC_DSP_LED6 +#define TA6678_REV1B_BC_DSP_LED_BLUE_BITMASK TA66XX_BC_DSP_LED6_BITMASK +/** DSP LED WHITE */ +#define TA6678_REV1B_BC_DSP_LED_WHITE TA66XX_BC_DSP_LED7 +#define TA6678_REV1B_BC_DSP_LED_WHITE_BITMASK TA66XX_BC_DSP_LED7_BITMASK + + + +/*------------ TA66XX_BC_set_dsp_leds_enable() function ------------------*//** + * @brief Function enables or disables on-board DSP LEDs + * + * @param[in] state - DSP LEDs enable state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_leds_enable(uint32_t enable); + + +/*------------ TA66XX_BC_get_dsp_leds_enable_status() function -----------*//** + * @brief Function returns enable status of on-board DSP LEDs + * + * @return DSP LEDs enable state: TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_leds_enable_status(void); + + +/*------------ TA66XX_BC_set_dsp_led_state() function --------------------*//** + * @brief Function sets selected DSP LED to the desired state: ON or OFF + * + * @param[in] led_number - DSP LED number definition; + * @param[in] state - DSP LED state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_led_state(uint32_t led_number, uint32_t state); + + +/*------------ TA66XX_BC_get_dsp_led_state() function --------------------*//** + * @brief Function returns selected DSP LED state: ON or OFF + * + * @param[in] led_number - DSP LED number definition; + * + * @return DSP LED state: TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_led_state(uint32_t led_number); + + +/*------------ TA66XX_BC_set_dsp_leds() function -------------------------*//** + * @brief Function sets selected DSP LEDs to the desired state: ON or OFF + * + * @param[in] led_bitmask - DSP LEDs (ORed) bitmask; + * @param[in] state - DSP LEDs state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_leds(uint32_t led_bitmask, uint32_t state); + + +/*------------ TA66XX_BC_get_dsp_leds() function -------------------------*//** + * @brief Function returns selected DSP LEDs state: ON or OFF + * + * @param[in] led_bitmask - DSP LEDs (ORed) bitmask; + * + * @return DSP LEDs state + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_leds(uint32_t led_bitmask); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ DSP-to-FPGA GPIO functions ===================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_DSP_FPGA_GPIO TORNADO AMC DSP-to-FPGA GPIO functions + * @{ + */ + +/** DSP-to-FPGA GPIO pins definitions */ +enum TA66XX_BC_DSP_FPGA_GPIO +{ + TA66XX_BC_DSP_FPGA_GPIO0 = 0, /**< DSP-to-FPGA GPIO pin 0 */ + TA66XX_BC_DSP_FPGA_GPIO1, /**< DSP-to-FPGA GPIO pin 1 */ + TA66XX_BC_DSP_FPGA_GPIO2, /**< DSP-to-FPGA GPIO pin 2 */ + TA66XX_BC_DSP_FPGA_GPIO3, /**< DSP-to-FPGA GPIO pin 3 */ + TA66XX_BC_DSP_FPGA_GPIO4, /**< DSP-to-FPGA GPIO pin 4 */ + TA66XX_BC_DSP_FPGA_GPIO5, /**< DSP-to-FPGA GPIO pin 5 */ + TA66XX_BC_DSP_FPGA_GPIO6, /**< DSP-to-FPGA GPIO pin 6 */ + TA66XX_BC_DSP_FPGA_GPIO7 /**< DSP-to-FPGA GPIO pin 7 */ +}; + +/** DSP-to-FPGA GPIO pins bitmask definitions */ +enum TA66XX_BC_DSP_FPGA_GPIO_BITMASKS +{ + TA66XX_BC_DSP_FPGA_GPIO0_BITMASK = 0x0001, /**< DSP-to-FPGA GPIO pin 0 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO1_BITMASK = 0x0002, /**< DSP-to-FPGA GPIO pin 1 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO2_BITMASK = 0x0004, /**< DSP-to-FPGA GPIO pin 2 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO3_BITMASK = 0x0008, /**< DSP-to-FPGA GPIO pin 3 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO4_BITMASK = 0x0010, /**< DSP-to-FPGA GPIO pin 4 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO5_BITMASK = 0x0020, /**< DSP-to-FPGA GPIO pin 5 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO6_BITMASK = 0x0040, /**< DSP-to-FPGA GPIO pin 6 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO7_BITMASK = 0x0080, /**< DSP-to-FPGA GPIO pin 7 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO_BITMASK = 0x00ff /**< DSP-to-FPGA GPIO pins bitmask */ +}; + + +/** DSP-to-FPGA GPIO pins direction definitions */ +#define TA66XX_BC_DSP_FPGA_GPIO_DIR_OUT C66XX_GPIO_DIR_OUT +#define TA66XX_BC_DSP_FPGA_GPIO_DIR_IN C66XX_GPIO_DIR_IN + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_enable() function ----------*//** + * @brief Function enables or disables on-board DSP-to-FPGA GPIO pins + * + * @param[in] state - DSP-to-FPGA GPIO pins enable state: TA66XX_ON or + * TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_enable(uint32_t enable); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_enable_status() function ---*//** + * @brief Function returns enable status of on-board DSP-to-FPGA GPIO pins + * + * @return DSP-to-FPGA GPIO pins enable state: TA66XX_ON or TA66XX_OFF; + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_enable_status(void); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_pin_dir() function ---------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * @param[in] dir - DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_pin_dir(uint32_t pin, uint32_t dir); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_pin_dir() function ---------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * + * @return DSP-to-FPGA GPIO pin direction: IN or OUT + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_pin_dir(uint32_t pin); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_pin_data() function --------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pin to the desired state: ON + * or OFF + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * @param[in] data - DSP-to-FPGA GPIO pin state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_pin_data(uint32_t pin, uint32_t data); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_pin_data() function --------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pin state: ON or OFF + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * + * @return DSP-to-FPGA GPIO pin state: TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_pin_data(uint32_t pin); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_dir() function -------------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pins direction: IN or OUT + * + * @param[in] pin_bitmask - DSP-to-FPGA GPIO pins (ORed) bitmask; + * @param[in] dir - DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_dir(uint32_t pin_bitmask, uint32_t dir); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_dir() function -------------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pins direction: IN or OUT + * + * @param[in] pin - DSP-to-FPGA GPIO pins (ORed) bitmask; + * + * @return DSP-to-FPGA GPIO pins direction: IN or OUT + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_dir(uint32_t pin_bitmask); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_data() function ------------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pins to the desired state: ON + * or OFF + * + * @param[in] pin_bitmask - DSP-to-FPGA GPIO pins (ORed) bitmask; + * @param[in] data - DSP-to-FPGA GPIO pins state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_data(uint32_t pin_bitmask, uint32_t data); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_data() function ------------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pins state: ON or OFF + * + * @param[in] pin - DSP-to-FPGA GPIO pins (ORed) bitmask; + * + * @return DSP-to-FPGA GPIO pins state + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_data(uint32_t pin_bitmask); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ DSP GPIO IRQ functions ========================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_DSP_GPIO_IRQ TORNADO AMC DSP GPIO IRQ mapping functions + * @{ + */ + +/** DSP GPIO pins IRQ source definitions */ +enum TA66XX_BC_DSP_GPIO_IRQ_SEL_SOURCE +{ + TA66XX_BC_DSP_GPIO_IRQ_SEL_OFF = 0, /**< DSP IRQ is disabled */ + TA66XX_BC_DSP_GPIO_IRQ_SEL_MMC_TO_DSP_PD_ALERT, /**< MMC-to-DSP power-down alert is used to generate DSP IRQ */ + TA66XX_BC_DSP_GPIO_IRQ_SEL_MMC_TO_DSP_COMM_RQ, /**< MMC-to-DSP communication request is used to generate DSP IRQ */ + TA66XX_BC_DSP_GPIO_IRQ_SEL_1GE_PHY_IRQ /**< 1GE PHY IRQ is used to generate DSP IRQ */ +}; + +/** DSP GPIO-6 and GPIO-7 pins definitions for TA6678 rev.1B and TA6678/FMC rev.1A boards */ +#define TA66XX_BC_DSP_GPIO6_PIN 6 +#define TA66XX_BC_DSP_GPIO7_PIN 7 +/** DSP GPIO-8 and GPIO-9 pins definitions for TA6678/FMC rev.1B and later boards */ +#define TA66XX_BC_DSP_GPIO8_PIN 8 +#define TA66XX_BC_DSP_GPIO9_PIN 9 + + +/*------------ TA66XX_BC_map_dsp_gpio_interrupt() function ---------------*//** + * @brief Function maps IRQ source to selected DSP GPIO pin + * + * @param[in] gpio_pin - DSP GPIO pin; + * @param[in] irq_src - IRQ source; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_map_dsp_gpio_interrupt(uint32_t gpio_pin, uint32_t irq_src); + + +/*------------ TA66XX_BC_unmap_dsp_gpio_interrupt() function -------------*//** + * @brief Function unmaps IRQ source from selected DSP GPIO pin + * + * @param[in] gpio_pin - DSP GPIO pin; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_unmap_dsp_gpio_interrupt(uint32_t gpio_pin); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ UART functions ================================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_UART TORNADO AMC UART functions + * @{ + */ + +/** DSP UART printf-like string max length */ +#define TA66XX_BC_UART_PRINTF_LEN_MAX 1023 + + +/*------------ TA66XX_BC_init_uart() function ---------------------------*//** + * @brief Function inits the DSP UART peripheral + * + * @param[in] baud_rate - desired baud rate; + * @param[in] data_bits - number of data bits; + * @param[in] parity - parity bit; + * @param[in] stop_bits - number of stop bits; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_init_uart(uint32_t baud_rate, uint32_t data_bits, uint32_t parity, uint32_t stop_bits); + + +/*------------ TA66XX_BC_uart_receiver_is_ready() function ---------------*//** + * @brief Function checks if a character is received over DSP UART + * + * @return 1 - a character is received over DSP UART, + * 0 - otherwise + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_receiver_is_ready() C66XX_UART_receiver_is_ready() + + +/*------------ TA66XX_BC_uart_receive_char() function --------------------*//** + * @brief Function receives a character over DSP UART + * + * @return Received character + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_receive_char() C66XX_UART_receive_char() + + +/*------------ TA66XX_BC_uart_transmit_char() function -------------------*//** + * @brief Function transmits a character over DSP UART + * + * @param[in] c - A character to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_transmit_char(c) C66XX_UART_transmit_char(c) + + +/*------------ TA66XX_BC_uart_transmit_string() function -----------------*//** + * @brief Function transmits a string until '0' charachter + * + * @param[in] s - A pointer to the string to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_transmit_string(s) C66XX_UART_transmit_string(s) + + +/*------------ TA66XX_BC_uart_receive_line_string() function -------------*//** + * @brief Function receives a line ended with CR character, and stores + * received characters into string with '\0' symbol. + * + * @param[in] s - Pointer to a string to store received characters + * + * @return Number of received characters without '\0' symbol. + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_receive_line_string(s) C66XX_UART_receive_line_string(s) + + +/*------------ TA66XX_BC_uart_printf() function --------------------------*//** + * @brief Function prints messages to UART + * + * @param[in] format - format string; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_uart_printf(const char *format, ...); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ EEPROM functions =============================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_EEPROM TORNADO AMC EEPROM memory functions + * @{ + */ + +/*------------ TA66XX_BC_get_eeprom_length() function --------------------*//** + * @brief Function returns on-board EEPROM memory length in bytes + * + * @return On-board EEPROM memory length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_eeprom_length(void); + + +/*------------ TA66XX_BC_write_eeprom() function -------------------------*//** + * @brief Function writes data[len] to EEPROM memory starting at memory + * address addr + * + * @param[in] addr - memory address within the chip; + * @param[in] data - pointer to data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_eeprom(uint32_t addr, uint8_t *data, uint32_t len); + + +/*------------ TA66XX_BC_read_eeprom() function --------------------------*//** + * @brief Function reads data[len] from EEPROM memory starting at memory + * address addr + * + * @param[in] addr - memory address within the chip; + * @param[out] buf - pointer to data buffer to store data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_read_eeprom(uint32_t addr, uint8_t *buf, uint32_t len); + + +/*------------ TA66XX_BC_erase_eeprom() function -------------------------*//** + * @brief Function erases len bytes from EEPROM memory starting at memory + * address addr + * + * @param[in] addr - memory address within the chip; + * @param[in] len - number of bytes to erase; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_erase_eeprom(uint32_t addr, uint32_t len); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Board info functions =========================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_BOARD_INFO TORNADO AMC board info functions + * @{ + */ + + +/** Board info data descriptor IDs */ +#define TA66XX_BC_BOARD_INFO_ID_TA6678_REV1B 1 +#define TA66XX_BC_BOARD_INFO_ID_TA6678FMC_REV1A 2 +#define TA66XX_BC_BOARD_INFO_ID_TA6678FMC_REV1B 3 + + +/** Board temperature data descriptor */ +typedef struct +{ + float temp_pcb, /**< PCB current temperature */ + temp_dsp, /**< DSP current temperature */ + temp_fpga; /**< FPGA current temperature */ + + // TEMP zone classification status + // This var is set according to TA6678_MC_TEMP_ZONE_ID_xxxx defs. + uint32_t temp_zone_id; /**< Temperature zone ID */ + + // 8-bit integer thresholds for MMC TEMP zones + // These thresholds are used to classify summary temparature, which MMC derives + // from PCB, DSP and FPGA temperatures. + char overheated_low_zone_threshold, /**< OVERHEATED low threshold (P/S will be switched OFF at this threshold and upper) */ + hot_low_zone_threshold, /**< HOT low threshold (P/S will be not switched ON at this threshold and upper) */ + warm3_low_zone_threshold, /**< WARM3 low threshold */ + warm2_low_zone_threshold, /**< WARM2 low threshold */ + warm1_low_zone_threshold, /**< WARM1 low threshold */ + normal_low_zone_threshold, /**< NORMAL low threshold */ + cold1_low_zone_threshold, /**< COLD1 low threshold */ + cold2_low_zone_threshold, /**< COLD2 low threshold */ + cold3_low_zone_threshold, /**< COLD3 low threshold (P/S will be not switched ON below this threshold) */ + frosty_low_zone_threshold; /**< FROSTY low threshold (P/S will be switched OFF below this threshold) */ + + // 8-bit integer thresholds for AMC TEMP zones for every on-board temp sensor + char amc_pcb_temp_noncritical_threshold, /**< PCB temperature AMC UPPER NON-CRITICAL ASSERTING EVENT threshold */ + amc_pcb_temp_critical_threshold, /**< PCB temperature AMC UPPER CRITICAL ASSERTING EVENT threshold */ + amc_pcb_temp_nonrecoverable_threshold, /**< PCB temperature AMC UPPER NON-RECOVERABLE ASSERTING EVENT threshold */ + amc_pcb_temp_hysteresis, /**< PCB temperature AMC positive going hysteresis */ + + amc_dsp_temp_noncritical_threshold, /**< DSP temperature AMC UPPER NON-CRITICAL ASSERTING EVENT threshold */ + amc_dsp_temp_critical_threshold, /**< DSP temperature AMC UPPER CRITICAL ASSERTING EVENT threshold */ + amc_dsp_temp_nonrecoverable_threshold, /**< DSP temperature AMC UPPER NON-RECOVERABLE ASSERTING EVENT threshold */ + amc_dsp_temp_hysteresis, /**< DSP temperature AMC positive going hysteresis */ + + amc_fpga_temp_noncritical_threshold, /**< FPGA temperature AMC UPPER NON-CRITICAL ASSERTING EVENT threshold */ + amc_fpga_temp_critical_threshold, /**< FPGA temperature AMC UPPER CRITICAL ASSERTING EVENT threshold */ + amc_fpga_temp_nonrecoverable_threshold, /**< FPGA temperature AMC UPPER NON-RECOVERABLE ASSERTING EVENT threshold */ + amc_fpga_temp_hysteresis; /**< FPGA temperature AMC positive going hysteresis */ + +} TA66XX_BC_TEMP_DATA_DD; +// Board temperature data descriptor length +#define TA66XX_BC_TEMP_DATA_DD_LEN sizeof(TA66XX_BC_TEMP_DATA_DD) + + +/** Board current power data descriptor for TA6678 rev.1B-1 board */ +typedef struct +{ + float v_12v, /**< Input +12V power supply voltage value */ + i_12v, /**< Input +12V power supply current value */ + v_3v3_aux, /**< On-board auxiliary +3.3V power supply voltage value */ + i_3v3_aux, /**< On-board auxiliary +3.3V power supply current value */ + v_mc, /**< Module management power supply voltage value */ + i_mc, /**< Module management power supply current value */ + v_3v3, /**< On-board +3.3V power supply voltage value */ + i_3v3, /**< On-board +3.3V power supply current value */ + v_2v5, /**< On-board +2.5V power supply voltage value */ + i_2v5, /**< On-board +2.5V power supply current value */ + v_1v8, /**< On-board +1.8V power supply voltage value */ + i_1v8, /**< On-board +1.8V power supply current value */ + v_1v5, /**< On-board +1.5V power supply voltage value */ + i_1v5, /**< On-board +1.5V power supply current value */ + v_1v0, /**< On-board +1.0V power supply voltage value */ + i_1v0, /**< On-board +1.0V power supply current value */ + v_ddr_vtt, /**< On-board DDR3 VTT power supply voltage value */ + v_dsp_vcore, /**< On-board DSP core power supply voltage value */ + i_dsp_vcore, /**< On-board DSP core power supply current value */ + v_fpga_vcore, /**< On-board FPGA core power supply voltage value */ + i_fpga_vcore, /**< On-board FPGA core power supply current value */ + v_fpga_mgtavcc, /**< On-board FPGA MGTAVCC power supply voltage value */ + v_fpga_mgtavtt; /**< On-board FPGA MGTAVTT power supply voltage value */ + +} TA6678_REV1B_BC_POWER_DATA_DD; +// Board current power data descriptor for TA6678 rev.1B-1 board length +#define TA6678_REV1B_BC_POWER_DATA_DD_LEN sizeof(TA6678_REV1B_BC_POWER_DATA_DD) + + +/** Board current power data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + float power_12v, /**< Input +12V power supply value */ + power_fpga_core, /**< On-board FPGA core power supply value */ + power_dsp_core, /**< On-board DSP core power supply value */ + v_12v, /**< Input +12V power supply voltage value */ + i_12v, /**< Input +12V power supply current value */ + i_fpga_core, /**< On-board FPGA core power supply current value */ + i_dsp_core; /**< On-board DSP core power supply current value */ + +} TA66XX_BC_PRIMARY_POWER_DATA_DD; +// Board current power data descriptor length +#define TA66XX_BC_PRIMARY_POWER_DATA_DD_LEN sizeof(TA66XX_BC_PRIMARY_POWER_DATA_DD) + + +/** Board current power data union */ +typedef union +{ + TA6678_REV1B_BC_POWER_DATA_DD ta6678_rev1b_dd; + TA66XX_BC_PRIMARY_POWER_DATA_DD primary_power_dd; +} POWER_DATA_DD; + + +/** Board current power data descriptor */ +typedef struct +{ + unsigned id; // ID to decode the UNION structure type + POWER_DATA_DD power_data_dd; + +} TA66XX_BC_POWER_DATA_DD; +// Board current power data descriptor length +#define TA66XX_BC_POWER_DATA_DD_LEN sizeof(TA66XX_BC_POWER_DATA_DD) + + +/** FMC interface power data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + float power_fmc_12v, /**< FMC I/F +12V power supply value */ + power_fmc_3v3, /**< FMC I/F +3.3V power supply value */ + power_fmc_vadj, /**< FMC I/F Vadj power supply value */ + v_fmc_12v, /**< FMC I/F +12V power supply voltage value */ + i_fmc_12v, /**< FMC I/F +12V power supply current value */ + v_fmc_3v3, /**< FMC I/F +3.3V power supply voltage value */ + i_fmc_3v3, /**< FMC I/F +3.3V power supply current value */ + v_fmc_vadj, /**< FMC I/F Vadj power supply voltage value */ + i_fmc_vadj, /**< FMC I/F Vadj power supply current value */ + v_fmc_vio_b_m2c, /**< FMC I/F VIO_B_M2C power supply voltage value */ + v_fmc_vref_a_m2c, /**< FMC I/F VREF_A_M2C power supply voltage value */ + v_fmc_vref_b_m2c; /**< FMC I/F VREF_B_M2C power supply voltage value */ + +} TA66XX_BC_FMC_POWER_DATA_DD; +// FMC interface power data descriptor length +#define TA66XX_BC_FMC_POWER_DATA_DD_LEN sizeof(TA66XX_BC_FMC_POWER_DATA_DD) + + +/** Max string length in device info structure */ +#define TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX 32 +#define TA66XX_BC_DEVICE_PN_STRING_LEN_MAX 64 +#define TA66XX_BC_DEVICE_HW_REVISION_STRING_LEN_MAX 16 + + +/** Board info data descriptor for TA6678 rev.1B-1 board */ +typedef struct +{ + uint32_t op_mode; /**< Operation mode: '0' - stand-alone mode, '1' - AMC host mode */ + uint32_t amc_slot_id; /**< AMC slot ID (in case AMC host mode is used) */ + uint8_t manufacturing_date_day_of_month; /**< Manufacturing day: 1..31 */ + uint8_t manufacturing_date_month; /**< Manufacturing month: 1..12 ('1' - January) */ + uint16_t manufacturing_date_year; /**< Manufacturing year: 2015.. */ + char device_sn[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Device serial number */ + char mmc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC firmware revision string */ + char tammc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< TAMMC firmware revision string */ + char mmc_core_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC core firmware revision string */ +} TA6678_REV1B_BC_DEVICE_INFO_DATA_DD; +// Board info data descriptor for TA6678 rev.1B-1 board length +#define TA6678_REV1B_BC_DEVICE_INFO_DATA_DD_LEN sizeof(TA6678_REV1B_BC_DEVICE_INFO_DATA_DD) + + +/** Board info data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + uint32_t op_mode; /**< Operation mode: '0' - stand-alone mode, '1' - AMC host mode */ + uint32_t amc_slot_id; /**< AMC slot ID (in case AMC host mode is used) */ + uint8_t manufacturing_date_day_of_month; /**< Manufacturing day: 1..31 */ + uint8_t manufacturing_date_month; /**< Manufacturing month: 1..12 ('1' - January) */ + uint16_t manufacturing_date_year; /**< Manufacturing year: 2015.. */ + char manufacturer_name[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Manufacturer name */ + char device_name[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Device name */ + char device_pn[TA66XX_BC_DEVICE_PN_STRING_LEN_MAX]; /**< Device part number */ + char device_sn[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Device serial number */ + char device_hw_revision[TA66XX_BC_DEVICE_HW_REVISION_STRING_LEN_MAX]; /**< Device H/W revision */ + char mmc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC firmware revision string */ + char tammc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< TAMMC firmware revision string */ + char mmc_core_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC core firmware revision string */ +} TA66XX_BC_FULL_DEVICE_INFO_DATA_DD; +// Board info data descriptor length +#define TA66XX_BC_FULL_DEVICE_INFO_DATA_DD_LEN sizeof(TA66XX_BC_FULL_DEVICE_INFO_DATA_DD) + + +/** Board current power data union */ +typedef union +{ + TA6678_REV1B_BC_DEVICE_INFO_DATA_DD ta6678_rev1b_dd; + TA66XX_BC_FULL_DEVICE_INFO_DATA_DD ta66xx_full_device_info_dd; +} DEVICE_INFO_DATA_DD; + + +/** Board current power data descriptor */ +typedef struct +{ + uint32_t id; // ID to decode the UNION structure type + DEVICE_INFO_DATA_DD device_info_data_dd; + +} TA66XX_BC_DEVICE_INFO_DATA_DD; +// Board current power data descriptor length +#define TA66XX_BC_DEVICE_INFO_DATA_DD_LEN sizeof(TA66XX_BC_DEVICE_INFO_DATA_DD) + + +/** Hardware configuration info data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + uint32_t fpga_ddr0_len; /**< FPGA DDR memory bank #0 length in MB: 0 - not installed */ + uint32_t fpga_ddr1_len; /**< FPGA DDR memory bank #1 length in MB: 0 - not installed */ + uint32_t cpu_ddr_len; /**< CPU DDR memory length in MB: 0 - not installed */ + uint32_t flash_len; /**< FLASH memory length in MB: 0 - not installed */ + uint32_t mram_len; /**< MRAM memory length in KB: 0 - not installed */ + uint32_t i2c_eeprom_len; /**< I2C EEPROM memory length in KB: 0 - not installed */ + uint32_t cpu_clk_freq_id; /**< CPU input clock frequency in MHz: 0 - not available */ + uint32_t x1ge0_phy_installed_id; /**< External 1GE PHY #0 installed ID: 0 - not installed */ + uint32_t x1ge1_phy_installed_id; /**< External 1GE PHY #1 installed ID: 0 - not installed */ + uint32_t sfp0_if_installed_id; /**< SFP interface #0 installed ID: 0 - not installed */ + uint32_t sfp1_if_installed_id; /**< SFP interface #1 installed ID: 0 - not installed */ + uint32_t qsfp_if_installed_id; /**< QSFP interface installed ID: 0 - not installed */ + uint32_t fmc_if_installed_id; /**< FMC interface installed ID: 0 - not installed */ + uint32_t sd_slot_installed_id; /**< uSD slot installed ID: 0 - not installed */ +} TA66XX_BC_HW_CFG_INFO_DATA_DD; +// Hardware configuration info data descriptor length +#define TA66XX_BC_HW_CFG_INFO_DATA_DD_LEN sizeof(TA66XX_BC_HW_CFG_INFO_DATA_DD) + + +/** Max string length in FMC info structure */ +#define TA66XX_BC_FMC_STATUS_STRING_LEN_MAX 48 +#define TA66XX_BC_FMC_INFO_STRING_LEN_MAX 64 +#define TA66XX_BC_MANUFACTURING_TIME_STRING_LEN_MAX 32 + + +/** FMC info data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + char fmc_status_text[TA66XX_BC_FMC_STATUS_STRING_LEN_MAX]; /**< FMC status */ + char manufacturer_name[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Manufacturer name */ + char device_name[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device name */ + char device_pn[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device part number */ + char device_sn[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device serial number */ + char device_version[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device version */ + char manufacturing_time[TA66XX_BC_MANUFACTURING_TIME_STRING_LEN_MAX]; /**< Manufacturing time */ +} TA66XX_BC_FMC_INFO_DATA_DD; +// FMC info data descriptor length +#define TA66XX_BC_FMC_INFO_DATA_DD_LEN sizeof(TA66XX_BC_FMC_INFO_DATA_DD) + + + +/*------------ TA66XX_BC_get_device_info() function ----------------------*//** + * @brief Function returns AMC module device info: operation mode, serial + * number, manufacturing date, firmware revisions + * + * @param[out] info_dd - pointer to a buffer that receives device info data + * descriptor in case function is completed without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_device_info(TA66XX_BC_DEVICE_INFO_DATA_DD *info_dd); + + +/*------------ TA66XX_BC_get_hw_cfg_info() function ----------------------*//** + * @brief Function returns AMC module hardware configuration info: installed + * memories, interfaces, etc. + * + * @param[out] info_dd - pointer to a buffer that receives hardware + * configuration data descriptor in case function is completed + * without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_hw_cfg_info(TA66XX_BC_HW_CFG_INFO_DATA_DD *info_dd); + + +/*------------ TA66XX_BC_get_fmc_info() function -------------------------*//** + * @brief Function returns FMC module device info: installed status, device + * name, serial number, manufacturing date, firmware revisions, etc. + * + * @param[out] info_dd - pointer to a buffer that receives FMC info data + * descriptor in case function is completed without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fmc_info(TA66XX_BC_FMC_INFO_DATA_DD *info_dd); + + +/*------------ TA66XX_BC_get_temp_state() function -----------------------*//** + * @brief Function returns AMC module temperature monitor current info + * + * @param[out] temp_data_dd - pointer to a buffer that receives board + * temperature data descriptor in case function is completed + * without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_temp_state(TA66XX_BC_TEMP_DATA_DD *temp_data_dd); + + +/*------------ TA66XX_BC_get_power_state() function ----------------------*//** + * @brief Function returns AMC module power monitor current info + * + * @param[out] power_data_dd - pointer to a buffer that receives board power + * data descriptor in case function is completed without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_power_state(TA66XX_BC_POWER_DATA_DD *power_data_dd); + + +/*------------ TA66XX_BC_get_fmc_power_state() function ------------------*//** + * @brief Function returns FMC module power monitor current info + * + * @param[out] fmc_power_data_dd - pointer to a buffer that receives FMC + * module power data descriptor in case function is completed + * without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fmc_power_state(TA66XX_BC_FMC_POWER_DATA_DD *fmc_power_data_dd); + + +/*------------ TA66XX_BC_set_mmc_to_dsp_rq() function --------------------*//** + * @brief Function sets MMC-to-DSP request from DSP (for test purposes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_mmc_to_dsp_rq(void); + + +/*------------ TA66XX_BC_set_mmc_power_down_notification() function ------*//** + * @brief Function sets MMC-to-DSP power down notification from DSP + * (for test purposes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_mmc_power_down_notification(void); + + +/*------------ TA66XX_BC_get_sfp_info() function -------------------------*//** + * @brief Function returns identification info about installed SFP + * transceiver: 256-byte array read from address 0x50 (identification info + * according to SFF-8472) and 256-byte array read from address 0x51 (digital + * diagnostic monitoring interface (DDMI) data) + * + * @param[out] id_data - pointer to a buffer that receives 256-byte array read + * from address 0x50 (identification info according to SFF-8472). + * In case pointer is NULL, then no data are filled in; + * @param[out] ddmi_data - pointer to a buffer that receives 256-byte array + * read from address 0x51 (DDMI data). In case pointer is NULL, + * then no data are filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_sfp_info(uint8_t *id_data, uint8_t *ddmi_data); + + +/** @}*/ + +//============================================================================= + + + +//============================================================================= +//============ FPGA functions ================================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_FPGA TORNADO AMC FPGA functions + * @{ + */ + +/** FPGA host interface (HIF) configuration data descriptor */ +typedef struct +{ + uint32_t w_setup; /**< Write strobe setup EMIF-16 cycles */ + uint32_t w_strobe; /**< Write strobe duration EMIF-16 cycles */ + uint32_t w_hold; /**< Write strobe hold EMIF-16 cycles */ + uint32_t r_setup; /**< Read strobe setup EMIF-16 cycles */ + uint32_t r_strobe; /**< Read strobe duration EMIF-16 cycles */ + uint32_t r_hold; /**< Read strobe hold EMIF-16 cycles */ + uint32_t turn_around; /**< Turn around EMIF-16 cycles */ +} TA66XX_BC_FPGA_HIF_CNF_DD; +// FPGA HIF configuration data descriptor length in bytes +#define TA66XX_BC_FPGA_HIF_CNF_DD_LEN sizeof(TA66XX_BC_FPGA_HIF_CNF_DD) + + +/*------------ TA66XX_BC_set_fpga_hif_cnf() function ---------------------*//** + * @brief Function sets new configuration to FPGA host interface according to + * supplied parameters + * + * @param[in] cfg_dd - pointer to new FPGA HIF configuration data descriptor; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_fpga_hif_cnf(TA66XX_BC_FPGA_HIF_CNF_DD *cfg_dd); + + +/*------------ TA66XX_BC_get_fpga_hif_cnf() function ---------------------*//** + * @brief Function returns current configuration of FPGA host interface + * + * @param[in] cfg_dd - pointer to buffer to receive current FPGA HIF + * configuration data descriptor; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fpga_hif_cnf(TA66XX_BC_FPGA_HIF_CNF_DD *cfg_dd); + + +/*------------ TA66XX_BC_get_fpga_hif_base_addr() function ---------------*//** + * @brief Function returns FPGA host interface base address + * + * @return FPGA host interface base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_fpga_hif_base_addr(void); + + +/*------------ TA66XX_BC_get_fpga_hif_length() function ------------------*//** + * @brief Function returns FPGA host interface length in bytes + * + * @return FPGA host interface length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_fpga_hif_length(void); + + +/*------------ TA66XX_BC_set_fpga_hif_reset() function -------------------*//** + * @brief Function sets or releases FPGA host interface reset + * + * @param[in] state - FPGA host interface reset state: ON or OFF + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_fpga_hif_reset(uint32_t state); + + +/*------------ TA66XX_BC_get_fpga_hif_reset_state() function -------------*//** + * @brief Function returns FPGA host interface reset state + * + * @return FPGA host interface reset state: ON or OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_fpga_hif_reset_state(void); + + +/*------------ TA66XX_BC_read_fpga_hif_byte() function -------------------*//** + * @brief Function reads a byte from FPGA host interface at address addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A byte read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint8_t TA66XX_BC_read_fpga_hif_byte(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_byte() function ------------------*//** + * @brief Function writes a byte to FPGA host interface at address addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A byte to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_byte(uint32_t addr, uint8_t v); + + +/*------------ TA66XX_BC_read_fpga_hif_w16() function --------------------*//** + * @brief Function reads a 16-bit word from FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A 16-bit word read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint16_t TA66XX_BC_read_fpga_hif_w16(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_w16() function -------------------*//** + * @brief Function writes a 16-bit word to FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A 16-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_w16(uint32_t addr, uint16_t v); + + +/*------------ TA66XX_BC_read_fpga_hif_w32() function --------------------*//** + * @brief Function reads a 32-bit word from FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A 32-bit word read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_read_fpga_hif_w32(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_w32() function -------------------*//** + * @brief Function writes a 32-bit word to FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A 32-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_w32(uint32_t addr, uint32_t v); + + +/*------------ TA66XX_BC_read_fpga_hif_w64() function --------------------*//** + * @brief Function reads a 64-bit word from FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A 64-bit word read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint64_t TA66XX_BC_read_fpga_hif_w64(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_w64() function -------------------*//** + * @brief Function writes a 64-bit word to FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A 64-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_w64(uint32_t addr, uint64_t v); + + +/*------------ TA66XX_BC_clear_fpga_cnf() function -----------------------*//** + * @brief Function clears FPGA configuration memory + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_clear_fpga_cnf(void); + + +/*------------ TA66XX_BC_load_fpga_cnf() function ------------------------*//** + * @brief Function loads FPGA firmware file using the supported configuration + * interfaces (serial or parallel) + * + * @param[in] addr - address where FPGA firmware file data were saved; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_load_fpga_cnf(uint32_t addr); + + +/*------------ TA66XX_BC_get_fpga_cnf_status() function ------------------*//** + * @brief Function returns FPGA configuration memory status: either + * loaded by FPGA firmware file or not + * + * @return TA66XX_OK - FPGA configuration memory is loaded, + * TA66XX_FPGA_CNF_LOAD_ERR - FPGA configuration memory is cleared. + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fpga_cnf_status(void); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ FLASH functions ================================================ +//============================================================================= + +/** @addtogroup TA66XX_BC_FLASH TORNADO AMC FLASH API functions + * @{ + */ + + +/** FLASH memory sector is protected for write/erase operations */ +#define TA66XX_BC_FLASH_SECTOR_PROTECTED 1 +/** FLASH memory sector is unprotected for write/erase operations */ +#define TA66XX_BC_FLASH_SECTOR_UNPROTECTED 0 + + +/*------------ TA66XX_BC_get_flash_area_base_addr() function -------------*//** + * @brief Function returns FLASH area base address + * + * @return FLASH area base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_area_base_addr(void); + + +/*------------ TA66XX_BC_get_flash_length() function ---------------------*//** + * @brief Function returns on-board FLASH memory length in bytes + * + * @return On-board FLASH memory length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_length(void); + + +/*------------ TA66XX_BC_get_flash_hw_wp_enable_status() function --------*//** + * @brief Function returns enable status of on-board FLASH memory hardware + * (via on-board switch) write-protection + * + * @return On-board FLASH memory hardware write-protection enable state: + * TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_hw_wp_enable_status(void); + + +/*------------ TA66XX_BC_get_flash_sw_wp_enable_status() function --------*//** + * @brief Function returns enable status of on-board FLASH memory software + * write-protection + * + * @return On-board FLASH memory software write-protection enable state: + * TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_sw_wp_enable_status(void); + + +/*------------ TA66XX_BC_set_flash_sw_wp_enable() function ---------------*//** + * @brief Function enables or disables on-board FLASH memory software + * write-protection + * + * @param[in] enable - on-board FLASH memory software write-protection enable + * state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_flash_sw_wp_enable(uint32_t enable); + + +/*------------ TA66XX_BC_erase_flash() function --------------------------*//** + * @brief Function erases FLASH block, which starts from address a + * and of size len (in bytes) + * + * @param[in] addr - Block start address (in bytes) + * @param[in] len - block length (in bytes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_erase_flash(uint32_t addr, uint32_t len); + + +/** Flag to disable FLASH memory erasing before write operation */ +#define TA66XX_BC_FLASH_ERASE_IS_DISABLED 0 +/** Flag to enable FLASH memory erasing before write operation */ +#define TA66XX_BC_FLASH_ERASE_IS_ENABLED 1 + + +/*------------ TA66XX_BC_write_flash() function --------------------------*//** + * @brief Function writes data block of size len to FLASH address a + * The function erases FLASH before writing data to FLASH if erase input + * parameter is set. + * + * @param[in] a - FLASH address (in bytes) + * @param[in] ptr - data block to write + * @param[in] len - data block length (in bytes) + * @param[in] erase - flag to enable FLASH erasing before write operation + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash(uint32_t a, void *ptr, uint32_t len, uint32_t erase); + + +/*------------ TA66XX_BC_write_flash_byte() function ---------------------*//** + * @brief Function writes data byte d to FLASH address a + * + * @param[in] a - FLASH address (in bytes) + * @param[in] d - data byte to write + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash_byte(uint32_t addr, uint8_t d); + + +/*------------ TA66XX_BC_write_flash_w16() function ----------------------*//** + * @brief Function writes 16-bit data word d to FLASH address a + * + * @param[in] addr - FLASH address (in bytes) + * @param[in] d - 16-bit data word to write + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash_w16(uint32_t addr, uint16_t d); + + +/*------------ TA66XX_BC_write_flash_w32() function ----------------------*//** + * @brief Function writes 32-bit data word d to FLASH address a + * + * @param[in] addr - FLASH address (in bytes) + * @param[in] d - 32-bit data word to write + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash_w32(uint32_t addr, uint32_t d); + + +/*------------ TA66XX_BC_read_flash() function ---------------------------*//** + * @brief Function reads data block of size len from FLASH address a + * + * @param[in] addr - FLASH address (in bytes) + * @param[in] ptr - pointer to data buffer to store data block + * @param[in] len - data block length (in bytes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_read_flash(uint32_t addr, void *ptr, uint32_t len); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ MRAM functions ================================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_MRAM TORNADO AMC MRAM API functions + * @{ + */ + + +/*------------ TA66XX_BC_get_mram_area_base_addr() function --------------*//** + * @brief Function returns MRAM area base address + * + * @return MRAM area base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_mram_area_base_addr(void); + + +/*------------ TA66XX_BC_get_mram_length() function ----------------------*//** + * @brief Function returns on-board MRAM memory length in bytes + * + * @return On-board MRAM memory length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_mram_length(void); + + +/*------------ TA66XX_BC_get_mram_sw_wp_enable_status() function ---------*//** + * @brief Function returns enable status of on-board MRAM memory software + * write-protection + * + * @return On-board MRAM memory software write-protection enable state: + * TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_mram_sw_wp_enable_status(void); + + +/*------------ TA66XX_BC_set_mram_sw_wp_enable() function ----------------*//** + * @brief Function enables or disables on-board MRAM memory software + * write-protection + * + * @param[in] enable - on-board MRAM memory software write-protection enable + * state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_mram_sw_wp_enable(uint32_t enable); + + +/*------------ TA66XX_BC_read_mram_byte() function -----------------------*//** + * @brief Function reads a byte from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A byte read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint8_t TA66XX_BC_read_mram_byte(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_byte() function ----------------------*//** + * @brief Function writes a byte to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A byte to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_byte(uint32_t addr, uint8_t v); + + +/*------------ TA66XX_BC_read_mram_w16() function ------------------------*//** + * @brief Function reads a 16-bit word from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A 16-bit word read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint16_t TA66XX_BC_read_mram_w16(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_w16() function -----------------------*//** + * @brief Function writes a 16-bit word to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A 16-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_w16(uint32_t addr, uint16_t v); + + +/*------------ TA66XX_BC_read_mram_w32() function ------------------------*//** + * @brief Function reads a 32-bit word from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A 32-bit word read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_read_mram_w32(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_w32() function -----------------------*//** + * @brief Function writes a 32-bit word to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A 32-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_w32(uint32_t addr, uint32_t v); + + +/*------------ TA66XX_BC_read_mram_w64() function ------------------------*//** + * @brief Function reads a 64-bit word from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A 64-bit word read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint64_t TA66XX_BC_read_mram_w64(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_w64() function -----------------------*//** + * @brief Function writes a 64-bit word to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A 64-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_w64(uint32_t addr, uint64_t v); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Gigabit Ethernet (GbE) Switch functions ======================== +//============================================================================= + +/** @addtogroup TA66XX_BC_GBE TORNADO AMC Gigabit Ethernet Switch functions + * @{ + */ + +/** Gigabit Ethernet ports count available at the board */ +#define TA66XX_BC_GBE_PORT_COUNT 2 + +/** DSP SGMII port number which is routed to AMC connector */ +#define TA66XX_BC_GBE_PORT_AMC_PORT_NUMBER 0 +/** Alias for DSP SGMII port-0 number */ +#define TA66XX_BC_GBE_PORT_AMC0_PORT_NUMBER TA66XX_BC_GBE_PORT_AMC_PORT_NUMBER +/** DSP SGMII port number which is routed to external PHY */ +#define TA66XX_BC_GBE_PORT_X1GE_PORT_NUMBER 1 +/** Alias for DSP SGMII port-1 number */ +#define TA66XX_BC_GBE_PORT_AMC1_PORT_NUMBER TA66XX_BC_GBE_PORT_X1GE_PORT_NUMBER + + +/** Gigabit Ethernet port type */ +typedef enum +{ + TA66XX_BC_GBE_PORT_TYPE_NONE = 0, /**< Gigabit Ethernet port is not used */ + TA66XX_BC_GBE_PORT_TYPE_PHY, /**< Gigabit Ethernet port is connected to on-board PHY */ + TA66XX_BC_GBE_PORT_TYPE_AMC, /**< Gigabit Ethernet port is connected to the backplane AMC chassis */ + TA66XX_BC_GBE_PORT_TYPE_MAX /**< End of port type */ +} TA66XX_BC_GBE_PORT_TYPE; + + +/** Gigabit Ethernet port link status */ +typedef enum +{ + TA66XX_BC_GBE_PORT_LINK_STATUS_DOWN = 0, /**< Gigabit Ethernet port link is down */ + TA66XX_BC_GBE_PORT_LINK_STATUS_UP, /**< Gigabit Ethernet port link is up */ + TA66XX_BC_GBE_PORT_LINK_STATUS_MAX /**< End of link status */ +} TA66XX_BC_GBE_PORT_LINK_STATUS; + + +/** T-AMC Gigabit Ethernet port data descriptor */ +typedef struct +{ + uint32_t number; /**< Port number */ + TA66XX_BC_GBE_PORT_TYPE type; /**< Gigabit Ethernet port type */ + TA66XX_BC_GBE_PORT_LINK_STATUS link_status; /**< Gigabit Ethernet port link status */ + uint8_t mac_address[6]; /**< MAC (physical) address of the port */ +} TA66XX_BC_GBE_PORT_DD; +// T-AMC Gigabit Ethernet port data descriptor length in bytes +#define TA66XX_BC_GBE_PORT_DD_LEN sizeof(TA66XX_BC_GBE_PORT_DD) + + +/** IP address string max size in bytes*/ +#define TA66XX_BC_IP_ADDRESS_LEN_MAX 16 +/** Host name max size in bytes*/ +#define TA66XX_BC_HOSTNAME_LEN_MAX 256 + + +/** Static IP configuration */ +#define TA66XX_BC_IP_CFG_TYPE_STATIC 0 +/** Dynamic (DHCP) IP configuration */ +#define TA66XX_BC_IP_CFG_TYPE_DYNAMIC 1 + + +/*------------ TA66XX_BC_init_gbe_port() function ------------------------*//** + * @brief Function initializes selected DSP Gigabit Ethernet port + * + * @param[in] port - DSP Gigabit Ethernet port number + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_init_gbe_port(uint32_t port); + + +/*------------ TA66XX_BC_get_gbe_port_info() function --------------------*//** + * @brief Function returns Gigabit Ethernet port info: port mode, MAC address, + * link status + * + * @param[in] port - Gigabit Ethernet port number for which port info should + * be returned + * @param[out] port_dd - pointer to a buffer to which Gigabit Ethernet port + * data descriptor should be returned + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_gbe_port_info(uint32_t port, TA66XX_BC_GBE_PORT_DD *port_dd); + + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __TA66XX_BC_DSP_BC_FUNCTIONS_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/TA66XX_OSAL.h b/ports/c667x/ccs/example_build/include/TA66XX_OSAL.h new file mode 100644 index 00000000..d61af0e9 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_OSAL.h @@ -0,0 +1,649 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 3A. + TI SYS/BIOS RTOS abstraction layer for TORNADO AMC embedded controllers. + (C) MicroLAB Systems, 2014-2015 + + + File: This file contains TI SYS/BIOS RTOS abstraction layer definitions + ----- for TORNADO AMC embedded controllers, which is used for various + low-level drivers (LLD) and libraries that the application use. + + + Revision history: + ----------------- + rev.1A - 2014, initial release for TORNADO-A6678 board + rev.2A - 2015, totally redesigned SDK; + rev.3A - 2016, added support for TORNADO-A6678/FMC board rev.1A; + +******************************************************************************/ + + +/** + * @file TA66XX_OSAL.h + * + * @brief RTOS abstraction layer definitions + * + * This file contains TI SYS/BIOS RTOS abstraction layer (OSAL) definitions for + * TORNADO AMC embedded controllers, which is used for various + * low-level drivers (LLD) and libraries that the application use. + * + */ + + +#ifndef __TA66XX_OSAL_H__ // check for this file has been already included +#define __TA66XX_OSAL_H__ 1 + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +//============================================================================= +//------------ Definitions ---------------------------------------------------- +//============================================================================= +/** @addtogroup TA66XX_OSAL_GENERAL OS abstraction layer (OSAL) general definitions + * @{ + */ + +// Hardware semaphore defs +#define TA66XX_OSAL_CPPI_HW_SEM 1 /**< CPPI LLD hardware semaphore */ +#define TA66XX_OSAL_QMSS_HW_SEM 2 /**< QMSS LLD hardware semaphore */ +#define TA66XX_OSAL_SRIO_HW_SEM 3 /**< SRIO LLD hardware semaphore */ +#define TA66XX_OSAL_SPI_HW_SEM 4 /**< SPI driver hardware semaphore */ + +/** Macro to define high-priority QMSS queue for accumulator (depends on DSP event ID and core number) */ +#define TA66XX_OSAL_set_qmss_queue_acc(eventid, core) (704 + (eventid - 48) * 8 + core) + +// Interrupts and event IDs used by NIMU library (DSP core 0 is assumed to be used) +#define TA66XX_OSAL_ETHERNET_AMC_EVENTID 48 /**< Ethernet AMC port event - used by NIMU library */ +#define TA66XX_OSAL_ETHERNET_AMC_INTERRUPT 7 /**< Ethernet AMC port interrupt - used by NIMU library */ +/** QMSS queue for AMC Ethernet port accumulator (depends on TA66XX_OSAL_ETHERNET_AMC_EVENTID) */ +#define TA66XX_OSAL_ETHERNET_AMC_QMSS_QUEUE_ACC TA66XX_OSAL_set_qmss_queue_acc(TA66XX_OSAL_ETHERNET_AMC_EVENTID, 0) +#define TA66XX_OSAL_ETHERNET_PHY_EVENTID 49 /**< Ethernet PHY port event - used by NIMU library */ +#define TA66XX_OSAL_ETHERNET_PHY_INTERRUPT 8 /**< Ethernet PHY port interrupt - used by NIMU library */ +/** QMSS queue for PHY Ethernet port accumulator (depends on TA66XX_OSAL_ETHERNET_PHY_EVENTID) */ +#define TA66XX_OSAL_ETHERNET_PHY_QMSS_QUEUE_ACC TA66XX_OSAL_set_qmss_queue_acc(TA66XX_OSAL_ETHERNET_PHY_EVENTID, 0) + +// Interrupts and event IDs used by SRIO (DSP core 0 is assumed to be used) +#define TA66XX_OSAL_SRIO_MESSAGES_EVENTID 50 /**< SRIO event ID used by messages (Type 9 and Type 11) */ +#define TA66XX_OSAL_SRIO_INTERRUPT 9 /**< SRIO interrupt */ +/** QMSS queue for SRIO accumulator (depends on TA66XX_OSAL_SRIO_MESSAGES_EVENTID) */ +#define TA66XX_OSAL_SRIO_QMSS_QUEUE_ACC TA66XX_OSAL_set_qmss_queue_acc(TA66XX_OSAL_SRIO_MESSAGES_EVENTID, 0) +#define TA66XX_OSAL_SRIO_DIO_EVENTID 20 /**< SRIO event ID used by DirectIO (INTDST(n + 16), n - core number) */ +/** @}*/ +//============================================================================= + + + +//============================================================================= +//------------ Global variables ----------------------------------------------- +//============================================================================= +extern uint32_t qmssMallocCounter; +extern uint32_t qmssFreeCounter; +extern uint32_t cppiMallocCounter; +extern uint32_t cppiFreeCounter; +extern uint32_t srioMallocCounter; +extern uint32_t srioFreeCounter; +extern uint32_t srioDataBufferMallocCounter; +extern uint32_t srioDataBufferFreeCounter; +//============================================================================= + + + +//============================================================================= +//============ T-AMC controllers OSAL functions declarations ================== +//============================================================================= +/** @addtogroup TA66XX_OSAL_FUNCTIONS TORNADO AMC OSAL functions + * @{ + */ + + +//============================================================================= +//============ QMSS LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_qmssBeginMemAccess() function ------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssBeginMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_qmssEndMemAccess() function --------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssEndMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_qmssMalloc() function --------------------------------*//** + * @brief Function implements the memory allocation library function + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_qmssMalloc(uint32_t num_bytes); + + +/*------------ Osal_qmssFree() function ----------------------------------*//** + * @brief Function implements the memory free library function + * + * This function frees up memory allocated using Osal_qmssMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssFree(Ptr dataPtr, uint32_t num_bytes); + + +/*------------ Osal_qmssCsEnter() function -------------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_qmssCsEnter(void); + + +/*------------ Osal_qmssCsExit() function --------------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_qmssCsEnter() API. + * + * @param[in] CsHandle - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssCsExit(void *CsHandle); + +//============================================================================= + + + +//============================================================================= +//============ CPPI LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_cppiBeginMemAccess() function ------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiBeginMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_cppiEndMemAccess() function --------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiEndMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_cppiMalloc() function --------------------------------*//** + * @brief Function implements the memory allocation library function + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_cppiMalloc(uint32_t num_bytes); + + +/*------------ Osal_cppiFree() function ----------------------------------*//** + * @brief Function implements the memory free library function + * + * This function frees up memory allocated using Osal_cppiMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiFree(Ptr dataPtr, uint32_t num_bytes); + + +/*------------ Osal_cppiCsEnter() function -------------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_cppiCsEnter(void); + + +/*------------ Osal_cppiCsExit() function --------------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_cppiCsEnter() API. + * + * @param[in] CsHandle - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiCsExit(void *CsHandle); + +//============================================================================= + + +#ifdef __TA66XX_FUNCTIONS_INCLUDE_SRIO__ + + +//============================================================================= +//============ SRIO LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_srioBeginMemAccess() function ------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioBeginMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_srioEndMemAccess() function --------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioEndMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_srioBeginDescriptorAccess() function -----------------*//** + * @brief Function is invoked by the SRIO LLD to indicate that a descriptor is + * being accessed. + * + * @param[in] drvHandle - driver instance for which descriptor is being + * accessed + * @param[in] ptr - pointer to the descriptor being accessed + * @param[in] descSize - size of the descriptor (valid only for driver managed + * configuration) + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioBeginDescriptorAccess(Srio_DrvHandle drvHandle, void *ptr, uint32_t descSize); + + +/*------------ Osal_srioEndDescriptorAccess() function -------------------*//** + * @brief Function is invoked by the SRIO LLD to indicate that a descriptor is + * finished being accessed. + * + * @param[in] drvHandle - driver instance for which descriptor is being + * accessed + * @param[in] ptr - pointer to the descriptor being accessed + * @param[in] descSize - size of the descriptor (valid only for driver managed + * configuration) + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioEndDescriptorAccess(Srio_DrvHandle drvHandle, void *ptr, uint32_t descSize); + + +/*------------ Osal_srioMalloc() function --------------------------------*//** + * @brief Function implements the memory allocation library function + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_srioMalloc(uint32_t num_bytes); + + +/*------------ Osal_srioFree() function ----------------------------------*//** + * @brief Function implements the memory free library function + * + * This function frees up memory allocated using Osal_srioMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioFree(Ptr dataPtr, uint32_t num_bytes); + + +/*------------ Osal_dataBufferInitMemory() function ----------------------*//** + * @brief Function is used to allocate a block of memory for all the data + * buffer operations. This function is called by the application. + * + * @param[in] dataBufferSize - size of each data buffer + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t Osal_dataBufferInitMemory(uint32_t dataBufferSize); + + +/*------------ Osal_srioDataBufferMalloc() function ----------------------*//** + * @brief Function is used to allocate a data buffer of the specified size. + * Data buffers should always be allocated from the global address space. + * + * @param[in] numBytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +void *Osal_srioDataBufferMalloc(uint32_t numBytes); + + +/*------------ Osal_srioDataBufferFree() function ------------------------*//** + * @brief Function is used to clean up a previously allocated data buffer + * block. All data buffers are in the global address space. + * + * @param[in] ptr - pointer to the memory block to be cleaned up + * @param[in] numBytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioDataBufferFree(void *ptr, uint32_t numBytes); + + +/*------------ Osal_srioLog() function -----------------------------------*//** + * @brief Function is used to log the messages from SRIO LLD on the console. + * + * @param[in] fmt - formatted string + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioLog(String fmt, ... ); + + +/*------------ Osal_srioCreateSem() function -----------------------------*//** + * @brief Function is used to create a critical section. + * + * @return Semaphore handle created + * +-----------------------------------------------------------------------------*/ +void *Osal_srioCreateSem(void); + + +/*------------ Osal_srioDeleteSem() function -----------------------------*//** + * @brief Function is used to delete a critical section. + * + * @param[in] semHandle - semaphore handle to be deleted + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioDeleteSem(void *semHandle); + + +/*------------ Osal_srioPendSem() function -------------------------------*//** + * @brief Function is used to pend on a semaphore + * + * @param[in] semHandle - semaphore handle on which the API will pend + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioPendSem(void *semHandle); + + +/*------------ Osal_srioPostSem() function -------------------------------*//** + * @brief Function is used to post a semaphore + * + * @param[in] semHandle - semaphore handle which will be posted + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioPostSem(void *semHandle); + + +/*------------ Osal_srioEnterMultipleCoreCriticalSection() function ------*//** + * @brief Function is used to protect the driver shared resources across + * multiple cores. + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_srioEnterMultipleCoreCriticalSection(void); + + +/*------------ Osal_srioExitMultipleCoreCriticalSection() function -------*//** + * @brief Function is called to end the critical section which was protecting + * shared resources from access across multiple cores. + * + * @param[in] critSectHandle - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioExitMultipleCoreCriticalSection(void *critSectHandle); + + +/*------------ Osal_srioEnterSingleCoreCriticalSection() function --------*//** + * @brief Function is used to provide critical section to prevent access of + * shared resources from single core and multiple threads. + * + * @param[in] drvHandle - driver handle which needs critical section to + * protect its resources + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_srioEnterSingleCoreCriticalSection(Srio_DrvHandle drvHandle); + + +/*------------ Osal_srioExitSingleCoreCriticalSection() function ---------*//** + * @brief Function is called to end the critical section access of shared + * resources from single cores. + * + * @param[in] drvHandle - driver handle which needs critical section to + * protect its resources + * @param[in] critSectHandle - critical handle retreived by + * Osal_srioEnterSingleCoreCriticalSection() function call + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioExitSingleCoreCriticalSection(Srio_DrvHandle drvHandle, void *critSectHandle); + +//============================================================================= + + +#endif /* __TA66XX_FUNCTIONS_INCLUDE_SRIO__ */ + + +//============================================================================= +//============ NIMU LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_nimuMalloc() function --------------------------------*//** + * @brief Function implements the memory allocate function for the NIMU + * library. + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * @param[in] alignment - alignment of allocated memory block in bytes + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_nimuMalloc(uint32_t num_bytes, uint32_t alignment); + + +/*------------ Osal_nimuFree() function ----------------------------------*//** + * @brief Function implements the memory free function for the NIMU library. + * + * This function frees up memory allocated using Osal_nimuMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_nimuFree(Ptr dataPtr, uint32_t num_bytes); + +//============================================================================= + + + +//============================================================================= +//============ PASS LLD OSAL functions ======================================== +//============================================================================= + + +/*------------ Osal_paBeginMemAccess() function --------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] addr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paBeginMemAccess(Ptr addr, uint32_t size); + + +/*------------ Osal_paEndMemAccess() function ----------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] addr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paEndMemAccess(Ptr addr, uint32_t size); + + +/*------------ Osal_paMtCsEnter() function -------------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @param[out] key - pointer to a variable to receive a handle for unlocking + * critical section + + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paMtCsEnter(uint32_t *key); + + +/*------------ Osal_paMtCsExit() function --------------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_paMtCsEnter() API. + * + * @param[in] key - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paMtCsExit(uint32_t key); + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __TA66XX_OSAL_H__ */ diff --git a/ports/c667x/ccs/example_build/include/TASDK_ERR.h b/ports/c667x/ccs/example_build/include/TASDK_ERR.h new file mode 100644 index 00000000..8245e95b --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TASDK_ERR.h @@ -0,0 +1,87 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 4A. + (C) MicroLAB Systems, 2015-2017 + + + File: TORNADO AMC SDK functions errors + ----- + +******************************************************************************/ + + +/** + * @file TASDK_ERR.h + * + * @brief SDK functions errors + * + * This file contains TORNADO AMC SDK functions errors + * + */ + + +#ifndef __TASDK_ERR_H__ // check for this file has been already included +#define __TASDK_ERR_H__ 1 + + +//============================================================================= +//============ Returned error codes =========================================== +//============================================================================= +/** @addtogroup TASDK_ERRORS SDK API functions returned error codes + * @{ + */ +#define TASDK_OK 0 /**< No errors */ +#define TASDK_PARAM_ERR -100 /**< Erroneous function parameter */ +#define TASDK_INVALID_HW_ERR -101 /**< Invalid H/W error (invalid board, etc.) */ +#define TASDK_HW_ERR -102 /**< H/W error (error writing to the DSP control registers, etc) */ +#define TASDK_SYS_CALL_ERR -103 /**< system API call error */ +#define TASDK_INVALID_DSP_CORE_ERR -104 /**< Only DSP core 0 may call the function */ +#define TASDK_INVALID_DSP_CORE_BOOT_ADDR_ERR -105 /**< Invalid DSP core boot address */ +#define TASDK_API_OPEN_ERR -106 /**< API has not been open */ +#define TASDK_MMC_TO_CPU_COMM_CHECKSUM_ERR -150 /**< Invalid data frame checksum */ +#define TASDK_MMC_TO_CPU_COMM_DATA_BUF_LEN_ERR -151 /**< Data buffer is not large enough to store received data frame */ +#define TASDK_MMC_TO_CPU_COMM_INV_CMD_ERR -152 /**< Invalid command */ +#define TASDK_MMC_TO_CPU_COMM_RECV_DATA_LEN_ERR -153 /**< Invalid received data length */ +#define TASDK_MMC_TO_CPU_COMM_RECV_DATA_INV_ERR -154 /**< Received data is invalid */ +#define TASDK_MMC_TO_CPU_COMM_TIMEOUT_ERR -155 /**< MMC-to-DSP communication timeout error */ +#define TASDK_SFP_NOT_INSTALLED_ERR -156 /**< SFP module is not installed */ +#define TASDK_FMC_NOT_INSTALLED_ERR -157 /**< FMC module is not installed */ +#define TASDK_FMC_INFO_INVALID_ERR -158 /**< FMC module info is invalid */ +#define TASDK_FLASH_INV_DEV_ERR -200 /**< unsupported FLASH device */ +#define TASDK_FLASH_ERASE_ERR -201 /**< FLASH erase error */ +#define TASDK_FLASH_WR_ERR -202 /**< FLASH write error */ +#define TASDK_FLASH_CANNOT_WR_ERR -203 /**< FLASH contents does not allow to write this data */ +#define TASDK_FLASH_INV_RD_ERR -204 /**< invalid FLASH read data during AUTO-SELECT */ +#define TASDK_FLASH_INFO_NOT_MATCH_ERR -205 /**< FLASH info from the FLASH chip does not match FLASH_LEN_ID from System Configuration register */ +#define TASDK_FLASH_SECTOR_WRPROT_ERR -206 /**< FLASH sector is write-protected */ +#define TASDK_FLASH_WR_BUF_ABORT_ERR -207 /**< FLASH write-to-buffer program is aborted */ +#define TASDK_FLASH_HW_WP_ERR -208 /**< FLASH writes are disabled by on-board switch */ +#define TASDK_FLASH_WR_DISABLED_ERR -209 /**< FLASH writes are disabled by application */ +#define TASDK_FPGA_CNF_BITFILE_HD_FORMAT_ERR -500 /**< invalid FPGA bitfile header format */ +#define TASDK_FPGA_CNF_LOAD_ERR -501 /**< error during FPGA configuration */ +#define TASDK_FPGA_CNF_CRC_ERR -502 /**< CRC check failed during FPGA configuration */ +#define TASDK_FPGA_CNF_LOAD_LEN_ERR -503 /**< not all the data has been loaded */ +#define TASDK_FPGA_CNF_BITFILE_INV_PART_ERR -504 /**< invalid FPGA bitfile header part name */ +#define TASDK_FPGA_CNF_INV_IF_ERR -505 /**< invalid FPGA configuration interface selected */ +#define TASDK_FLASH_RECORD_GLOBAL_HD_NOT_VALID_ERR -600 /**< FLASH record global header is invalid */ +#define TASDK_FLASH_RECORD_HD_NOT_VALID_ERR -601 /**< FLASH record header is invalid */ +#define TASDK_FLASH_RECORD_HD_LIST_NOT_VALID_ERR -602 /**< FLASH record header list is invalid */ +#define TASDK_FLASH_RECORD_FREE_SPACE_ERR -603 /**< not available free space in FLASH */ +#define TASDK_FLASH_RECORD_CHECKSUM_ERR -604 /**< FLASH record checksum mismatch */ +#define TASDK_FLASH_RECORD_ALREADY_OPENED_ERR -605 /**< another FLASH record is opened for writing */ +#define TASDK_FLASH_RECORD_INVALID_LOAD_ADDR_ERR -606 /**< invalid FLASH record load address */ +#define TASDK_FLASH_RECORD_INV_NUMBER_ERR -607 /**< invalid FLASH record number */ +#define TASDK_FLASH_BOOT_SEQ_NOT_VALID_ERR -608 /**< FLASH boot sequence is invalid */ +#define ELF_LOADER_BASE_ERR -1000 /**< ELF file loader base error */ +#define ELF_LOADER_PARAM_ERR (ELF_LOADER_BASE_ERR) /**< erroneous function parameter */ +#define ELF_LOADER_INV_ELF_HEADER_ERR (ELF_LOADER_BASE_ERR - 1) /**< invalid ELF header */ +#define ELF_LOADER_INV_FILE_TYPE_ERR (ELF_LOADER_BASE_ERR - 2) /**< invalid file type (non-executable) */ +#define ELF_LOADER_INV_ENTRY_POINT_ERR (ELF_LOADER_BASE_ERR - 3) /**< invalid entry-point address */ +#define ELF_LOADER_INV_SEGMENT_ERR (ELF_LOADER_BASE_ERR - 4) /**< invalid or missing segment data */ +/** @}*/ +//============================================================================= + + + +//============================================================================= +#endif /* __TASDK_ERR_H__ */ + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject new file mode 100644 index 00000000..9c03abfb --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject new file mode 100644 index 00000000..f4a158fb --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project new file mode 100644 index 00000000..b18fc136 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project @@ -0,0 +1,89 @@ + + + sample_threadx_c6678evm + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + -k + + + org.eclipse.cdt.make.core.buildCommand + ${CCS_UTILS_DIR}/bin/gmake + + + org.eclipse.cdt.make.core.buildLocation + ${BuildDirectory} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + false + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + ORIGINAL_PROJECT_ROOT + file:/C:/release/threadx/sample_threadx_c6678evm + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..f653028c --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..2adc7b1d --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..093dbb95 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//Debug/makefile=UTF-8 +encoding//Debug/objects.mk=UTF-8 +encoding//Debug/sources.mk=UTF-8 +encoding//Debug/subdir_rules.mk=UTF-8 +encoding//Debug/subdir_vars.mk=UTF-8 diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c new file mode 100644 index 00000000..31e8056b --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c @@ -0,0 +1,441 @@ +/* + * board_setup.c + * + */ + + +#include "board_setup.h" +#include "C66XX.h" +#include + + +//============================================================================= +//============ General definitions ============================================ +//============================================================================= +// DSP Timer-8 definition +#define C66XX_DSP_TIMER C66XX_TIMER_8 +// DSP Timer-8 output frequency in Hz +#define C66XX_DSP_TIMER_FREQ 100 +/* DSP Timer-8 interrupt event ID */ +#define C66XX_DSP_TIMER_EVENT_ID 67 +//============================================================================= + + +//============================================================================= +//============ Global functions =============================================== +//============================================================================= +void _tx_nmi_vector(void); +void _tx_int4_vector(void); +void _tx_int5_vector(void); +void _tx_int6_vector(void); +void _tx_int7_vector(void); +void _tx_int8_vector(void); +void _tx_int9_vector(void); +void _tx_int10_vector(void); +void _tx_int11_vector(void); +void _tx_int12_vector(void); +void _tx_int13_vector(void); +void _tx_int14_vector(void); +void _tx_int15_vector(void); +//============================================================================= + + +//============================================================================= +//============ Static functions =============================================== +//============================================================================= +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency); +static int32_t tx_interrupt_init(void); +//============================================================================= + + +/*------------ init_output_timer() function ----------------------------------- + * DESCRIPTION: Function initializes Timer64 module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency) +{ + int32_t r; + C66XX_TIMER_CFG_DD cfg_dd; + + // Reset 64-bit timer + if ((r = C66XX_TIMER_reset(timer, C66XX_TIMER_HW_CFG_64BIT)) != C66XX_OK) + goto exit; + + // Fill configuration data descriptor + memset(&cfg_dd, 0, C66XX_TIMER_CFG_DD_LEN); + cfg_dd.timer_mode = C66XX_TIMER_MODE_32BIT_UNCHAINED; + cfg_dd.timer_high.clk_src_output_mode = C66XX_TIMER_CLK_OUTPUT_MODE_CLK; + // Init DSP Timer64 module + if ((r = C66XX_TIMER_init(timer, frequency, &cfg_dd)) != C66XX_OK) + goto exit; + + // Enable timer interrupt + if ((r = C66XX_TIMER_enable_interrupts(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH)) != C66XX_OK) + goto exit; + + // Start 32-bit timer high to enable continuously + if ((r = C66XX_TIMER_start(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH, C66XX_TIMER_COUNT_MODE_CONTINUOUSLY)) != C66XX_OK) + goto exit; + + // TIMER module configuration is completed + printf("Timer #%u configuration is completed\n", timer); + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_interrupt_init() function ----------------------------------- + * DESCRIPTION: Function initializes CorePack interrupt module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_interrupt_init(void) +{ + int32_t r; + + // Set DSP interrupt handlers to the ones defined in tx_initialize_low_level.asm + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_NMI, _tx_nmi_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_4, _tx_int4_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_5, _tx_int5_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_6, _tx_int6_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_7, _tx_int7_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_8, _tx_int8_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_9, _tx_int9_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_10, _tx_int10_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_11, _tx_int11_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_12, _tx_int12_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_13, _tx_int13_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_14, _tx_int14_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_15, _tx_int15_vector)) != C66XX_OK) + goto exit; + + /* CorePack interrupt module configuration is completed */ + printf("INTC configuration is completed\n"); + // Exit without errors + r = C66XX_OK; + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup() +{ + platform_init_flags init_flags; + platform_init_config init_config; + platform_info p_info; + int32_t r; + + /* + * Initialize all platform peripherals with default values: + * PLL, DDR, TCSL, PHY, ECC + */ + init_flags.pll = 1; + init_flags.ddr = 1; + init_flags.tcsl = 1; + init_flags.phy = 1; + init_flags.ecc = 0; + memset(&init_config, 0, sizeof(platform_init_config)); + if ((r = platform_init(&init_flags, &init_config)) != Platform_EOK) + goto exit; + + /* Initialize platform UART */ + if ((r = platform_uart_init()) != Platform_EOK) + goto exit; + if ((r = platform_uart_set_baudrate(115200)) != Platform_EOK) + goto exit; + + /* Get platform info */ + platform_get_info(&p_info); + /* Write data to the UART */ + platform_write("Platform library version is %s\n", p_info.version); + platform_write("Board name is %s\n", p_info.board_name); + platform_write("Board serial number is %s\n", p_info.serial_nbr); + platform_write("Board revision ID is %u\n", p_info.board_rev); + platform_write("CPU name is %s\n", p_info.cpu.name); + platform_write("CPU revision ID is %u\n", p_info.cpu.revision_id); + platform_write("Number of CPU cores is %u\n", p_info.cpu.core_count); + platform_write("CPU frequency is %u MHz\n", p_info.frequency); + + // Init CorePac INTC + if ((r = C66XX_INT_init_core()) != C66XX_OK) + goto exit; + + // Init DSP Timer + if ((r = tx_timer_init(C66XX_DSP_TIMER, C66XX_DSP_TIMER_FREQ)) != C66XX_OK) + goto exit; + + // Init DSP interrupt controller + if ((r = tx_interrupt_init()) != C66XX_OK) + goto exit; + + printf("Board is initialized\n"); + /* Exit with no errors */ + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +//============================================================================= +//============ Platform OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_platformMalloc() function ----------------------------*//** + * @brief Function implements the memory allocate function for the platform + * library. + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * @param[in] alignment - alignment of allocated memory block in bytes + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +uint8_t *Osal_platformMalloc(uint32_t num_bytes, uint32_t alignment) +{ + // Allocate memory from default system heap + return (NULL); +} +//----------------------------------------------------------------------------- + + +/*------------ Osal_platformFree() function ------------------------------*//** + * @brief Function implements the memory free function for the platform + * library. + * + * This function frees up memory allocated using Osal_platformMalloc() + * function call. + * + * @param[in] mem_ptr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformFree(uint8_t *mem_ptr, uint32_t num_bytes) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ Osal_platformSpiCsEnter() function ------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @param[out] key - pointer to a variable to receive a handle for unlocking + * critical section + + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsEnter(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ Osal_platformSpiCsExit() function -------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_paMtCsEnter() API. + * + * @param[in] key - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsExit(void) +{ +} +//----------------------------------------------------------------------------- + + +//============================================================================= + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h new file mode 100644 index 00000000..9e252dcd --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h @@ -0,0 +1,209 @@ +/* + * board_setup.h + * + */ + + +#ifndef BOARD_SETUP_H /* check for this file has been already included */ +#define BOARD_SETUP_H 1 + + +#include "ti\platform\platform.h" + + +/*===========================================================================*/ +/*============ Printf output definitions ====================================*/ +/*===========================================================================*/ +#define printf platform_write +/*===========================================================================*/ + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup(); + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void); + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void); + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void); + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void); + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void); + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void); + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void); + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void); + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void); + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void); + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void); + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void); + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void); + + +/*------------ Osal_platformMalloc() function ----------------------------*//** + * @brief Function implements the memory allocate function for the platform + * library. + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * @param[in] alignment - alignment of allocated memory block in bytes + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +uint8_t *Osal_platformMalloc(uint32_t num_bytes, uint32_t alignment); + + +/*------------ Osal_platformFree() function ------------------------------*//** + * @brief Function implements the memory free function for the platform + * library. + * + * This function frees up memory allocated using Osal_platformMalloc() + * function call. + * + * @param[in] mem_ptr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformFree(uint8_t *mem_ptr, uint32_t num_bytes); + + +/*------------ Osal_platformSpiCsEnter() function ------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @param[out] key - pointer to a variable to receive a handle for unlocking + * critical section + + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsEnter(void); + + +/*------------ Osal_platformSpiCsExit() function -------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_paMtCsEnter() API. + * + * @param[in] key - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsExit(void); + + +/*===========================================================================*/ +#endif /* BOARD_SETUP_H */ + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c new file mode 100644 index 00000000..18bad8de --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c @@ -0,0 +1,528 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include "board_setup.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define TraceX trace oblects */ +#define TRACE_BUFFER_SIZE (4 * 1024) +#define TRACE_OBJECTS_COUNT 20 +/* Define TraceX trace buffer */ +UCHAR tx_trace_buffer[TRACE_BUFFER_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define demo timer */ +#define DEMO_TIMER_PERIOD 10 +#define DEMO_TIMER_VALUE 0xaaaaaaaa +TX_TIMER timer_0; +ULONG timer_0_counter; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); +void my_stack_error_handler(TX_THREAD *thread_ptr); +void my_timer_function(ULONG timer_input); + + +/* Define main entry point. */ + +void main() +{ + /* Setup the hardware. */ + hardware_setup(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; +UINT status; + + /* Enable event tracing using the global “trace_buffer” memory and supporting + a maximum of TRACE_OBJECTS_COUNT ThreadX objects in the registry. */ + if ((status = tx_trace_enable(tx_trace_buffer, TRACE_BUFFER_SIZE, TRACE_OBJECTS_COUNT)) != TX_SUCCESS) + { + while (1); + } + + /* Register thread stack error notification callback */ + if ((status = tx_thread_stack_error_notify(my_stack_error_handler)) != TX_SUCCESS) + { + while (1); + } + + /* Create a byte memory pool from which to allocate the thread stacks. */ + status = tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the main thread. */ + status = tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 1. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + status = tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 2. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 3. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + status = tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 4. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 5. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + status = tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 6. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + status = tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 7. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the message queue. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the message queue shared by threads 1 and 2. */ + status = tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the semaphore used by threads 3 and 4. */ + status = tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the event flags group used by threads 1 and 5. */ + status = tx_event_flags_create(&event_flags_0, "event flags 0"); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + status = tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the memory for a small block pool. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create a block memory pool to allocate a message buffer from. */ + status = tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate a block and release the block memory. */ + status = tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Release the block back to the pool. */ + status = tx_block_release(pointer); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the periodic timer. */ + status = tx_timer_create(&timer_0, "timer 0", my_timer_function, (ULONG) DEMO_TIMER_VALUE, DEMO_TIMER_PERIOD, DEMO_TIMER_PERIOD, TX_AUTO_ACTIVATE); + if (status != TX_SUCCESS) + { + while (1); + } +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void my_stack_error_handler(TX_THREAD *thread_ptr) +{ + while(1); +} + + +void my_timer_function(ULONG timer_input) +{ + /* Increment the thread counter. */ + timer_0_counter++; + + if (timer_input != DEMO_TIMER_VALUE) + while(1); +} + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd new file mode 100644 index 00000000..a2267231 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd @@ -0,0 +1,55 @@ +-c +-heap 0x400 +-stack 0x1000 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.ae66 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.intc.ae66 +-l c:\ti\pdk_C6678_1_1_2_6\packages\ti\platform\evmc6678l\platform_lib\lib\release\ti.platform.evm6678l.ae66 + +/* Memory Map */ +MEMORY +{ + L1PSRAM (RWX) : org = 0x00E00000, len = 0x00008000 + L1DSRAM (RWX) : org = 0x00F00000, len = 0x00008000 + CODE_RAM (RWX) : org = 0x00800000, len = 0x00020000 + DATA_RAM (RWX) : org = 0x00820000, len = 0x00060000 + MSMCSRAM (RWX) : org = 0x0c000000, len = 0x00400000 + DDR3 (RWX) : org = 0x80000000, len = 0x80000000 +} + +SECTIONS +{ + .text > CODE_RAM + .stack > CODE_RAM + .cio > CODE_RAM + .const > CODE_RAM + .data > CODE_RAM + .switch > CODE_RAM + .sysmem > CODE_RAM + .far > CODE_RAM + .args > CODE_RAM + .ppinfo > CODE_RAM + .ppdata > CODE_RAM + .csl_vect > CODE_RAM + platform_lib > CODE_RAM + + GROUP + { + .neardata + .rodata + .bss + } > CODE_RAM + + /* COFF sections */ + .pinit > CODE_RAM + .cinit > CODE_RAM + + /* EABI sections */ + .binit > CODE_RAM + .init_array > CODE_RAM + .fardata > CODE_RAM + .c6xabi.exidx > CODE_RAM + .c6xabi.extab > CODE_RAM + + /* ThreadX section which should be the last RAM section loaded */ + .zend > DATA_RAM +} diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml new file mode 100644 index 00000000..b7147d7f --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt new file mode 100644 index 00000000..d783fef4 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm new file mode 100644 index 00000000..cdc14f20 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm @@ -0,0 +1,405 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + +SP .set B15 +ADDRESS_MSK .set 0xFFFFFFF0 ; Ensure 16-byte alignment + +; Use Timer 8 as it's available for all DSP cores at C6678 +; Timer 8 interrupt high event (TINT8H) ID is 67 +; Assume DSP core clock 1000 MHz +; Timer is clocked at DSP core clock / 6 = 167 MHz +; Timer frequency will set to 100 Hz +TMR8_INTCTLSTAT_ADDR .set 0x02280044 ; Timer 8 Interrupt Control and Status Register +INTCTLSTAT_VAL .set 0x00010000 ; Enable TIMHI interrupt + +EVTCLR2_ADDR .set 0x01800048 ; Event Clear register 2 address +EVTCLR2_TMR8_VAL .set 0x00000008 ; Clear event 67 - TINT8H + +EVTMASK2_ADDR .set 0x01800088 ; Event Mask register 2 address +EVTMASK2_TMR8_VAL .set 0x00000008 ; Mask event 67 - TINT8H + +INTMUX1_ADDR .set 0x01800104 ; Interrupt Mux Register 1 address +INTMUX1_TMR8_VAL .set 0x43 ; Tie in Event 67 (TINT8H) to INT4 +; +; + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + + +; External interrupt handlers - should be defined by user + .global tx_nmi_handler + .global tx_int5_handler + .global tx_int6_handler + .global tx_int7_handler + .global tx_int8_handler + .global tx_int9_handler + .global tx_int10_handler + .global tx_int11_handler + .global tx_int12_handler + .global tx_int13_handler + .global tx_int14_handler + .global tx_int15_handler + +; +; +;/* Define the first available address in memory, which is typically just the last +; RAM section loaded. */ + .sect ".zend" + .space 20 + .global _tx_first_free_memory + .align 16 +_tx_first_free_memory: + .space 4 + +; Useful macro definitions +; Load 32-bit integer into register +MVK_LH .macro val,reg + MVKL val,reg + MVKH val,reg + .endm +; Interrupt entry - allocate stack space, save A0-A4 and B3 registers to stack, +; build return address in B3 register for context save function and +; call context save function +TX_INTERRUPT_ENTRY .macro + ADDK.S2 -288,SP + STW B3,*+SP(96) + STW A0,*+SP(20) + STW A1,*+SP(24) + STW A2,*+SP(28) + STW A3,*+SP(32) + STW A4,*+SP(36) + B _tx_thread_context_save + .endm +; Interrupt exit - jump to context restore function +TX_INTERRUPT_EXIT .macro + B _tx_thread_context_restore + NOP 5 + .endm + + + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (SP); +; + MVK_LH _tx_thread_system_stack_ptr,A0 ; Build address of system stack + STW SP,*A0 ; Save system stack address +; +; /* Pickup the first available memory address. */ +; + MVK_LH ADDRESS_MSK,A0 ; Build address mask + MVK_LH _tx_first_free_memory,A1 ; Build address of free memory + AND A0,A1,A1 ; Ensure alignment +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) end; +; + MVK_LH _tx_initialize_unused_memory,A0 ; Build address of variable + STW A1,*A0 ; Save free memory address +; +; /* Setup Timer 8 HIGH interrupt event */ +; + MVK_LH INTMUX1_ADDR,A0 ; Select event 67 to send through INT4 + MVK_LH INTMUX1_TMR8_VAL,A1 + STW A1,*A0 + + MVK_LH EVTMASK2_ADDR,A0 ; Build address of Event Mask 2 Register + MVK_LH EVTMASK2_TMR8_VAL,A1 ; Build value of Event Mask 2 Register + STW A1,*A0 +; +; /* Done, return to caller. */ +; + B B3 ; Return to caller + NOP 5 ; Delay slots +;} +; + + + .global _tx_nmi_vector + .global _tx_nmi_vector_processing +_tx_nmi_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_nmi_vector_processing,B3 + MVKH _tx_nmi_vector_processing,B3 + NOP 3 +_tx_nmi_vector_processing: + CALLP tx_nmi_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int4_vector +_tx_int4_vector: + ADDK.S2 -288,SP ; Allocate stack space + STW B3,*+SP(96) ; Save B3 + STW A0,*+SP(20) ; Save A0 + STW A1,*+SP(24) ; Save A1 + STW A2,*+SP(28) ; Save A2 + STW A3,*+SP(32) ; Save A3 + STW A4,*+SP(36) ; Save A4 + NOP + +;_tx_timer_interrupt_preamble: + + MVK_LH TMR8_INTCTLSTAT_ADDR,A0 ; Build address of Timer Interrupt Control Register + MVK_LH INTCTLSTAT_VAL,A1 ; Build value of Timer Interrupt Control Register + STW A1,*A0 ; Clear Timer Interrupts + +; Clear DSP Event flag - DSP events are not self-cleared + MVK_LH EVTCLR2_ADDR,A0 ; Build address of Event Clear 2 Register + MVK_LH EVTCLR2_TMR8_VAL,A1 ; Build value of Event Clear 2 Register + STW A1,*A0 ; Clear Timer Event + + MVK_LH _tx_timer_interrupt,A0 + B A0 ; Branch ThreadX timer ISR routine + NOP 5 ; Delay slots + NOP + + + + .global _tx_int5_vector + .global _tx_int5_vector_processing +_tx_int5_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int5_vector_processing,B3 + MVKH _tx_int5_vector_processing,B3 + NOP 3 +_tx_int5_vector_processing: + CALLP tx_int5_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int6_vector + .global _tx_int6_vector_processing +_tx_int6_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int6_vector_processing,B3 + MVKH _tx_int6_vector_processing,B3 + NOP 3 +_tx_int6_vector_processing: + CALLP tx_int6_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int7_vector + .global _tx_int7_vector_processing +_tx_int7_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int7_vector_processing,B3 + MVKH _tx_int7_vector_processing,B3 + NOP 3 +_tx_int7_vector_processing: + CALLP tx_int7_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int8_vector + .global _tx_int8_vector_processing +_tx_int8_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int8_vector_processing,B3 + MVKH _tx_int8_vector_processing,B3 + NOP 3 +_tx_int8_vector_processing: + CALLP tx_int8_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int9_vector + .global _tx_int9_vector_processing +_tx_int9_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int9_vector_processing,B3 + MVKH _tx_int9_vector_processing,B3 + NOP 3 +_tx_int9_vector_processing: + CALLP tx_int9_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int10_vector + .global _tx_int10_vector_processing +_tx_int10_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int10_vector_processing,B3 + MVKH _tx_int10_vector_processing,B3 + NOP 3 +_tx_int10_vector_processing: + CALLP tx_int10_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int11_vector + .global _tx_int11_vector_processing +_tx_int11_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int11_vector_processing,B3 + MVKH _tx_int11_vector_processing,B3 + NOP 3 +_tx_int11_vector_processing: + CALLP tx_int11_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int12_vector + .global _tx_int12_vector_processing +_tx_int12_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int12_vector_processing,B3 + MVKH _tx_int12_vector_processing,B3 + NOP 3 +_tx_int12_vector_processing: + CALLP tx_int12_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int13_vector + .global _tx_int13_vector_processing +_tx_int13_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int13_vector_processing,B3 + MVKH _tx_int13_vector_processing,B3 + NOP 3 +_tx_int13_vector_processing: + CALLP tx_int13_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int14_vector + .global _tx_int14_vector_processing +_tx_int14_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int14_vector_processing,B3 + MVKH _tx_int14_vector_processing,B3 + NOP 3 +_tx_int14_vector_processing: + CALLP tx_int14_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int15_vector + .global _tx_int15_vector_processing +_tx_int15_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int15_vector_processing,B3 + MVKH _tx_int15_vector_processing,B3 + NOP 3 +_tx_int15_vector_processing: + CALLP tx_int15_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject new file mode 100644 index 00000000..d9b816a4 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject new file mode 100644 index 00000000..ee74925b --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project new file mode 100644 index 00000000..cbdff31c --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project @@ -0,0 +1,89 @@ + + + sample_threadx_ta6678fmc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + -k + + + org.eclipse.cdt.make.core.buildCommand + ${CCS_UTILS_DIR}/bin/gmake + + + org.eclipse.cdt.make.core.buildLocation + ${BuildDirectory} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + false + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + ORIGINAL_PROJECT_ROOT + file:/C:/release/threadx/sample_threadx_ta6678fmc + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..f653028c --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..2adc7b1d --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..093dbb95 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//Debug/makefile=UTF-8 +encoding//Debug/objects.mk=UTF-8 +encoding//Debug/sources.mk=UTF-8 +encoding//Debug/subdir_rules.mk=UTF-8 +encoding//Debug/subdir_vars.mk=UTF-8 diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c new file mode 100644 index 00000000..e5b8a0bf --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c @@ -0,0 +1,329 @@ +/* + * board_setup.c + * + */ + + +#include "board_setup.h" +#include + + +//============================================================================= +//============ General definitions ============================================ +//============================================================================= +// DSP Timer-8 definition +#define C66XX_DSP_TIMER C66XX_TIMER_8 +// DSP Timer-8 output frequency in Hz +#define C66XX_DSP_TIMER_FREQ 100 +/* DSP Timer-8 interrupt event ID */ +#define C66XX_DSP_TIMER_EVENT_ID 67 +//============================================================================= + + +//============================================================================= +//============ Global functions =============================================== +//============================================================================= +void _tx_nmi_vector(void); +void _tx_int4_vector(void); +void _tx_int5_vector(void); +void _tx_int6_vector(void); +void _tx_int7_vector(void); +void _tx_int8_vector(void); +void _tx_int9_vector(void); +void _tx_int10_vector(void); +void _tx_int11_vector(void); +void _tx_int12_vector(void); +void _tx_int13_vector(void); +void _tx_int14_vector(void); +void _tx_int15_vector(void); +//============================================================================= + + +//============================================================================= +//============ Static functions =============================================== +//============================================================================= +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency); +static int32_t tx_interrupt_init(void); +//============================================================================= + + +/*------------ init_output_timer() function ----------------------------------- + * DESCRIPTION: Function initializes Timer64 module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency) +{ + int32_t r; + C66XX_TIMER_CFG_DD cfg_dd; + + // Reset 64-bit timer + if ((r = C66XX_TIMER_reset(timer, C66XX_TIMER_HW_CFG_64BIT)) != C66XX_OK) + goto exit; + + // Fill configuration data descriptor + memset(&cfg_dd, 0, C66XX_TIMER_CFG_DD_LEN); + cfg_dd.timer_mode = C66XX_TIMER_MODE_32BIT_UNCHAINED; + cfg_dd.timer_high.clk_src_output_mode = C66XX_TIMER_CLK_OUTPUT_MODE_CLK; + // Init DSP Timer64 module + if ((r = C66XX_TIMER_init(timer, frequency, &cfg_dd)) != C66XX_OK) + goto exit; + + // Enable timer interrupt + if ((r = C66XX_TIMER_enable_interrupts(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH)) != C66XX_OK) + goto exit; + + // Start 32-bit timer high to enable continuously + if ((r = C66XX_TIMER_start(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH, C66XX_TIMER_COUNT_MODE_CONTINUOUSLY)) != C66XX_OK) + goto exit; + + // TIMER module configuration is completed + printf("Timer #%u configuration is completed\n", timer); + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_interrupt_init() function ----------------------------------- + * DESCRIPTION: Function initializes CorePack interrupt module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_interrupt_init(void) +{ + int32_t r; + + // Set DSP interrupt handlers to the ones defined in tx_initialize_low_level.asm + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_NMI, _tx_nmi_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_4, _tx_int4_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_5, _tx_int5_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_6, _tx_int6_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_7, _tx_int7_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_8, _tx_int8_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_9, _tx_int9_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_10, _tx_int10_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_11, _tx_int11_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_12, _tx_int12_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_13, _tx_int13_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_14, _tx_int14_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_15, _tx_int15_vector)) != C66XX_OK) + goto exit; + + /* CorePack interrupt module configuration is completed */ + printf("INTC configuration is completed\n"); + // Exit without errors + r = TASDK_OK; + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup() +{ + int r; + + /* Init DSP */ + if ((r = TA66XX_BC_init()) != TASDK_OK) + goto exit; + + // Initialize UART + if ((r = TA66XX_BC_init_uart(C66XX_UART_BAUD_RATE_115200, C66XX_UART_DATA_BITS_8BITS, C66XX_UART_PARITY_NONE, C66XX_UART_STOP_BITS_1BIT)) != TASDK_OK) + goto exit; + + // Init DSP Timer + if ((r = tx_timer_init(C66XX_DSP_TIMER, C66XX_DSP_TIMER_FREQ)) != TASDK_OK) + goto exit; + + // Init DSP interrupt controller + if ((r = tx_interrupt_init()) != TASDK_OK) + goto exit; + + printf("Board is initialized\n"); + /* Exit with no errors */ + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void) +{ +} +//----------------------------------------------------------------------------- + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h new file mode 100644 index 00000000..a65e3b9d --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h @@ -0,0 +1,151 @@ +/* + * board_setup.h + * + */ + + +#ifndef BOARD_SETUP_H // check for this file has been already included +#define BOARD_SETUP_H 1 + + +/* Include T-AMC DSP API */ +#include "TA66XX_DSP_BC.h" + + +//============================================================================= +//============ Printf output definitions ====================================== +//============================================================================= +#define printf TA66XX_BC_uart_printf +//============================================================================= + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup(); + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void); + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void); + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void); + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void); + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void); + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void); + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void); + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void); + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void); + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void); + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void); + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void); + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void); + + +//============================================================================= +#endif /* BOARD_SETUP_H */ + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c new file mode 100644 index 00000000..18bad8de --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c @@ -0,0 +1,528 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include "board_setup.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define TraceX trace oblects */ +#define TRACE_BUFFER_SIZE (4 * 1024) +#define TRACE_OBJECTS_COUNT 20 +/* Define TraceX trace buffer */ +UCHAR tx_trace_buffer[TRACE_BUFFER_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define demo timer */ +#define DEMO_TIMER_PERIOD 10 +#define DEMO_TIMER_VALUE 0xaaaaaaaa +TX_TIMER timer_0; +ULONG timer_0_counter; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); +void my_stack_error_handler(TX_THREAD *thread_ptr); +void my_timer_function(ULONG timer_input); + + +/* Define main entry point. */ + +void main() +{ + /* Setup the hardware. */ + hardware_setup(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; +UINT status; + + /* Enable event tracing using the global “trace_buffer” memory and supporting + a maximum of TRACE_OBJECTS_COUNT ThreadX objects in the registry. */ + if ((status = tx_trace_enable(tx_trace_buffer, TRACE_BUFFER_SIZE, TRACE_OBJECTS_COUNT)) != TX_SUCCESS) + { + while (1); + } + + /* Register thread stack error notification callback */ + if ((status = tx_thread_stack_error_notify(my_stack_error_handler)) != TX_SUCCESS) + { + while (1); + } + + /* Create a byte memory pool from which to allocate the thread stacks. */ + status = tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the main thread. */ + status = tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 1. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + status = tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 2. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 3. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + status = tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 4. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 5. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + status = tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 6. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + status = tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 7. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the message queue. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the message queue shared by threads 1 and 2. */ + status = tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the semaphore used by threads 3 and 4. */ + status = tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the event flags group used by threads 1 and 5. */ + status = tx_event_flags_create(&event_flags_0, "event flags 0"); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + status = tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the memory for a small block pool. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create a block memory pool to allocate a message buffer from. */ + status = tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate a block and release the block memory. */ + status = tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Release the block back to the pool. */ + status = tx_block_release(pointer); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the periodic timer. */ + status = tx_timer_create(&timer_0, "timer 0", my_timer_function, (ULONG) DEMO_TIMER_VALUE, DEMO_TIMER_PERIOD, DEMO_TIMER_PERIOD, TX_AUTO_ACTIVATE); + if (status != TX_SUCCESS) + { + while (1); + } +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void my_stack_error_handler(TX_THREAD *thread_ptr) +{ + while(1); +} + + +void my_timer_function(ULONG timer_input) +{ + /* Increment the thread counter. */ + timer_0_counter++; + + if (timer_input != DEMO_TIMER_VALUE) + while(1); +} + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd new file mode 100644 index 00000000..b03e87b5 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd @@ -0,0 +1,53 @@ +-c +-heap 0x400 +-stack 0x1000 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.ae66 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.intc.ae66 + +/* Memory Map */ +MEMORY +{ + L1PSRAM (RWX) : org = 0x00E00000, len = 0x00008000 + L1DSRAM (RWX) : org = 0x00F00000, len = 0x00008000 + CODE_RAM (RWX) : org = 0x00800000, len = 0x00020000 + DATA_RAM (RWX) : org = 0x00820000, len = 0x00060000 + MSMCSRAM (RWX) : org = 0x0c000000, len = 0x00400000 + DDR3 (RWX) : org = 0x80000000, len = 0x80000000 +} + +SECTIONS +{ + .text > CODE_RAM + .stack > CODE_RAM + .cio > CODE_RAM + .const > CODE_RAM + .data > CODE_RAM + .switch > CODE_RAM + .sysmem > CODE_RAM + .far > CODE_RAM + .args > CODE_RAM + .ppinfo > CODE_RAM + .ppdata > CODE_RAM + .csl_vect > CODE_RAM + + GROUP + { + .neardata + .rodata + .bss + } > CODE_RAM + + /* COFF sections */ + .pinit > CODE_RAM + .cinit > CODE_RAM + + /* EABI sections */ + .binit > CODE_RAM + .init_array > CODE_RAM + .fardata > CODE_RAM + .c6xabi.exidx > CODE_RAM + .c6xabi.extab > CODE_RAM + + /* ThreadX section which should be the last RAM section loaded */ + .zend > DATA_RAM +} diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml new file mode 100644 index 00000000..b7147d7f --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt new file mode 100644 index 00000000..d783fef4 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm new file mode 100644 index 00000000..de902350 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm @@ -0,0 +1,406 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + +SP .set B15 +ADDRESS_MSK .set 0xFFFFFFF0 ; Ensure 16-byte alignment + +; Use Timer 8 as it's available for all DSP cores at C6678 +; Timer 8 interrupt high event (TINT8H) ID is 67 +; Assume DSP core clock 1250 MHz +; Timer is clocked at DSP core clock / 6 = 208 MHz +; Timer frequency will set to 100 Hz +TMR8_INTCTLSTAT_ADDR .set 0x02280044 ; Timer 8 Interrupt Control and Status Register +INTCTLSTAT_VAL .set 0x00010000 ; Enable TIMHI interrupt + +EVTCLR2_ADDR .set 0x01800048 ; Event Clear register 2 address +EVTCLR2_TMR8_VAL .set 0x00000008 ; Clear event 67 - TINT8H + +EVTMASK2_ADDR .set 0x01800088 ; Event Mask register 2 address +EVTMASK2_TMR8_VAL .set 0x00000008 ; Mask event 67 - TINT8H + +INTMUX1_ADDR .set 0x01800104 ; Interrupt Mux Register 1 address +INTMUX1_TMR8_VAL .set 0x43 ; Tie in Event 67 (TINT8H) to INT4 +; +; + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + + +; External interrupt handlers - should be defined by user + .global tx_nmi_handler + .global tx_int5_handler + .global tx_int6_handler + .global tx_int7_handler + .global tx_int8_handler + .global tx_int9_handler + .global tx_int10_handler + .global tx_int11_handler + .global tx_int12_handler + .global tx_int13_handler + .global tx_int14_handler + .global tx_int15_handler + +; +; +;/* Define the first available address in memory, which is typically just the last +; RAM section loaded. */ + .sect ".zend" + .space 20 + .global _tx_first_free_memory + .align 16 +_tx_first_free_memory: + .space 4 + +; Useful macro definitions +; Load 32-bit integer into register +MVK_LH .macro val,reg + MVKL val,reg + MVKH val,reg + .endm +; Interrupt entry - allocate stack space, save A0-A4 and B3 registers to stack, +; build return address in B3 register for context save function and +; call context save function +TX_INTERRUPT_ENTRY .macro + ADDK.S2 -288,SP + STW B3,*+SP(96) + STW A0,*+SP(20) + STW A1,*+SP(24) + STW A2,*+SP(28) + STW A3,*+SP(32) + STW A4,*+SP(36) + B _tx_thread_context_save + .endm +; Interrupt exit - jump to context restore function +TX_INTERRUPT_EXIT .macro + B _tx_thread_context_restore + NOP 5 + .endm + + + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level C667x+/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (SP); +; + MVK_LH _tx_thread_system_stack_ptr,A0 ; Build address of system stack + STW SP,*A0 ; Save system stack address +; +; /* Pickup the first available memory address. */ +; + MVK_LH ADDRESS_MSK,A0 ; Build address mask + MVK_LH _tx_first_free_memory,A1 ; Build address of free memory + AND A0,A1,A1 ; Ensure alignment +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) end; +; + MVK_LH _tx_initialize_unused_memory,A0 ; Build address of variable + STW A1,*A0 ; Save free memory address +; +; /* Setup Timer 8 HIGH interrupt event */ +; + MVK_LH INTMUX1_ADDR,A0 ; Select event 67 to send through INT4 + MVK_LH INTMUX1_TMR8_VAL,A1 + STW A1,*A0 + + MVK_LH EVTMASK2_ADDR,A0 ; Build address of Event Mask 2 Register + MVK_LH EVTMASK2_TMR8_VAL,A1 ; Build value of Event Mask 2 Register + STW A1,*A0 +; +; /* Done, return to caller. */ +; + B B3 ; Return to caller + NOP 5 ; Delay slots +;} +; + + + .global _tx_nmi_vector + .global _tx_nmi_vector_processing +_tx_nmi_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_nmi_vector_processing,B3 + MVKH _tx_nmi_vector_processing,B3 + NOP 3 +_tx_nmi_vector_processing: + CALLP tx_nmi_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int4_vector +_tx_int4_vector: + ADDK.S2 -288,SP ; Allocate stack space + STW B3,*+SP(96) ; Save B3 + STW A0,*+SP(20) ; Save A0 + STW A1,*+SP(24) ; Save A1 + STW A2,*+SP(28) ; Save A2 + STW A3,*+SP(32) ; Save A3 + STW A4,*+SP(36) ; Save A4 + NOP + +;_tx_timer_interrupt_preamble: + + MVK_LH TMR8_INTCTLSTAT_ADDR,A0 ; Build address of Timer Interrupt Control Register + MVK_LH INTCTLSTAT_VAL,A1 ; Build value of Timer Interrupt Control Register + STW A1,*A0 ; Clear Timer Interrupts + +; Clear DSP Event flag - DSP events are not self-cleared + MVK_LH EVTCLR2_ADDR,A0 ; Build address of Event Clear 2 Register + MVK_LH EVTCLR2_TMR8_VAL,A1 ; Build value of Event Clear 2 Register + STW A1,*A0 ; Clear Timer Event + + + MVK_LH _tx_timer_interrupt,A0 + B A0 ; Branch ThreadX timer ISR routine + NOP 5 ; Delay slots + NOP + + + + .global _tx_int5_vector + .global _tx_int5_vector_processing +_tx_int5_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int5_vector_processing,B3 + MVKH _tx_int5_vector_processing,B3 + NOP 3 +_tx_int5_vector_processing: + CALLP tx_int5_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int6_vector + .global _tx_int6_vector_processing +_tx_int6_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int6_vector_processing,B3 + MVKH _tx_int6_vector_processing,B3 + NOP 3 +_tx_int6_vector_processing: + CALLP tx_int6_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int7_vector + .global _tx_int7_vector_processing +_tx_int7_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int7_vector_processing,B3 + MVKH _tx_int7_vector_processing,B3 + NOP 3 +_tx_int7_vector_processing: + CALLP tx_int7_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int8_vector + .global _tx_int8_vector_processing +_tx_int8_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int8_vector_processing,B3 + MVKH _tx_int8_vector_processing,B3 + NOP 3 +_tx_int8_vector_processing: + CALLP tx_int8_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int9_vector + .global _tx_int9_vector_processing +_tx_int9_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int9_vector_processing,B3 + MVKH _tx_int9_vector_processing,B3 + NOP 3 +_tx_int9_vector_processing: + CALLP tx_int9_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int10_vector + .global _tx_int10_vector_processing +_tx_int10_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int10_vector_processing,B3 + MVKH _tx_int10_vector_processing,B3 + NOP 3 +_tx_int10_vector_processing: + CALLP tx_int10_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int11_vector + .global _tx_int11_vector_processing +_tx_int11_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int11_vector_processing,B3 + MVKH _tx_int11_vector_processing,B3 + NOP 3 +_tx_int11_vector_processing: + CALLP tx_int11_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int12_vector + .global _tx_int12_vector_processing +_tx_int12_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int12_vector_processing,B3 + MVKH _tx_int12_vector_processing,B3 + NOP 3 +_tx_int12_vector_processing: + CALLP tx_int12_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int13_vector + .global _tx_int13_vector_processing +_tx_int13_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int13_vector_processing,B3 + MVKH _tx_int13_vector_processing,B3 + NOP 3 +_tx_int13_vector_processing: + CALLP tx_int13_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int14_vector + .global _tx_int14_vector_processing +_tx_int14_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int14_vector_processing,B3 + MVKH _tx_int14_vector_processing,B3 + NOP 3 +_tx_int14_vector_processing: + CALLP tx_int14_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int15_vector + .global _tx_int15_vector_processing +_tx_int15_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int15_vector_processing,B3 + MVKH _tx_int15_vector_processing,B3 + NOP 3 +_tx_int15_vector_processing: + CALLP tx_int15_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + diff --git a/ports/c667x/ccs/example_build/tx/.ccsproject b/ports/c667x/ccs/example_build/tx/.ccsproject new file mode 100644 index 00000000..bed925d4 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.ccsproject @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/tx/.cproject b/ports/c667x/ccs/example_build/tx/.cproject new file mode 100644 index 00000000..6fb6150d --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.cproject @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/tx/.project b/ports/c667x/ccs/example_build/tx/.project new file mode 100644 index 00000000..23e7d5ff --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.project @@ -0,0 +1,105 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + -k + + + org.eclipse.cdt.make.core.buildCommand + ${CCS_UTILS_DIR}/bin/gmake + + + org.eclipse.cdt.make.core.buildLocation + ${BuildDirectory} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + false + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..f653028c --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..d9be20e1 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Debug.832256006/append=true +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Debug.832256006/appendContributed=true +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Release.758214915/append=true +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Release.758214915/appendContributed=true diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..2adc7b1d --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 00000000..71fde590 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,6 @@ +#Fri Aug 03 15:02:35 PDT 2012 +com.ti.ccstudio.buildDefinitions.C6000.Debug.2070078368/internalBuilder/enabled=false +com.ti.ccstudio.buildDefinitions.C6000.Debug.2070078368/internalBuilder/ignoreErr=true +com.ti.ccstudio.buildDefinitions.C6000.Release.664540310/internalBuilder/enabled=false +com.ti.ccstudio.buildDefinitions.C6000.Release.664540310/internalBuilder/ignoreErr=true +eclipse.preferences.version=1 diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..094412e7 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +encoding//Debug/makefile=UTF-8 +encoding//Debug/objects.mk=UTF-8 +encoding//Debug/sources.mk=UTF-8 +encoding//Debug/src_generic/subdir_rules.mk=UTF-8 +encoding//Debug/src_generic/subdir_vars.mk=UTF-8 +encoding//Debug/src_port/subdir_rules.mk=UTF-8 +encoding//Debug/src_port/subdir_vars.mk=UTF-8 +encoding//Debug/subdir_rules.mk=UTF-8 +encoding//Debug/subdir_vars.mk=UTF-8 +encoding//Release/makefile=UTF-8 +encoding//Release/objects.mk=UTF-8 +encoding//Release/sources.mk=UTF-8 +encoding//Release/subdir_rules.mk=UTF-8 +encoding//Release/subdir_vars.mk=UTF-8 diff --git a/ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt b/ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt new file mode 100644 index 00000000..e954d96e --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt @@ -0,0 +1 @@ +"./tx_block_allocate.obj" "./tx_block_pool_cleanup.obj" "./tx_block_pool_create.obj" "./tx_block_pool_delete.obj" "./tx_block_pool_info_get.obj" "./tx_block_pool_initialize.obj" "./tx_block_pool_performance_info_get.obj" "./tx_block_pool_performance_system_info_get.obj" "./tx_block_pool_prioritize.obj" "./tx_block_release.obj" "./tx_byte_allocate.obj" "./tx_byte_pool_cleanup.obj" "./tx_byte_pool_create.obj" "./tx_byte_pool_delete.obj" "./tx_byte_pool_info_get.obj" "./tx_byte_pool_initialize.obj" "./tx_byte_pool_performance_info_get.obj" "./tx_byte_pool_performance_system_info_get.obj" "./tx_byte_pool_prioritize.obj" "./tx_byte_pool_search.obj" "./tx_byte_release.obj" "./tx_event_flags_cleanup.obj" "./tx_event_flags_create.obj" "./tx_event_flags_delete.obj" "./tx_event_flags_get.obj" "./tx_event_flags_info_get.obj" "./tx_event_flags_initialize.obj" "./tx_event_flags_performance_info_get.obj" "./tx_event_flags_performance_system_info_get.obj" "./tx_event_flags_set.obj" "./tx_event_flags_set_notify.obj" "./tx_initialize_high_level.obj" "./tx_initialize_kernel_enter.obj" "./tx_initialize_kernel_setup.obj" "./tx_mutex_cleanup.obj" "./tx_mutex_create.obj" "./tx_mutex_delete.obj" "./tx_mutex_get.obj" "./tx_mutex_info_get.obj" "./tx_mutex_initialize.obj" "./tx_mutex_performance_info_get.obj" "./tx_mutex_performance_system_info_get.obj" "./tx_mutex_prioritize.obj" "./tx_mutex_priority_change.obj" "./tx_mutex_put.obj" "./tx_queue_cleanup.obj" "./tx_queue_create.obj" "./tx_queue_delete.obj" "./tx_queue_flush.obj" "./tx_queue_front_send.obj" "./tx_queue_info_get.obj" "./tx_queue_initialize.obj" "./tx_queue_performance_info_get.obj" "./tx_queue_performance_system_info_get.obj" "./tx_queue_prioritize.obj" "./tx_queue_receive.obj" "./tx_queue_send.obj" "./tx_queue_send_notify.obj" "./tx_semaphore_ceiling_put.obj" "./tx_semaphore_cleanup.obj" "./tx_semaphore_create.obj" "./tx_semaphore_delete.obj" "./tx_semaphore_get.obj" "./tx_semaphore_info_get.obj" "./tx_semaphore_initialize.obj" "./tx_semaphore_performance_info_get.obj" "./tx_semaphore_performance_system_info_get.obj" "./tx_semaphore_prioritize.obj" "./tx_semaphore_put.obj" "./tx_semaphore_put_notify.obj" "./tx_thread_context_restore.obj" "./tx_thread_context_save.obj" "./tx_thread_create.obj" "./tx_thread_delete.obj" "./tx_thread_entry_exit_notify.obj" "./tx_thread_identify.obj" "./tx_thread_info_get.obj" "./tx_thread_initialize.obj" "./tx_thread_interrupt_control.obj" "./tx_thread_performance_info_get.obj" "./tx_thread_performance_system_info_get.obj" "./tx_thread_preemption_change.obj" "./tx_thread_priority_change.obj" "./tx_thread_relinquish.obj" "./tx_thread_reset.obj" "./tx_thread_resume.obj" "./tx_thread_schedule.obj" "./tx_thread_shell_entry.obj" "./tx_thread_sleep.obj" "./tx_thread_stack_analyze.obj" "./tx_thread_stack_build.obj" "./tx_thread_stack_error_handler.obj" "./tx_thread_stack_error_notify.obj" "./tx_thread_suspend.obj" "./tx_thread_system_preempt_check.obj" "./tx_thread_system_resume.obj" "./tx_thread_system_return.obj" "./tx_thread_system_suspend.obj" "./tx_thread_terminate.obj" "./tx_thread_time_slice.obj" "./tx_thread_time_slice_change.obj" "./tx_thread_timeout.obj" "./tx_thread_wait_abort.obj" "./tx_time_get.obj" "./tx_time_set.obj" "./tx_timer_activate.obj" "./tx_timer_change.obj" "./tx_timer_create.obj" "./tx_timer_deactivate.obj" "./tx_timer_delete.obj" "./tx_timer_expiration_process.obj" "./tx_timer_info_get.obj" "./tx_timer_initialize.obj" "./tx_timer_interrupt.obj" "./tx_timer_performance_info_get.obj" "./tx_timer_performance_system_info_get.obj" "./tx_timer_system_activate.obj" "./tx_timer_system_deactivate.obj" "./tx_timer_thread_entry.obj" "./tx_trace_buffer_full_notify.obj" "./tx_trace_disable.obj" "./tx_trace_enable.obj" "./tx_trace_event_filter.obj" "./tx_trace_event_unfilter.obj" "./tx_trace_initialize.obj" "./tx_trace_interrupt_control.obj" "./tx_trace_isr_enter_insert.obj" "./tx_trace_isr_exit_insert.obj" "./tx_trace_object_register.obj" "./tx_trace_object_unregister.obj" "./tx_trace_user_event_insert.obj" "./txe_block_allocate.obj" "./txe_block_pool_create.obj" "./txe_block_pool_delete.obj" "./txe_block_pool_info_get.obj" "./txe_block_pool_prioritize.obj" "./txe_block_release.obj" "./txe_byte_allocate.obj" "./txe_byte_pool_create.obj" "./txe_byte_pool_delete.obj" "./txe_byte_pool_info_get.obj" "./txe_byte_pool_prioritize.obj" "./txe_byte_release.obj" "./txe_event_flags_create.obj" "./txe_event_flags_delete.obj" "./txe_event_flags_get.obj" "./txe_event_flags_info_get.obj" "./txe_event_flags_set.obj" "./txe_event_flags_set_notify.obj" "./txe_mutex_create.obj" "./txe_mutex_delete.obj" "./txe_mutex_get.obj" "./txe_mutex_info_get.obj" "./txe_mutex_prioritize.obj" "./txe_mutex_put.obj" "./txe_queue_create.obj" "./txe_queue_delete.obj" "./txe_queue_flush.obj" "./txe_queue_front_send.obj" "./txe_queue_info_get.obj" "./txe_queue_prioritize.obj" "./txe_queue_receive.obj" "./txe_queue_send.obj" "./txe_queue_send_notify.obj" "./txe_semaphore_ceiling_put.obj" "./txe_semaphore_create.obj" "./txe_semaphore_delete.obj" "./txe_semaphore_get.obj" "./txe_semaphore_info_get.obj" "./txe_semaphore_prioritize.obj" "./txe_semaphore_put.obj" "./txe_semaphore_put_notify.obj" "./txe_thread_create.obj" "./txe_thread_delete.obj" "./txe_thread_entry_exit_notify.obj" "./txe_thread_info_get.obj" "./txe_thread_preemption_change.obj" "./txe_thread_priority_change.obj" "./txe_thread_relinquish.obj" "./txe_thread_reset.obj" "./txe_thread_resume.obj" "./txe_thread_suspend.obj" "./txe_thread_terminate.obj" "./txe_thread_time_slice_change.obj" "./txe_thread_wait_abort.obj" "./txe_timer_activate.obj" "./txe_timer_change.obj" "./txe_timer_create.obj" "./txe_timer_deactivate.obj" "./txe_timer_delete.obj" "./txe_timer_info_get.obj" \ No newline at end of file diff --git a/ports/c667x/ccs/example_build/tx/Release/objects.mk b/ports/c667x/ccs/example_build/tx/Release/objects.mk new file mode 100644 index 00000000..742c2da0 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := + diff --git a/ports/c667x/ccs/example_build/tx/Release/sources.mk b/ports/c667x/ccs/example_build/tx/Release/sources.mk new file mode 100644 index 00000000..9cbc2a26 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/sources.mk @@ -0,0 +1,110 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C55_SRCS := +A_SRCS := +ASM_UPPER_SRCS := +LDS_UPPER_SRCS := +CPP_SRCS := +CMD_SRCS := +O_SRCS := +C??_SRCS := +C64_SRCS := +C67_SRCS := +SA_SRCS := +S64_SRCS := +OPT_SRCS := +CXX_SRCS := +S67_SRCS := +S??_SRCS := +PDE_SRCS := +SV7A_SRCS := +K_SRCS := +CLA_SRCS := +S55_SRCS := +LD_UPPER_SRCS := +INO_SRCS := +LIB_SRCS := +ASM_SRCS := +S_UPPER_SRCS := +S43_SRCS := +LD_SRCS := +CMD_UPPER_SRCS := +C_UPPER_SRCS := +C++_SRCS := +C43_SRCS := +OBJ_SRCS := +LDS_SRCS := +S_SRCS := +CC_SRCS := +S62_SRCS := +C62_SRCS := +C_SRCS := +C55_DEPS := +C_UPPER_DEPS := +S67_DEPS := +S62_DEPS := +S_DEPS := +OPT_DEPS := +C??_DEPS := +ASM_UPPER_DEPS := +S??_DEPS := +C64_DEPS := +CXX_DEPS := +S64_DEPS := +INO_DEPS := +CLA_DEPS := +S55_DEPS := +SV7A_DEPS := +C62_DEPS := +C67_DEPS := +PDE_DEPS := +K_DEPS := +C_DEPS := +LIB_OUTPUTS := +CC_DEPS := +C++_DEPS := +C43_DEPS := +S43_DEPS := +OBJS := +ASM_DEPS := +S_UPPER_DEPS := +CPP_DEPS := +SA_DEPS := +C++_DEPS__QUOTED := +OPT_DEPS__QUOTED := +S_UPPER_DEPS__QUOTED := +SA_DEPS__QUOTED := +C??_DEPS__QUOTED := +S67_DEPS__QUOTED := +C55_DEPS__QUOTED := +CC_DEPS__QUOTED := +ASM_UPPER_DEPS__QUOTED := +SV7A_DEPS__QUOTED := +S??_DEPS__QUOTED := +OBJS__QUOTED := +C67_DEPS__QUOTED := +LIB_OUTPUTS__QUOTED := +K_DEPS__QUOTED := +S55_DEPS__QUOTED := +INO_DEPS__QUOTED := +C62_DEPS__QUOTED := +C_DEPS__QUOTED := +C_UPPER_DEPS__QUOTED := +C43_DEPS__QUOTED := +CPP_DEPS__QUOTED := +C64_DEPS__QUOTED := +CXX_DEPS__QUOTED := +CLA_DEPS__QUOTED := +S_DEPS__QUOTED := +ASM_DEPS__QUOTED := +S43_DEPS__QUOTED := +S64_DEPS__QUOTED := +S62_DEPS__QUOTED := +PDE_DEPS__QUOTED := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ + diff --git a/ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk b/ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk new file mode 100644 index 00000000..6ceea2dd --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk @@ -0,0 +1,22 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# Each subdirectory must supply rules for building sources it contributes +%.obj: ../%.c $(GEN_OPTS) | $(GEN_FILES) + @echo 'Building file: "$<"' + @echo 'Invoking: C6000 Compiler' + "C:/ti/ccsv8/tools/compiler/ti-cgt-c6000_8.2.4/bin/cl6x" -mv6600 --abi=eabi -O2 --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-c6000_8.2.4/include" --display_error_number --diag_warning=225 --preproc_with_compile --preproc_dependency="$(basename $( +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef int LONG; +typedef unsigned int ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 400 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 2048 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX C6xxx port. */ + +#define TX_INT_DISABLE 0x00 /* Disable interrupts */ +#define TX_INT_ENABLE 0x01 /* Enable interrupts */ + + +#ifndef TX_TIMER_TICKS_PER_SECOND +#define TX_TIMER_TICKS_PER_SECOND ((ULONG) 100) +#endif + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ +/* +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x01f0c014) +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif +*/ + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION +/* +#define TX_TIMER_INTERNAL_EXTENSION ULONG tx_timer_internal_padding; +*/ + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#ifdef TX_SKIP_INTRINSICS +unsigned int _tx_thread_interrupt_control(unsigned int); + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_control(TX_INT_DISABLE); +#define TX_RESTORE _tx_thread_interrupt_control(interrupt_save); +#else +#define TX_DISABLE interrupt_save = _disable_interrupts(); +#define TX_RESTORE _restore_interrupts(interrupt_save); +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX C667x/TI Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + diff --git a/ports/c667x/ccs/readme_threadx.txt b/ports/c667x/ccs/readme_threadx.txt new file mode 100644 index 00000000..d78707c7 --- /dev/null +++ b/ports/c667x/ccs/readme_threadx.txt @@ -0,0 +1,248 @@ + Microsoft's Azure RTOS ThreadX for TMS320C667x + + Using the TI Code Composer Tools + +1. Installation + +TI Code Composer Studio and the TI MCSDK must be installed prior to +building ThreadX. The following links can be used to download these +packages: + + +http://processors.wiki.ti.com/index.php/Download_CCS +http://software-dl.ti.com/sdoemb/sdoemb_public_sw/bios_mcsdk/latest/index_FDS.html + +It is assumed the tools are installed in the default directories: + +CCS path by default - c:\ti\ccsv(version number) +MCSDK path by default - c:\ti + +If the packages are installed in different directories, the ThreadX project +settings must be adjusted. + +2. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first open +the Azure RTOS Workspace inside your ThreadX installation directory. + + +3. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply import the CCS project file +"tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.lib. + + +4. Demonstration System + +The ThreadX demonstration is designed to execute on the C6678EVM evaluation board. + +Building the demonstration is easy; simply import the "sample_threadx_c6678evm" project. +Now select "Project -> Build Active Project" to build the ThreadX demonstration, +which produces the sample_threadx.out file in the "Debug" directory. You are now +ready to run the ThreadX demonstration on the C6678EVM evaluation board. + +Please refer to Chapter 6 of the ThreadX User Guide for a complete description +of this demonstration. + + +5. System Initialization + +The entry point in ThreadX for the TMS320C667x using the TI tools is at label +_c_int00. This is defined within the TI library. In addition, this is +where all static and global pre-set C variable initialization processing +takes place. + +The ThreadX initialization file tx_initialize_low_level.asm is responsible +for setting up various system data structures, the vector area, and a periodic +timer interrupt source. By default, the vector area is defined to be located in +the "vectors" section, which is defined at the top of tx_initialize_low_level.asm. +This area is located at address 0 for the demonstration. + +tx_initialize_low_level.asm is also where initialization of a periodic timer +interrupt source should take place. + +In addition, _tx_initialize_low_level determines the first available address +for use by the application. By default, free memory is assumed to start after +the .zend section in RAM (defined in tx_initialize_low_level). This section +must be placed at the end of your other RAM sections. Please see sample_threadx.cmd +for an example. The address of this section is passed to the application definition +function, tx_application_define. + + +6. Register Usage and Stack Frames + +The TI TMS320C667x compiler assumes that registers A0-A9, A16-A31, B0-B9, and +B16-B31 are scratch registers for each function. All other registers used by +a C function must be preserved by the function. ThreadX takes advantage of this +in situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved context +of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x04 1 0 + 0x08 CSR CSR + 0x0C IPR B3 + 0x10 AMR AMR + 0x14 A0 A10 + 0x18 A1 A11 + 0x1C A2 A12 + 0x20 A3 A13 + 0x24 A4 A14 + 0x28 A5 A15 + 0x2C A6 B10 + 0x30 A7 B11 + 0x34 A8 B12 + 0x38 A9 B13 + 0x3C A10 ILC + 0x40 A11 RILC + 0x44 A12 + 0x48 A13 + 0x4C A14 + 0x50 A15 + 0x54 B0 + 0x58 B1 + 0x5C B2 + 0x60 B3 + 0x64 B4 + 0x68 B5 + 0x6C B6 + 0x70 B7 + 0x74 B8 + 0x78 B9 + 0x7C B10 + 0x80 B11 + 0x84 B12 + 0x88 B13 + 0x8C A16 + 0x90 A17 + 0x94 A18 + 0x98 A19 + 0x9C A20 + 0xA0 A21 + 0xA4 A22 + 0xA8 A23 + 0xAC A24 + 0xB0 A25 + 0xB4 A26 + 0xB8 A27 + 0xBC A28 + 0xC0 A29 + 0xC4 A30 + 0xC8 A31 + 0xCC B16 + 0xD0 B17 + 0xD4 B18 + 0xD8 B19 + 0xDC B20 + 0xE0 B21 + 0xE4 B22 + 0xE8 B23 + 0xEC B24 + 0xF0 B25 + 0xF4 B26 + 0xF8 B27 + 0xFC B28 + 0x100 B29 + 0x104 B30 + 0x108 B31 + 0x10C ILC + 0x110 RILC + 0x114 ITSR + + +7. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some performance. +To make it run faster, you can replace the -g compiler option +to a -O3 in the ThreadX project file to enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +8. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for +TMS320C667x targets. There are a certain set of requirements that are +defined in the following sub-sections: + + +8.1 Vector Area + +The TMS320C667x interrupt vectors at in the section "vectors" and is defined at +the top of tx_initialize_low_level.asm. Each interrupt vector entry contains +a jump to a template interrupt processing shell. + + +8.2 Interrupt Service Routine Shells + +The following interrupt processing shells are defined at the bottom of +tx_initialize_low_level.asm: + + + __tx_int4_ISR + __tx_int5_ISR + __tx_int6_ISR + __tx_int7_ISR + __tx_int8_ISR + __tx_int9_ISR + __tx_int10_ISR + __tx_int11_ISR + __tx_int12_ISR + __tx_int13_ISR + __tx_int14_ISR + __tx_int15_ISR + +Each interrupt ISR is entered with B3, A0-A4 is available (these registers are +saved in the initial vector processing). The default interrupt handling +includes calls to __tx_thread_context_save and __tx_thread_context_restore. +Application ISR processing can be added between the context save/restore +calls. Note that only the compiler scratch registers are available for use +after context save return to the ISR. + +High-frequency interrupt handlers might not want to perform context +save/restore processing on each interrupt. If this is the case, any +additional registers used must be saved and restored by the ISR and +the interrupt return processing must restore the registers saved by the +initial vector processing. This can be accomplished by adding the +following code to the end of the custom ISR handling: + + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + B IRP ; Return to point of interrupt +|| LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for TMS320C667x using TI Code Composer tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/c667x/ccs/src/tx_thread_context_restore.asm b/ports/c667x/ccs/src/tx_thread_context_restore.asm new file mode 100644 index 00000000..58861b58 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_context_restore.asm @@ -0,0 +1,343 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + .global _tx_thread_context_restore +_tx_thread_context_restore: +; +; /* Lockout interrupts. */ +; + MVC CSR,B0 ; Pickup CSR + AND -2,B0,B0 ; Build interrupt lockout value + MVC B0,CSR ; Lockout interrupts +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + MVKL _tx_thread_system_state,A0 ; Build address of system state + MVKH _tx_thread_system_state,A0 ; + LDW *A0,A1 ; Pickup system state variable + MVKL _tx_thread_current_ptr,A2 ; Build address of current thread ptr + NOP 3 ; Delay slots + SUB A1,1,A1 ; Decrement system state + [!A1] B _tx_thread_not_nested_restore ; If 0, not a nested restore + MVKH _tx_thread_current_ptr,A2 ; + LDW *A2,A3 ; Pickup current thread pointer + STW A1,*A0 ; Store system state + NOP 2 ; Delay slots +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDW *+SP(8),B0 ; Recover saved CSR + LDW *+SP(12),B1 ; Recover saved IRP + LDW *+SP(16),B2 ; Recover saved AMR + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(40),A5 ; Recover A5 + LDW *+SP(44),A6 ; Recover A6 + LDW *+SP(48),A7 ; Recover A7 + LDW *+SP(52),A8 ; Recover A8 + LDW *+SP(56),A9 ; Recover A9 + MVC B0,CSR ; Setup CSR + MVC B1,IRP ; Setup IRP + MVC B2,AMR ; Setup AMR + LDW *+SP(268),B0 ; Recover saved ILC + LDW *+SP(272),B1 ; Recover saved RILC + LDW *+SP(276),B2 ; Recover saved ITSR + NOP 4 + MVC B0,ILC ; Setup ILC + MVC B1,RILC ; Setup RILC + MVC B2,ITSR ; Setup ITSR + LDW *+SP(84),B0 ; Recover B0 + LDW *+SP(88),B1 ; Recover B1 + LDW *+SP(92),B2 ; Recover B2 + LDW *+SP(100),B4 ; Recover B4 + LDW *+SP(104),B5 ; Recover B5 + LDW *+SP(108),B6 ; Recover B6 + LDW *+SP(112),B7 ; Recover B7 + LDW *+SP(116),B8 ; Recover B8 + LDW *+SP(140),A16 ; Recover A16 + LDW *+SP(144),A17 ; Recover A17 + LDW *+SP(148),A18 ; Recover A18 + LDW *+SP(152),A19 ; Recover A19 + LDW *+SP(156),A20 ; Recover A20 + LDW *+SP(160),A21 ; Recover A21 + LDW *+SP(164),A22 ; Recover A22 + LDW *+SP(168),A23 ; Recover A23 + LDW *+SP(172),A24 ; Recover A24 + LDW *+SP(176),A25 ; Recover A25 + LDW *+SP(180),A26 ; Recover A26 + LDW *+SP(184),A27 ; Recover A27 + LDW *+SP(188),A28 ; Recover A28 + LDW *+SP(192),A29 ; Recover A29 + LDW *+SP(196),A30 ; Recover A30 + LDW *+SP(200),A31 ; Recover A31 + LDW *+SP(204),B16 ; Recover B16 + LDW *+SP(208),B17 ; Recover B17 + LDW *+SP(212),B18 ; Recover B18 + LDW *+SP(216),B19 ; Recover B19 + LDW *+SP(220),B20 ; Recover B20 + LDW *+SP(224),B21 ; Recover B21 + LDW *+SP(228),B22 ; Recover B22 + LDW *+SP(232),B23 ; Recover B23 + LDW *+SP(236),B24 ; Recover B24 + LDW *+SP(240),B25 ; Recover B25 + LDW *+SP(244),B26 ; Recover B26 + LDW *+SP(248),B27 ; Recover B27 + LDW *+SP(252),B28 ; Recover B28 + LDW *+SP(256),B29 ; Recover B29 + LDW *+SP(260),B30 ; Recover B30 + LDW *+SP(264),B31 ; Recover B31 + B IRP ; Return to point of interrupt +|| LDW *+SP(120),B9 ; Recover B9 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +; } +_tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + NOP ; Delay + MV A3,A1 ; Move thread pointer into A1 + [!A1] B _tx_thread_schedule ; If null, idle system restore + MVKL _tx_thread_preempt_disable,A0 ; Build preempt disable flag address + MVKH _tx_thread_preempt_disable,A0 ; + MVKL _tx_thread_execute_ptr,A4 ; Build execute thread pointer + MVKH _tx_thread_execute_ptr,A4 ; + LDW *A0,B1 ; Pickup preempt disable flag + + LDW *A4,A6 ; Pickup next thread to execute + NOP 4 ; Delay slot + CMPEQ A6,A1,A7 ; Determine if threads are the same? + ADD A7,B1,B1 ; Add results together + [B1] B _tx_thread_no_preempt_restore ; If set, skip preeemption + LDW *+A1(8),A6 ; Recover thread's stack pointer + MVKL _tx_timer_time_slice,A5 ; Build time slice address + MVKH _tx_timer_time_slice,A5 ; + LDW *A5,B1 ; Pickup current time-slice + NOP ; Delay slot +; +; +_tx_thread_preempt_restore: +; +; + MVKL 1,A0 ; Build the interrupt stack type + STW A0,*+A6(4) ; Save stack type +; +; /* Store the remaining registers on the thread's stack. */ +; + STW A10,*+A6(60) ; Save A10 + STW A11,*+A6(64) ; Save A11 + STW A12,*+A6(68) ; Save A12 + STW A13,*+A6(72) ; Save A13 + STW A14,*+A6(76) ; Save A14 + STW A15,*+A6(80) ; Save A15 (FP) + STW B10,*+A6(124) ; Save B10 + ADDK 128,A6 ; Move stack pointer + STW B11,*+A6(0) ; Save B11 + STW B12,*+A6(4) ; Save B12 + STW B13,*+A6(8) ; Save B13 +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; +; } +_tx_thread_dont_save_ts: +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler + STW B1,*+A1(24) ; Store current time-slice + ZERO A3 ; Clear value + STW A3,*A2 ; Set current thread pointer to NULL + STW A3,*A5 ; Set time slice to 0 + NOP ; Delay +; +; +_tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread. */ +; +; /* Pickup the saved stack pointer. */ +; SP = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + MV A6,SP ; Setup real stack pointer + LDW *+SP(8),B0 ; Recover saved CSR + LDW *+SP(12),B1 ; Recover saved IRP + LDW *+SP(16),B2 ; Recover saved AMR + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(40),A5 ; Recover A5 + LDW *+SP(44),A6 ; Recover A6 + LDW *+SP(48),A7 ; Recover A7 + LDW *+SP(52),A8 ; Recover A8 + LDW *+SP(56),A9 ; Recover A9 + MVC B0,CSR ; Setup CSR + MVC B1,IRP ; Setup IRP + MVC B2,AMR ; Setup AMR + LDW *+SP(268),B0 ; Recover saved ILC + LDW *+SP(272),B1 ; Recover saved RILC + LDW *+SP(276),B2 ; Recover saved ITSR + NOP 4 ; Delay + MVC B0,ILC ; Setup ILC + MVC B1,RILC ; Setup RILC + MVC B2,ITSR ; Setup ITSR + LDW *+SP(84),B0 ; Recover B0 + LDW *+SP(88),B1 ; Recover B1 + LDW *+SP(92),B2 ; Recover B2 + LDW *+SP(100),B4 ; Recover B4 + LDW *+SP(104),B5 ; Recover B5 + LDW *+SP(108),B6 ; Recover B6 + LDW *+SP(112),B7 ; Recover B7 + LDW *+SP(116),B8 ; Recover B8 + LDW *+SP(140),A16 ; Recover A16 + LDW *+SP(144),A17 ; Recover A17 + LDW *+SP(148),A18 ; Recover A18 + LDW *+SP(152),A19 ; Recover A19 + LDW *+SP(156),A20 ; Recover A20 + LDW *+SP(160),A21 ; Recover A21 + LDW *+SP(164),A22 ; Recover A22 + LDW *+SP(168),A23 ; Recover A23 + LDW *+SP(172),A24 ; Recover A24 + LDW *+SP(176),A25 ; Recover A25 + LDW *+SP(180),A26 ; Recover A26 + LDW *+SP(184),A27 ; Recover A27 + LDW *+SP(188),A28 ; Recover A28 + LDW *+SP(192),A29 ; Recover A29 + LDW *+SP(196),A30 ; Recover A30 + LDW *+SP(200),A31 ; Recover A31 + LDW *+SP(204),B16 ; Recover B16 + LDW *+SP(208),B17 ; Recover B17 + LDW *+SP(212),B18 ; Recover B18 + LDW *+SP(216),B19 ; Recover B19 + LDW *+SP(220),B20 ; Recover B20 + LDW *+SP(224),B21 ; Recover B21 + LDW *+SP(228),B22 ; Recover B22 + LDW *+SP(232),B23 ; Recover B23 + LDW *+SP(236),B24 ; Recover B24 + LDW *+SP(240),B25 ; Recover B25 + LDW *+SP(244),B26 ; Recover B26 + LDW *+SP(248),B27 ; Recover B27 + LDW *+SP(252),B28 ; Recover B28 + LDW *+SP(256),B29 ; Recover B29 + LDW *+SP(260),B30 ; Recover B30 + LDW *+SP(264),B31 ; Recover B31 + B IRP ; Return to point of interrupt +|| LDW *+SP(120),B9 ; Recover B9 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +; } +;} + diff --git a/ports/c667x/ccs/src/tx_thread_context_save.asm b/ports/c667x/ccs/src/tx_thread_context_save.asm new file mode 100644 index 00000000..ea455f8f --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_context_save.asm @@ -0,0 +1,274 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + .global _tx_thread_context_save +_tx_thread_context_save: +; +; /* Upon entry to this routine, it is assumed that all interrupts are locked +; out, an initial stack frame of 288 bytes has been allocated and registers +; A0, A1, A2, A3, A4, and B3 have been saved in the frame. Additionally, +; it is assumed that register B3 contains the ISR's return address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + MVKL _tx_thread_system_state,A0 ; Build address of system state + MVKH _tx_thread_system_state,A0 ; + LDW *A0,A1 ; Pickup current system state + STW A5,*+SP(40) ; Save A5 + STW A6,*+SP(44) ; Save A6 + STW A7,*+SP(48) ; Save A7 + STW A8,*+SP(52) ; Save A8 + [!A1] B _tx_thread_not_nested_save ; If 0, not a nested save condition + MVKL _tx_thread_current_ptr,A3 ; Build address of current thread ptr + MVKH _tx_thread_current_ptr,A3 ; + LDW *A3,A2 ; Pickup current thread pointer + ADD 1,A1,A1 ; Increment the system state (nested) counter + STW A1,*A0 ; Store system state +; +; /* Nested interrupt condition. Save remaining scratch registers, and control registers +; and return to calling ISR. */ +; + STW A9,*+SP(56) ; Save A9 + STW B0,*+SP(84) ; Save B0 + STW B1,*+SP(88) ; Save B1 + STW B2,*+SP(92) ; Save B2 + ; B3 is already saved! + STW B4,*+SP(100) ; Save B4 + STW B5,*+SP(104) ; Save B5 + STW B6,*+SP(108) ; Save B6 + STW B7,*+SP(112) ; Save B7 + STW B8,*+SP(116) ; Save B8 + STW B9,*+SP(120) ; Save B9 + MVC CSR,B0 ; Pickup CSR + B B3 ; Return to calling ISR + MVC IRP,B1 ; Pickup IRP + MVC AMR,B2 ; Pickup AMR + STW B0,*+SP(8) ; Save CSR + STW B1,*+SP(12) ; Save IRP + STW B2,*+SP(16) ; Save AMR + ZERO B0 ; Clear B0 + MVC B0,AMR ; Clear AMR for linear addressing in ISR + STW A16,*+SP(140) ; Save A16 + STW A17,*+SP(144) ; Save A17 + STW A18,*+SP(148) ; Save A18 + STW A19,*+SP(152) ; Save A19 + STW A20,*+SP(156) ; Save A20 + STW A21,*+SP(160) ; Save A21 + STW A22,*+SP(164) ; Save A22 + STW A23,*+SP(168) ; Save A23 + STW A24,*+SP(172) ; Save A24 + STW A25,*+SP(176) ; Save A25 + STW A26,*+SP(180) ; Save A26 + STW A27,*+SP(184) ; Save A27 + STW A28,*+SP(188) ; Save A28 + STW A29,*+SP(192) ; Save A29 + STW A30,*+SP(196) ; Save A30 + STW A31,*+SP(200) ; Save A31 + STW B16,*+SP(204) ; Save B16 + STW B17,*+SP(208) ; Save B17 + STW B18,*+SP(212) ; Save B18 + STW B19,*+SP(216) ; Save B19 + STW B20,*+SP(220) ; Save B20 + STW B21,*+SP(224) ; Save B21 + STW B22,*+SP(228) ; Save B22 + STW B23,*+SP(232) ; Save B23 + STW B24,*+SP(236) ; Save B24 + STW B25,*+SP(240) ; Save B25 + STW B26,*+SP(244) ; Save B26 + STW B27,*+SP(248) ; Save B27 + STW B28,*+SP(252) ; Save B28 + STW B29,*+SP(256) ; Save B29 + STW B30,*+SP(260) ; Save B30 + STW B31,*+SP(264) ; Save B31 + MVC ILC,B0 ; Pickup ILC + MVC RILC,B1 ; Pickup RILC + MVC ITSR,B2 ; Pickup ITSR + STW B0,*+SP(268) ; Save ILC + STW B1,*+SP(272) ; Save RILC + STW B2,*+SP(276) ; Save ITSR +; +_tx_thread_not_nested_save: +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + MVKL _tx_thread_system_stack_ptr,A0 ; Build address of system + MVKH _tx_thread_system_stack_ptr,A0 ; stack pointer + MV A2,A1 ; Transfer to A1 for B compare + [!A1] B _tx_thread_idle_system_save ; If Null, idle system save + STW A9,*+SP(56) ; Save A9 + STW B0,*+SP(84) ; Save B0 + STW B1,*+SP(88) ; Save B1 + STW B2,*+SP(92) ; Save B2 + NOP ; Delay slot +; +; /* At this point, a thread was interrupted and the remainder of its scratch and +; control registers must be saved. */ +; + ; B3 was already saved! + STW B4,*+SP(100) ; Save B4 + STW B5,*+SP(104) ; Save B5 + STW B6,*+SP(108) ; Save B6 + STW B7,*+SP(112) ; Save B7 + STW B8,*+SP(116) ; Save B8 + STW B9,*+SP(120) ; Save B9 + MVC CSR,B0 ; Pickup CSR + MVC IRP,B1 ; Pickup IRP + MVC AMR,B2 ; Pickup AMR + STW B0,*+SP(8) ; Save CSR + STW B1,*+SP(12) ; Save IRP + STW B2,*+SP(16) ; Save AMR + ZERO B0 ; Clear B0 + MVC B0,AMR ; Clear AMR for linear addressing in ISR + STW A16,*+SP(140) ; Save A16 + STW A17,*+SP(144) ; Save A17 + STW A18,*+SP(148) ; Save A18 + STW A19,*+SP(152) ; Save A19 + STW A20,*+SP(156) ; Save A20 + STW A21,*+SP(160) ; Save A21 + STW A22,*+SP(164) ; Save A22 + STW A23,*+SP(168) ; Save A23 + STW A24,*+SP(172) ; Save A24 + STW A25,*+SP(176) ; Save A25 + STW A26,*+SP(180) ; Save A26 + STW A27,*+SP(184) ; Save A27 + STW A28,*+SP(188) ; Save A28 + STW A29,*+SP(192) ; Save A29 + STW A30,*+SP(196) ; Save A30 + STW A31,*+SP(200) ; Save A31 + STW B16,*+SP(204) ; Save B16 + STW B17,*+SP(208) ; Save B17 + STW B18,*+SP(212) ; Save B18 + STW B19,*+SP(216) ; Save B19 + STW B20,*+SP(220) ; Save B20 + STW B21,*+SP(224) ; Save B21 + STW B22,*+SP(228) ; Save B22 + STW B23,*+SP(232) ; Save B23 + STW B24,*+SP(236) ; Save B24 + STW B25,*+SP(240) ; Save B25 + STW B26,*+SP(244) ; Save B26 + STW B27,*+SP(248) ; Save B27 + STW B28,*+SP(252) ; Save B28 + STW B29,*+SP(256) ; Save B29 + STW B30,*+SP(260) ; Save B30 + STW B31,*+SP(264) ; Save B31 + MVC ILC,B0 ; Pickup ILC + MVC RILC,B1 ; Pickup RILC + MVC ITSR,B2 ; Pickup ITSR + STW B0,*+SP(268) ; Save ILC + STW B1,*+SP(272) ; Save RILC + STW B2,*+SP(276) ; Save ITSR +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = SP; +; +; /* Switch to the system stack. */ +; SP = _tx_thread_system_stack_ptr; +; + STW SP,*+A1(8) ; Save stack pointer + B B3 ; Return to calling ISR + LDW *A0,SP ; Switch to system stack + NOP 4 ; Stack pointer is valid upon return! +; +; } +; else +; { +; +_tx_thread_idle_system_save: +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to ISR +; processing. */ +; + B B3 ; Return to ISR + ADDK.S2 288,SP ; Recover stack space + NOP 4 ; Delay slot +; +; } +;} + diff --git a/ports/c667x/ccs/src/tx_thread_interrupt_control.asm b/ports/c667x/ccs/src/tx_thread_interrupt_control.asm new file mode 100644 index 00000000..ac7d467d --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_interrupt_control.asm @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FP .set A15 +DP .set B14 +SP .set B15 +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + .global _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MVC CSR,B0 ; Pickup current CSR +; +; /* Apply the new interrupt posture. */ +; + B B3 ; Return to caller + AND -2,B0,B0 ; Clear GIE bit + OR A4,B0,B0 ; Build new interrupt posture + MVC CSR,B1 ; Return previous posture + MVC B0,CSR ; Apply new interrupt posture + AND 1,B1,A4 ; Clear non-GIE bits +; +;} + diff --git a/ports/c667x/ccs/src/tx_thread_schedule.asm b/ports/c667x/ccs/src/tx_thread_schedule.asm new file mode 100644 index 00000000..57da66d1 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_schedule.asm @@ -0,0 +1,254 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; +; + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + .global _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MVC CSR,B0 ; Pickup current CSR + OR 1,B0,B0 ; Build interrupt enable value + MVC B0,CSR ; Enable interrupts + MVKL _tx_thread_execute_ptr,A0 ; Build address of execute pointer + MVKH _tx_thread_execute_ptr,A0 ; +; +; /* Wait for a thread to execute. */ +; do +; { +; +_tx_thread_schedule_loop: +; + LDW *A0,A1 ; Pickup next thread to execute + NOP 4 ; Delay slots + [!A1] B _tx_thread_schedule_loop ; If Null, just wait here for thread + ; to become ready + MV A1,A4 ; Move thread pointer to A4 + MVKL _tx_thread_current_ptr,A1 ; Build address of current thread ptr + MVKH _tx_thread_current_ptr,A1 ; + MVKL _tx_timer_time_slice,A2 ; Build address of time-slice + MVKH _tx_timer_time_slice,A2 ; +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + AND -2,B0,B0 ; Build interrupt lockout value + MVC B0,CSR ; Lockout interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDW *+A4(4),A3 ; Pickup run-count + LDW *+A4(8),SP ; Switch to thread's stack + LDW *+A4(24),B1 ; Pickup time-slice + STW A4,*A1 ; Setup current pointer + NOP ; Delay +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + ADD 1,A3,A3 ; Increment run-counter + LDW *+SP(4),B0 ; Pickup stack-type + STW A3,*+A4(4) ; Store run-counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + STW B1,*A2 ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; SP = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + NOP 2 ; Delay slots + [B0] B _tx_thread_interrupt_stack ; Look for interrupt stack frame + LDW *+SP(8),B0 ; Pickup saved CSR + LDW *+SP(12),B3 ; Pickup saved B3/IPR + LDW *+SP(16),B1 ; Pickup saved AMR + LDW *+SP(20),A10 ; Restore A10 + LDW *+SP(24),A11 ; Restore A11 + LDW *+SP(28),A12 ; Restore A12 + LDW *+SP(32),A13 ; Restore A13 + MVC B0,CSR ; Restore CSR + MVC B1,AMR ; Restore AMR + LDW *+SP(36),A14 ; Restore A14 + LDW *+SP(40),A15 ; Restore A15 + LDW *+SP(44),B10 ; Restore B10 + LDW *+SP(48),B11 ; Restore B11 + LDW *+SP(52),B12 ; Restore B12 + LDW *+SP(56),B13 ; Restore B13 + LDW *+SP(60),B0 ; Restore ILC + LDW *+SP(64),B1 ; Restore RILC + NOP 4 ; Delay slots + MVC B0,ILC ; Restore ILC + MVC B1,RILC ; Restore RILC + B B3 ; Return to caller + ADDK 64,SP ; Recover stack space + NOP 4 ; Delay slots +; +_tx_thread_interrupt_stack: + MVC B0,CSR ; Restore CSR + MVC B3,IRP ; Restore IPR + MVC B1,AMR ; Restore AMR + LDW *+SP(268),B0 ; Recover saved ILC + LDW *+SP(272),B1 ; Recover saved RILC + LDW *+SP(276),B2 ; Recover saved ITSR + NOP 4 ; Delay + MVC B0,ILC ; Setup ILC + MVC B1,RILC ; Setup RILC + MVC B2,ITSR ; Setup ITSR + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(40),A5 ; Recover A5 + LDW *+SP(44),A6 ; Recover A6 + LDW *+SP(48),A7 ; Recover A7 + LDW *+SP(52),A8 ; Recover A8 + LDW *+SP(56),A9 ; Recover A9 + LDW *+SP(60),A10 ; Recover A10 + LDW *+SP(64),A11 ; Recover A11 + LDW *+SP(68),A12 ; Recover A12 + LDW *+SP(72),A13 ; Recover A13 + LDW *+SP(76),A14 ; Recover A14 + LDW *+SP(80),A15 ; Recover A15 (FP) + LDW *+SP(84),B0 ; Recover B0 + LDW *+SP(88),B1 ; Recover B1 + LDW *+SP(92),B2 ; Recover B2 + LDW *+SP(96),B3 ; Recover B3 + LDW *+SP(100),B4 ; Recover B4 + LDW *+SP(104),B5 ; Recover B5 + LDW *+SP(108),B6 ; Recover B6 + LDW *+SP(112),B7 ; Recover B7 + LDW *+SP(116),B8 ; Recover B8 + LDW *+SP(120),B9 ; Recover B9 + LDW *+SP(124),B10 ; Recover B10 + LDW *+SP(128),B11 ; Recover B11 + LDW *+SP(140),A16 ; Recover A16 + LDW *+SP(144),A17 ; Recover A17 + LDW *+SP(148),A18 ; Recover A18 + LDW *+SP(152),A19 ; Recover A19 + LDW *+SP(156),A20 ; Recover A20 + LDW *+SP(160),A21 ; Recover A21 + LDW *+SP(164),A22 ; Recover A22 + LDW *+SP(168),A23 ; Recover A23 + LDW *+SP(172),A24 ; Recover A24 + LDW *+SP(176),A25 ; Recover A25 + LDW *+SP(180),A26 ; Recover A26 + LDW *+SP(184),A27 ; Recover A27 + LDW *+SP(188),A28 ; Recover A28 + LDW *+SP(192),A29 ; Recover A29 + LDW *+SP(196),A30 ; Recover A30 + LDW *+SP(200),A31 ; Recover A31 + LDW *+SP(204),B16 ; Recover B16 + LDW *+SP(208),B17 ; Recover B17 + LDW *+SP(212),B18 ; Recover B18 + LDW *+SP(216),B19 ; Recover B19 + LDW *+SP(220),B20 ; Recover B20 + LDW *+SP(224),B21 ; Recover B21 + LDW *+SP(228),B22 ; Recover B22 + LDW *+SP(232),B23 ; Recover B23 + LDW *+SP(236),B24 ; Recover B24 + LDW *+SP(240),B25 ; Recover B25 + LDW *+SP(244),B26 ; Recover B26 + LDW *+SP(248),B27 ; Recover B27 + LDW *+SP(252),B28 ; Recover B28 + LDW *+SP(256),B29 ; Recover B29 + LDW *+SP(260),B30 ; Recover B30 + LDW *+SP(264),B31 ; Recover B31 + B IRP ; Return to point of interrupt +|| LDW *+SP(132),B12 ; Recover B12 + LDW *+SP(136),B13 ; Recover B13 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +;} + diff --git a/ports/c667x/ccs/src/tx_thread_stack_build.asm b/ports/c667x/ccs/src/tx_thread_stack_build.asm new file mode 100644 index 00000000..8e6c0559 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_stack_build.asm @@ -0,0 +1,257 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +ADDRESS_MSK .set 0xFFFFFFF0 +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + .global _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the C667x should look like the following after it is built: +; +; Stack Top: N/A Available for use +; 1 Interrupt stack frame type 4 +; CSR Initial value for CSR 8 +; IRP Initial thread entry 12 +; AMR Initial thread addressing mode 16 +; A0 Initial A0 20 +; A1 Initial A1 24 +; A2 Initial A2 28 +; A3 Initial A3 32 +; A4 Initial A4 36 +; A5 Initial A5 40 +; A6 Initial A6 44 +; A7 Initial A7 48 +; A8 Initial A8 52 +; A9 Initial A9 56 +; A10 Initial A10 60 +; A11 Initial A11 64 +; A12 Initial A12 68 +; A13 Initial A13 72 +; A14 Initial A14 76 +; A15 (FP) Initial A15 (FP) 80 +; B0 Initial B0 84 +; B1 Initial B1 88 +; B2 Initial B2 92 +; B3 Initial B3 96 +; B4 Initial B4 100 +; B5 Initial B5 104 +; B6 Initial B6 108 +; B7 Initial B7 112 +; B8 Initial B8 116 +; B9 Initial B9 120 +; B10 Initial B10 124 +; B11 Initial B11 128 +; B12 Initial B12 132 +; B13 Initial B13 136 +; A16 Initial A16 140 +; A17 Initial A17 144 +; A18 Initial A18 148 +; A19 Initial A19 152 +; A20 Initial A20 156 +; A21 Initial A21 160 +; A22 Initial A22 164 +; A23 Initial A23 168 +; A24 Initial A24 172 +; A25 Initial A25 176 +; A26 Initial A26 180 +; A27 Initial A27 184 +; A28 Initial A28 188 +; A29 Initial A29 192 +; A30 Initial A30 196 +; A31 Initial A31 200 +; B16 Initial B16 204 +; B17 Initial B17 208 +; B18 Initial B18 212 +; B19 Initial B19 216 +; B20 Initial B20 220 +; B21 Initial B21 224 +; B22 Initial B22 228 +; B23 Initial B23 232 +; B24 Initial B24 236 +; B25 Initial B25 240 +; B26 Initial B26 244 +; B27 Initial B27 248 +; B28 Initial B28 252 +; B29 Initial B29 256 +; B30 Initial B30 260 +; B31 Initial B31 264 +; ILC Initial ILC 268 +; RILC Initial RILC 272 +; ITSR Initial ITSR 276 + + +; +; Stack Bottom: (higher memory address) */ +; + LDW *+A4(16),A0 ; Pickup end of stack area + MVKL ADDRESS_MSK,A1 ; Build address mask + MVKH ADDRESS_MSK,A1 ; + MVC CSR,B0 ; Pickup current CSR + AND -2,B0,B0 ; Clear GIE bit + OR 2,B0,B0 ; Set PGIE bit for interrupt return + AND A1,A0,A0 ; Ensure alignment + MVKL 288,A2 ; Calculate stack size + SUB A0,A2,A0 ; Allocate space on thread's stack +; +; /* Actually build the stack frame. */ +; + MVKL 1,A2 ; Build stack type + ZERO A3 ; Clear value + STW A2,*+A0(4) ; Interrupt stack type + STW B0,*+A0(8) ; Initial CSR + STW B4,*+A0(12) ; Thread shell entry point + STW A3,*+A0(16) ; Initial AMR + STW A3,*+A0(20) ; Initial A0 + STW A3,*+A0(24) ; Initial A1 + STW A3,*+A0(28) ; Initial A2 + STW A3,*+A0(32) ; Initial A3 + STW A3,*+A0(36) ; Initial A4 + STW A3,*+A0(40) ; Initial A5 + STW A3,*+A0(44) ; Initial A6 + STW A3,*+A0(48) ; Initial A7 + STW A3,*+A0(52) ; Initial A8 + STW A3,*+A0(56) ; Initial A9 + STW A3,*+A0(60) ; Initial A10 + STW A3,*+A0(64) ; Initial A11 + STW A3,*+A0(68) ; Initial A12 + STW A3,*+A0(72) ; Initial A13 + STW A3,*+A0(76) ; Initial A14 + STW A3,*+A0(80) ; Initial A15 + STW A3,*+A0(84) ; Initial B0 + STW A3,*+A0(88) ; Initial B1 + STW A3,*+A0(92) ; Initial B2 + STW A3,*+A0(96) ; Initial B3 + STW A3,*+A0(100) ; Initial B4 + STW A3,*+A0(104) ; Initial B5 + STW A3,*+A0(108) ; Initial B6 + STW A3,*+A0(112) ; Initial B7 + STW A3,*+A0(116) ; Initial B8 + STW A3,*+A0(120) ; Initial B9 + STW A3,*+A0(124) ; Initial B10 + MVKL 128,A2 ; Stack adjustment value + ADD A2,A0,A2 ; Adjust pointer into stack frame + STW A3,*+A2(0) ; Initial B11 + STW A3,*+A2(4) ; Initial B12 + STW A3,*+A2(8) ; Initial B13 + STW A3,*+A2(12) ; Initial A16 + STW A3,*+A2(16) ; Initial A17 + STW A3,*+A2(20) ; Initial A18 + STW A3,*+A2(24) ; Initial A19 + STW A3,*+A2(28) ; Initial A20 + STW A3,*+A2(32) ; Initial A21 + STW A3,*+A2(36) ; Initial A22 + STW A3,*+A2(40) ; Initial A23 + STW A3,*+A2(44) ; Initial A24 + STW A3,*+A2(48) ; Initial A25 + STW A3,*+A2(52) ; Initial A26 + STW A3,*+A2(56) ; Initial A27 + STW A3,*+A2(60) ; Initial A28 + STW A3,*+A2(64) ; Initial A29 + STW A3,*+A2(68) ; Initial A30 + STW A3,*+A2(72) ; Initial A31 + STW A3,*+A2(76) ; Initial B16 + STW A3,*+A2(80) ; Initial B17 + STW A3,*+A2(84) ; Initial B18 + STW A3,*+A2(88) ; Initial B19 + STW A3,*+A2(92) ; Initial B20 + STW A3,*+A2(96) ; Initial B21 + STW A3,*+A2(100) ; Initial B22 + STW A3,*+A2(104) ; Initial B23 + STW A3,*+A2(108) ; Initial B24 + STW A3,*+A2(112) ; Initial B25 + STW A3,*+A2(116) ; Initial B26 + STW A3,*+A2(120) ; Initial B27 + STW A3,*+A2(124) ; Initial B28 + ADDK 128,A2 ; Adjust stack pointer again + STW A3,*+A2(0) ; Initial B29 + STW A3,*+A2(4) ; Initial B30 + STW A3,*+A2(8) ; Initial B31 + B B3 ; Return to caller + STW A3,*+A2(12) ; Initial ILC + STW A3,*+A2(16) ; Initial RILC + MVKL 0x3,B0 ; Build initial ITSR (set GIE and SGIE bits) + STW B0,*+A2(20) ; Store ITSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = A0; +; + STW A0,*+A4(8) ; Save stack pointer in thread's + ; control block +;} + diff --git a/ports/c667x/ccs/src/tx_thread_system_return.asm b/ports/c667x/ccs/src/tx_thread_system_return.asm new file mode 100644 index 00000000..67de8e21 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_system_return.asm @@ -0,0 +1,162 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; +; + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_system_stack_ptr +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + .global _tx_thread_system_return +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; + MVC CSR,B0 ; Pickup current CSR + MVC AMR,B1 ; Pickup current AMR + ADDK -64,SP ; Allocate stack space + ZERO B2 ; Build solicited stack type + STW B2,*+SP(4) ; Save stack type + STW B0,*+SP(8) ; Save CSR + STW B3,*+SP(12) ; Save B3 (return address) + STW B1,*+SP(16) ; Save AMR + STW A10,*+SP(20) ; Save A10 + STW A11,*+SP(24) ; Save A11 + STW A12,*+SP(28) ; Save A12 + STW A13,*+SP(32) ; Save A13 + STW A14,*+SP(36) ; Save A14 + STW A15,*+SP(40) ; Save A15 + STW B10,*+SP(44) ; Save B10 + STW B11,*+SP(48) ; Save B11 + STW B12,*+SP(52) ; Save B12 + STW B13,*+SP(56) ; Save B13 + MVC ILC,B0 ; Pickup ILC + MVC RILC,B1 ; Pickup RILC + STW B0,*+SP(60) ; Save ILC + STW B1,*+SP(64) ; Save RILC +; +; /* Lockout interrupts. */ +; + AND -2,B0,B0 ; Build interrupt disable value + MVC B0,CSR ; Lockout interrupts +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; SP = _tx_thread_system_stack_ptr; +; + MVKL _tx_timer_time_slice,A2 ; Pickup address of time slice + MVKH _tx_timer_time_slice,A2 ; + LDW *A2,B0 ; Pickup time slice + MVKL _tx_thread_current_ptr,A1 ; Pickup address of current thread + MVKH _tx_thread_current_ptr,A1 ; + LDW *A1,A4 ; Pickup current thread pointer + MVKL _tx_thread_system_stack_ptr,A3 ; Pickup address of system stack + MVKH _tx_thread_system_stack_ptr,A3 ; +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + [!B0] B _tx_thread_dont_save_ts ; If no-time slice, skip save + NOP ; Delay slot + STW SP,*+A4(8) ; Save thread's stack pointer + LDW *A3,SP ; Switch to system stack pointer + NOP ; Delay slot +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; + NOP ; + STW B2,*A2 ; Clear time-slice + NOP 2 ; Delay slots + STW B0,*+A4(24) ; Save time-slice +; +; +; } +_tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + B _tx_thread_schedule ; Return to scheduling loop + STW B2,*A1 ; Set current thread to NULL + NOP 4 ; Delay slots +; +;} + diff --git a/ports/c667x/ccs/src/tx_timer_interrupt.asm b/ports/c667x/ccs/src/tx_timer_interrupt.asm new file mode 100644 index 00000000..b6a2f0a1 --- /dev/null +++ b/ports/c667x/ccs/src/tx_timer_interrupt.asm @@ -0,0 +1,300 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; +;Define Assembly language external references... +; + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_timer_expiration_process + .global _tx_thread_time_slice + .global _tx_thread_context_save + .global _tx_thread_context_restore +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_context_save Context save */ +;/* _tx_thread_context_restore Context restore */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + .global _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that registers B3, A0-A4 have +; already been saved and the space for saving additional registers has +; already been reserved. In addition, interrupts are locked out and must +; remain so until context save returns. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MVKL _tx_timer_system_clock,A0 ; Build address of system clock + MVKH _tx_timer_system_clock,A0 ; + LDW *A0,A2 ; Pickup system clock + MVKL _tx_timer_time_slice,A3 ; Build address of time slice + MVKH _tx_timer_time_slice,A3 ; + LDW *A3,A1 ; Pickup time slice + NOP 2 ; Delay + ADD 1,A2,A2 ; Increment the system clock + STW A2,*A0 ; Store it back in memory +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + [!A1] B _tx_timer_no_time_slice ; If 0, skip time slice processing + SUB A1,1,A1 ; Decrement time-slice value + NOP 4 ; Delay slots +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; +; /* Check for expiration. */ +; if (_tx_timer_time_slice == 0) +; + [A1] B _tx_timer_no_time_slice ; If non-zero, not expired yet + STW A1,*A3 ; Store new time-slice + MVKL _tx_timer_expired_time_slice,A0 ; Build address of expired flag + MVKH _tx_timer_expired_time_slice,A0 ; + MVKL 1,A4 ; Expired flag + NOP ; Delay +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + STW A4,*A0 ; Set expired flag +; } +; +_tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MVKL _tx_timer_current_ptr,A2 ; Build address of current timer pointer + MVKH _tx_timer_current_ptr,A2 ; + LDW *A2,A0 ; Pickup timer list address + MVKL _tx_timer_expired,A3 ; Build address of expired flag + MVKH _tx_timer_expired,A3 ; + NOP 2 ; Delay slots + LDW *A0,A1 ; Pickup current timer entry + ADD 4,A0,A0 ; Increment the current pointer + NOP 3 ; Delay slots + [A1] B _tx_timer_done ; If non-NULL, something has expired +; +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MVKL 1,A4 ; Build expired flag + [A1] STW A4,*A3 ; Set expired flag + NOP 3 ; Delay slots +; +; } +; else +; { +_tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MVKL _tx_timer_list_end,A3 ; Build timer list end address + MVKH _tx_timer_list_end,A3 ; + LDW *A3,A4 ; Pickup list end address + MVKL _tx_timer_list_start,A3 ; Build timer list start address + MVKH _tx_timer_list_start,A3 ; + NOP 2 ; Delay slots + CMPEQ A4,A0,A1 ; Compare current pointer with end + [A1] LDW *A3,A0 ; If at the end, pickup timer list start + NOP 4 ; Delay slots +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; +_tx_timer_skip_wrap: +; +; + STW A0,*A2 ; Store current timer pointer +; } +; +_tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MVKL _tx_timer_expired_time_slice,A3 ; Build time-slice expired flag + MVKH _tx_timer_expired_time_slice,A3 ; + LDW *A3,A4 ; Pickup time-slice expired flag + MVKL _tx_timer_expired,A0 ; Build timer expired flag + MVKH _tx_timer_expired,A0 ; + LDW *A0,A2 ; Pickup timer expired flag + NOP 4 ; Delay slots + OR A2,A4,A1 ; Combine expired flags + [!A1] B _tx_timer_nothing_expired + NOP 5 ; Delay slots +; +_tx_something_expired: +; +; +; /* Something expired, call context save. */ +; _tx_thread_context_save(); +; + B _tx_thread_context_save ; Call context save routine + MVKL _tx_timer_ISR_return,B3 ; Build return address + MVKH _tx_timer_ISR_return,B3 ; + NOP 3 ; Delay slots +_tx_timer_ISR_return: +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MVKL _tx_timer_expired,A0 ; Build timer expired address + MVKH _tx_timer_expired,A0 ; + LDW *A0,A1 ; Pickup expired flag + NOP 4 ; Delay slots + [!A1] B _tx_timer_dont_activate ; If not set, skip timer activation + NOP 5 ; Delay slots +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + B _tx_timer_expiration_process ; Process timer expiration + MVKL _tx_timer_ISR_return_1,B3 ; Build return address + MVKH _tx_timer_ISR_return_1,B3 ; + NOP 3 ; Delay slots +_tx_timer_ISR_return_1: +; +; } +_tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MVKL _tx_timer_expired_time_slice,A0 ; Build address of expired flag + MVKH _tx_timer_expired_time_slice,A0 ; + LDW *A0,A1 ; Pickup expired flag + NOP 4 ; Delay slots + [!A1] B _tx_timer_not_ts_expiration ; If not set, skip time-slice processing + NOP 5 ; Delay slots +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); +; + B _tx_thread_time_slice ; Call time-slice processing + MVKL _tx_timer_ISR_return_2,B3 ; Build return address + MVKH _tx_timer_ISR_return_2,B3 ; + NOP 3 ; Delay slots +_tx_timer_ISR_return_2: +; +; } +; +_tx_timer_not_ts_expiration: +; +; +; /* Call context restore. */ +; _tx_thread_context_restore(); +; + B _tx_thread_context_restore ; Jump to context restore - no return! + NOP 5 ; Delay slots +; +; } +; +_tx_timer_nothing_expired: +; + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + B IRP ; Return to point of interrupt +|| LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +;} + diff --git a/ports/cortex_a15/gnu/example_build/build_threadx.bat b/ports/cortex_a15/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..38377100 --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a15/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a15/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..af64fc3b --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a15 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a15/gnu/example_build/crt0.S b/ports/cortex_a15/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a15/gnu/example_build/libc.a b/ports/cortex_a15/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 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

Q>dP6leU^u3WJIStz4({jFOv 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 z%0D}GII883;Y-UubND6ta(3!d3_tv544*yxGy3wJ;ZV6S!BsHgdc;7m_va0-T2rGv zXAQ425p!{EB0fF*QqLbJ$~vQ{Zi(lYkpJ*Y!BSlL7oZQ>Q1mAvM*I=-v_F>>c~sb@ z-HA3+L`1`ANzlJn=&+nStfCs%?5|#DY>MV=ii$slPDU(vgg0#Vi*p?Bt$y)3u<`FD z^YDg7znB(}rPrT3Y~@9$?Y(b_xNUywUFK|(jCOg$t0oxVPWX;Az9#sPQKfv#8(zI+ zk@EUy4@XNyjDJq*6t+ft7CYQu^HQj;VeyKW`UeKX|6}i4z^o|Fw7XBAVGhg)qc9N_ zH(^~ml%DmHz06>jDg4u3@+-_<#izUp*z(#){>lk$sELI5 zxL(#jxUtup&}~CvH_lC773SbCPp%JhN5{bhcu7nf+?bwFj|^0pJfWcz7gwd^gbEl3 zmdn2;xrE94Sh(1Y<0hcL{8akd@(Jj&ub3`7c0w&GDuTZvxt1-b!i2WgjxgGo32n`2 zVNFyp0sY)WTQdPndH-k9F;?CjUv+bQ0_0a^&F4oZcB8H2xOgou!8;p5+Iz zO_-PzU&6TtF5!Ep$=w&aaHzfVOO~H3ymHw@;cgw zMc*mGg{3s?dqF8I3YU~EOk?5K8R^uFDaWQ~1;wRzl^qKqb>`Gm#pT=qG{|2RY%HCY z4lY9c(z4XTR9WJ~XQqO$Ue=hJo@#2oYwt+u^AjJ&4x)|0^hLpv(jZlOCKInH4W^dP zn!RM=!I!8Vmz&EaqzWxY4GoV*Z9J1(}R-I9f^}3O*5oqdTjb=oGx)r za|tXGr+<_xS)5JB znENAIZ(fLI#$KxdEIl7t8niD;rFSG=t8F&f2j98$ktL`|u&EJ$y?)|po}(g_hW+QJ z>E}-^nL52BolY;FQJ*d;NiCedEmd+R%9AQwdoz7#IZV7&SY2tw&l{7VPeQaUL8J|g|6DK83Y6|W|=odfwM(_)7%eG&mnrHs= z)ZkD4mb>o2RVzV@1iwQ!{QjknBtD7a;hMqp^`hV_{tqj7`jXTYOJ@cbFDeU?uw>oX z6nq7BOa-G$Pd`6+hB#FaSq21k88M@cz7O(M|Kq{ zouHf3k+p6@<^C2w`wfahOKVG88tahc@lmzDp&bj98rzNOUc0!ep{=2-siD2@q666c zHd^YJwHPXUL05NYLtRx}O?SgUd*fEM);7v=t=5J{*o19r#kL%00gsY)GX)O54Qmn3y4ej++$8$#*T|>u|%^lbi2J5pLv)1-i)pc~NYiW>t z7%t2IWC^M<2W{4PwRBh2ZK}ZvFs@`Xi_owgl3n#?7x8s8Hg@CfTHjFDx!#jvz=yTs zS~oP1T{wnn!e*Y8bj_Jry4J`GRMVO z{0>_5Uf-6v=P+LOW$@lu*IbKLZLJ-+95lvEi+y`$|<$4Q-ur1;Q13C*ywRp9hUO7 z$wEFcDJTW6x~QS1%UcIq%nc0YdOWlpFP$v(GiJ24$zemVg{%J}^XlyPW!^@#8(IxJ z2AFbqy5co52Ocd@tnKLP>Og5KmY%w}YT0S0u2^>V!j-30E$8*EsrOnq4y>!`>bfYr z|LPlB(KKN*m@X&n6m3*(7G2iYAXQbjEDWqVePP9ElnnAF)WwEvwN5XH)+}Z(K6FB2>WwysTz5iznHZV)DGIv9qJw?pkd-F*;a# zhuModTuF(|OS!0#*8s~R8*94PS2fnOv|^g z1lU2Z$1)mg1V3Z(vaN6(u5nWb8+=3ihVF)XSq++HeZ3K9$6c`=rAFp*v)0zK!&SA; zo>?On?hkAzhAg@3gs|svC!u?*m3(xex^=u2+vReaqM1f%>8@uLWtHgqmbM0CU_W!A zE7zG~Gjnb-ZyJ()<8O0o?+!j1O0m$htaPSV+SSlnTHjE+0qxXP)7Id6bZ)3^hgY}j zSA&koIvQSXlUs!eVmb#W4ZP zmAzhcB?c;AjRp*1nU)}~o8P8WOnTcYP@=_URvRzm& zww;?_^>O$hXfr{Wa|kJNuK&BSu9Vl5j^pSUO2umtIkz;d&j_sT#5zOU=`{X}j?C}} z!|P@8+vCU#--!{paVC5WJE%Bc^54XZp)$*Jiz74rbE+ZEZpA=)x=G3ZKzgbxXVxz8 z!i*(SAZK^ukCy&veRy4qtN^5ZY?gd{mV8>4yevzu%92~NWSJzXAJ4ZvEBupL@;zBH zKls@>(jmBBk7kAUX35{mlAq6#U(S+W%aVVUCI2Z)&T+aF>vK?+%r&vrF`QZ;>nI0b#_2dEC#u=EoHaWVFxhlSr4J%f>3Ok&OwwhwOwyUR4R0DzzE-lU~C-;(_1c% z1Y{@nGc*;%CX8TgI&M@S3Jk+oODCUI_0w^Jc^pY2iaWi`9t6(Q$w&(mbarfAN^K2ob)5)rZb{3K&hskJhT||HWA|9Mvqs#E^>VLcX-%Fh6dA-C*xJQYI_aYJbkHs@$ zT#d|0MEKuJM0p=lxtECgzDYzoB=DeQ`O6i#*oEo#5RbyM z01teYlWR_i^A*<<5$^^f+JQECdHx59Xs?HfIPX(L#QQN3=Np4M^89Hc%1N8NOkaR! zCF^?waNIP=`M?r-ijUIVxn3ip-*T)OL*K<^f^|Q%H!)_$gv7CwF@{A^1yM9XWF>f_;ylHLisvde zD{fP~M)5Yqdlmml@kzz+D88WBr}(;J!Z+s^TLvg!vC3-{YZb+o0m3g;S!@|VzD?zO z6~&eT{GU=;Y#BhNGMx1nTLwU}WdO`W+t6QZ834tW0g&o{`invySf}y@ie#HG{PT)p z%K)<2G64QW{qynslKd6LmI1=WmH|*~836g5WIVBD0OWI$@26k7&Bv1I@hTLwU} zWdPi&>BW`-ct8-%upW zm**eJ_X}{m;(3Z~ivOtinBt!lr{TfHbXO=|M?`sUQu$LV->LFvRlZ;4FRA=BmH$QM zXB7WK{ePhH3o7qYIlz00=bxzfQ9dtlemq{i82;q>33;x{gJpjALXEHd|UiIx*Yj$1V zH1NdJkg;a>m0{pnTb_SD`0E7-C%=8{bJxApS*|t^aDopw)d#?-9*E{VE|WPuK9lvl zx6Szu-l*m}qbp)yBFCQhBS?M;LSkRVUqoyE4Z`Dw*35SyXwByWKx;l5Zwi>6pNMcn zYlhAFnGga)YyKp18NlYeo&gq;amvJquOU$aHs|kQ;*i$7jM5~Q4m3GWtjHRh^YP)# z+0vRv@_i#V=VN5xsm=Ls;gB}x<*n$_nqwiY`8#~kg|y}>W}{Mm-drba=r-qRi=Q^< z<&_`Onx~<)Vj-=$2xX6jwB{!1M*_WGEKo>mzMtpFrZtm}9*bzrUqhV!ZO%_N9f`E&*nLJw|Ux^xf zv^h@#F>KD8x_gD4Yzb>sK3;eTL#>!7EajE3Vt(OlMviFBFS0QroAVnPIifXhWaNm} zj2Am@F+J~`!n+wcvN=DFkt3V)>litrHLqc4L~EYUYZB3#|Cf;?TJs)OA)+Y;d|Sh=hA|hLu-Bj(ZuGwJOCnEb1vgWv}T&D z+?UPyKckhz=KOEjToJALlS~)Unr~*I2DUjLli84CbABRoi)hUIOKYah zdETqm=KNw7@*SczA8{52IsR7E66WQP!%68llz@48utD<}JZ$;R@fA16$M2wb9^2ku zHvV5xC>72g{~!|jd8?V#S>w5CK!vsAgovAWo`m4FfJBM7OQbxqn=KR?sGm;BJCy(L zTUMle@0N+lTe47}Dk)u@*bqyQmbDiL3!fQ7$E!JiWWj=wldt!$h+Q6R!^Jubez;6< z-MBPluvW=8ZSi7a6R7N^Z?7r zF!T_IITF%}s+3101fQB#!zzdf362qZU|$wck!0{h zXuqAhkTLk-RTc6?IESiE)8NqCgzu@d9S?iB1YvG|v>VU#%#UdE ztHrTRgG28@d>>`qth4QW9z5Lq-b8-3o$)C+%&!~AZhkO!BswUYpAGBC$}f&_fGr=A zg!x^Wl^@r*B;jYB&2K9_-15<`y)7S9i(!72e`M=89@E6fZ6y(p`SEv`B0$`KLEksW z3P5|_`*Dmu)oFu9<6AA%e4(@PkUZ>D3@k&uN5WW9evEI1Lnd%7h(c+2lJ~^=u&6}V z)%Il^de@@Al<+{EJ+GB5y8iD5Ux?Q-a)!TC8G5*-VSU(>BKLOKp+_@|?c?0+6yhUbf^A@-HG5hBG)q^m6>h;o`DRF`P{F1JHf3-UI4o(dR@j3!KDwz_g<1 zWg*W~d7+}{W#Qkf@;1e56mL_!SMi?|pH!47H`2eLa-ZVsilUcAxaehp^4S6?dRd_8 zWq}{qm^at!0~_8lSp`u8WeVEITtf zJ)NF)!Hkl!Dc&g@rU~H1h=Z;(XuN5fA3z-Qv*)6RJ*MKr9@Bpo{~Tw-PKTd8 zW-#ON-D8~%TLuq%%rMIRjdwl*e|NldHDveukIf@{yz@E4<41PuY&;@vhtP4`;2uaA z*2-vLpz+QvCH#dYIeL0@Kd6%F3#>=JYp3#2#8)Llmcl*$$uj2S+KmDsdzkL2nVrkP`J{s18zug3j zb-0Qn&H$pV@H|{jYkn`#lCX&jOL9p2C&WdKUX5X=2V;#77DB7P@p1`vH9*<>rlx!D z_Ig{tjJOZscTXKGvjecVO0=ik4@aNlljJ;sMxtc z;`Bgn_j1`+yW>6F z86XNjB`Z8B3kW{dXDxUK1t=fNHV)Ps$?(`b{5lxB{L9bB;o5k~TcLcY#PzCu34Qih zKm8o8$5StlOBzdqF@&M~C*;ENG48nga|>!vZ(M_dvrzY^UWSFo!)YPWOFz{&0%a{m z{q61!o)?t?mNR$%1np3L!w%H@Q?N{bLtjz)O7xXww2u0M2TT6T%Wv*`0&$9au6$`Z ztbxJ;U}%ZaD@QwdJwB{ejxcez_Eq+5?c0-K70_CN-t({Q<$JaDX5@i(j#Z}1a__V;}FC3?V)L4S%@8-@(qj_nqgYn0V)urP1i zZJ4)0+HF{6gK4+Q6??Ut?`5{z0^3HgJ{yDeN4I^RM}7SVw@CZYiZ-uf4zFLiX`k2J z_IWUBAGSqMjk;I%?3#xD=k@gL+M)f%_A}_^85^I zbka@8O4ovG#eQbfuy6Aj#p@=|DD-jrjN)~Rcbe-}jQ$)wpO)?NdV6-^jfKAS9O`?v zJZtc7gMLC{~^A3ll-Qk;ie6(4B_;EZJ@jSzM3mAWuSfBP`jry*WNAJYL zZ$#QdILhEBKZbHd;h#ac?>+r8Ez`2Bzmfa#MSZqDje9vNJJQLsmDXXwx)AHA%nSFm zsfW~&Rz9CL&sCJkOFu2vIHx)Hwcm@j=%qz=SW9)T1$P1R#$NZcb^q@#KmQfl$qnQE zbqo9wh@X#myw=#Y=T+XPj@w*v>bRf3H2d(Ajo+S=_nczhOAB`Xr0=xeB`^8aJ-f=w z@93+j#O^StLq2v0ISSAJ3S5ls_%-9V`mgYF&tFh}-7AU8>-wgk9mufbJ7Lc$mQ9Ce zetA#em7~Az#EuDw7e_y3dtg@zS}QjF8SjSdKAnU9;&1L5&3-M~zSk8WqK8R)kuHBu(J`T&Ze)@@*`Hu9{d(a=w-i@7*4rh3N63;&NiAwg#dD8Fw z$|qh9dhy&u7~jvu>FbbYwf1Xs4`FBl5^d!!)2E+6x8kk{J>U1S%LDuO1F1vsZhhiq z>CffJdnc}E@>=A7UfAEIKbJr8GR7dgev9(3PxBs)$ynhD^yfW&Ovmyfo%Cm>5Bso$ zoriKi;q>7r`fg`mL%Z;Lu+46jz6Yz`2m1xX4#EFXBS+^2_#PN5hSkx$ypu4@3~-n* zhw%@r#d?PuTeL7P=30b3*gwQC#}yqKt8oBpv3a-vhhRWHaUjm5Ycn>-HA7pZ>`7Se z<)pbdG73xaD78DQp+_t8QpIEP{1q5SO&;%;jW*|>lH-+Of_p51>8H-rgK2J+ljs{I znw8k@E!9GZkkTTEkk$f-P!<*LRQq=hS`c0P%dliDc@5&EZgK8^e>nKP015E57^Uo4qgY3S6>|3x08 zc77Y}6AP)GQ&HN8+W7~Dh1AaJcq~TL&K)R!MD3*Qu87+CYnC>oc2-jgsh$7JGh|Xb z`2kg^o#<;`MD6@C(?u3*&tk%e+Ia@sU=V8Oy(pDXJEdhqYUdryIHY#|BQpxAo$@hv zzo?z(BR5hzf6c;&)Xw{uYc{p>|9Ikv+PMkheo#BhnPo`ryqC=}0JZZT7A2&1%6I99 zo~2*WxV&HTN`=(Ujg&%a=j$wANbTf}7klKhJWtWIk=QBRi~S2}Rlacxk7nK>wR0V%?>-@C0JU=^3pzNp zlPe+LThvaj)f8&y!K`{j?feYuZpoYR!Y?w^iitv@@mevzkj5VzYA4sjJJilgm^Pwz zeuj}FYUhJ&$cWncI71_9=W2#V)XwEBRYdKSg-;Q+la@gpYG*FRh}uaroDQ|Kk)aW_ zlXoV_@|yuc(bKWQHLQa}?ffPy;ZQq^n43fG3@GnS?Yw~1aj2anPYbnE9sm)wa~e+{ zQ9CP{Y#$bDsRb2kr;s8eYNxDli>RGKeccDO^LU=sp>_(%F`{|dcC>>O(6R)#y&PE2ewsGXNk-WRp=Iz-qXYUiyia769=Z=U}^sGYo5Ew%H1 zSm}3&+8Jv^31Or5Nt7EFYjbcaNV`yLf7lV<#W%jgalQOcArfY9_y^-t%(31y8ShKK zavUxD_&1Rg>aQ4o9wXdDqM#aQ9X|uv`ZvkL`Nlcp>zM6LA7hly4^VSNXJ?xchq#8BrB5tb+Sz>iuI z6Xkm*3I?!^7&ZFqdH$aZkCiogo<%&@l)X>N4jL;=h>n*W`y}nE@p9%qNxyo$l-39z z8UJyn?~?*9Kk`3Wz}G}r!-Bsqhn1#Azo38`9oftx|59>3OD%>@;${>+hPIwxirHsbLu)o5a^c;(~h{aiHipQee%06)J(b6H7`qCrTn8GeK zg*7c{3X2G=_Nt?$%PcjgU0o!7VyQ2k;v+{(r!X;t8(;KHaaWnR=NyCdUa{2mLdh(4 zV{x%mcB6_(Q;SWu7Odb!CiPnA>>tIb9v29IUpJLt1vsj=m3Y)tqOxcrBRy(Tt~6D8 z)Kp2W4$ovKLUhJkUL@VzNWqOyd8Sg2no6B#Dy4B(OlBeYErjQt@-&2Fzt3WwHRZo~ zjE#mo|GX)0^7t=2UVZF{gBW}aHI7qh6&AIgO0%)C8Q#R#y&F(*81l zO-b9YX0kLI`W)t(@_AA@OiPcFL$7Qm+C5@$FF@ap8P3A{m%(inMQ?$?eXH+Rrh`q1 z7@%(_f(v9M+$a0gM&&_)22_IeQe2$bj3EBRZVXzS)8gkV|uW# zG5Dr;=OS3^EbWCE+K1D>4~8d_G&@?dc>5h^E=~n4jX~#~!SF|diy9xBR+cIWroJK3 zuc$!$#NP!Q7s0Blja<_h48Jpsd358JvQL*yT|E8r$8gT6uqYcGl6c@huSgVKR)$2k zr<$(%SgJmiDtj!|wDec0&1u*?U6{IS-5sgvOM*u(+Y%Hc=H4C5O{`y(DrpKv#wz@l zVAGbx!F3;fV8ItG!qQ8P+P{uqe7|0dTgaD6E<*Irf z(Xr+xHEu+8_L~L88{j<-XIYLPOJNRwtxD>Jw@Vt7pS<4|QH8Hgvyb~QgW6pKOZd^M12j%H6aGNWpl)obU*9~K z6;w3~Yq2hnB6&?dvJO!ECt~yckru#5zI*>Kfx3n}NdIf}Q1&r-exqHoO z4`&^VLzn-nSwMZ8EuYdBdrP;NoIM~Dr}p_*^%hN?Mn+EGf`QWR^)+3xg2^?tOf#jO zT{NHDpx78bssGmPmcFG01@C~_QW$8G0la;Ak?Hh%3}CIZhh%}_0#gBOp7LROT=5HPIBKslU-s$(n7Eeo%#Zol{AzJ*(=diDfhAOO^bv7(}b-}Yv`8dwA<+~EcHVyMQ5BVi|pw5PE zh3sC^=aF9l{8+yJRu^b;?^5JfZUvyt?;btob*6h9@#f-sSjTw${iCAw|Kr5|S$Pj5 z0{T>^jW>PL&{iQ-BHq(B5zv;87<2p|JlgX%!-HRGc~7wYSbw&O?aMgy(o-F$Z0AP|w=YtBm9VeaVq^JJ zZEJ#XEQT+w8BSQ<+}lWJIEH|EdRqI(h7eWGu-s0oT=Sid;ZWKUrR8)pWHaVFTRWP{ zuvdi4yyl|JwD`9g#iixOdx)UwK1DndJU1f3`DJ)q5|-Y8v5ELZgLa@lw*aI+`yu_~ zxJ{UTF0lyLgIJ7yNW}fjmD!Ygh=}(h5&3kYAM*UYz!=W)l;YEh&niBr_`Kqe6<<`` zsra(uD~e)~4f*a-`Ax;&E7I~N&r9+wF|L?U%vUT>9HTf^ahzgOu~>1k;xxsy;!MRk zigOjq73V81P}~fp1`S5a2}!2d~=W#td#7gX+3d|fete#Lx5!wM``Syui)mX$w1S@{FJRKu@T zyiM_5#jh!{-!fmZ$OsgRj6ku-2o#Hqz&u=I#uM{Qz>`!Ki;R%PA|tR){Y75|`EHdz zuP7E7;V%{$fntLMC>9xkhx5Jwih&fMSY!l>MMhw?hKof;$d{-r78xNwsj{s6fh-mo zfnt#nC>9xkhvGisc|=vUDP%JV6=V`cDWQ1I; zvRGt9xkVv!Lj_bE^;G6KaSBTy_d z0_%An0>vUDaI4BA4ep5Yj{^L*nJk5xQDaSaja z&QrXei1YMn`2Q%rs`wj4?B_1|en?R)LgGBLRIX4g;`0pokKuC@e~2P7IQ$~dQF*P( z)hf&L8u7QQ{D6i(sIt5_@Mn?ZA)cq9kt2n0dB~tEzvdh_Yql&88N$l12RIGuZjED=cJ|qF&cmcV?;BJ!t8(02m0{qqjwHC>BB(ch#U5x9OgD+Zb_?Gdcu{7yb z8_p`zSPPTyWZrvFo}ja5*BF#1hO#s#%~}c{WkfxM3rfy;Zg0=7k^-zvDR_2FMZu0f zzxs5n*}bvPTE~o|zD?lfdcF9e4z#36i<#t-N_wy7V2qf8G35F>mNTUp^)HRG#90oU zn{C6iwq4>#mqt4Hy^4JL=cOtcHE_wO@rbXQqyC^bqSGAe`=j&nPRKhEcT4U;Ahq(4 zAqgKLJQzOFTR1v};1Q#pxajpZ?i}3E`J+S|a1f)A7;7>diAV{PAtQ}qBxYHl(Q-_* zgA2W5a5EiZn4^p^ItS;(t#Y&gl#OyOl$hCk$TGz;q6f-N^*n6KVGF2~&7Y&3xCi0lxb2OChd2vA{}zPAXyzrJ6C8$7K|FUNyyG(v zGoBOQiDPgzA3*@PnrAYEL!WqVXpOTP>4W4c2+4f|Ap=l0HC4O}899{ACm;snCn9mI z$jf_%(xl}g#l4`3qEI%2+cCTdj+%^+{CGeuv$4h*PvGQA+3dy1N!dJzp_!CTlYcyq z+eF8v8Yz+YWhAgte%>la8aicjCsL8J`6HHjy2;tg`+q#o3?s$!hB4=vMoQ%UJBv5V zNcnlMu<>UbsUS~mJRWDHF?qslnq#D~c}tn+@kSb#$34(vCm1Q|6-+@kwBII_&BIxi z`SfC&LU1XYNhXXan@f>sFv{kykdsh0rDa3P=Cv%)DpQ1b-WQlrNZAxya{EQuJO{an zHBROeQa1mAQj?wooRF(gnP3-B+%W@(2hs3l7sUQ4o0`s8<1|7dZvnFmDVv-|4n*1f z2e#Z7OuDgo^1=)$n^Reakg~azZ5>iJzssZb3lue<04nW!b z4bS(CNmr3~G0*pHBUR>2V97$trcg^m%4YmDCREBM6FAm5DWbhec!=*ov`oro6uBM| zMr-8raXf}8M#UH5|B#R4&;NH6z~n1O8g&E1Stmct3aS1c9*IZs$ICo?EB<0$;@?~u z59`SoS$qX063XV!ScBvEeSm$v@DjugIhygpc2`UkKI}W8`Gr?9?Ma%ppzv7c5n1D0 z$h4@Ggc9NZG96c^7Hq`Gqo4iYS{Sm^QM;$>%gEo2EvU zgxzgI(O? zYa^`0S534|JbuKlndw@V;ER$eGu#$tdf#4!zE5)2Lf_{W+6ZgCBTm7X&!572JSX%xON$E2d5#mjbG(Q)$)5CCinD2>UoG zaQ@mO$Dp$Q*F{+69kG*Hl7sGlMzUmfWFDC;?{o`zr{uQW) z!tlsEZZ<+?NTb(-BkDao-j6(J^mrSIj)Qjq4;m!{7Q~OGsVt1O)SF?mHe>s1(;rRW9egY7x5n8r-|y;lFKF`7`rS|4VV7mo%GQ%* zJrJQRiwQQ=U9h9=x2=uROiRiG?}9zh&ezI`tJ1Bn2P1x|0bRpi3+=U%vc?^*)$r>+ zI9}!{bKsj<_p^UBX^lL0Xh2$f_JQv}E!E*Z)AA$~JGN%a@dLJ?MYW+?(88Cs3=3Kb ze_uAVxJ&dPcC@06q>U}DNH+GgBKfbk(R9B%O;aan9bQi2ppwnt>a4|^XEprB;K%5E z{V?uPDr1Nx?p`M^dRTEPjv0TjcxfjM4n5|_If`}ma2`DDF~d$l#(cY4XT!*A;!w@H zhxi7?S5el3x&m8|Y|d61grsFQ6U4KJw_r z4?j1*$Bl*J{I0~YO~Wj1Mt(^i zsIy^PA-m-(Mt+DYmnFzU;X?$5s|H!#Nf;E<6zNo!~yP?dT@sN3Iat)jEdp!D}7mDflt& zO#B!>1zf9sl<99BnAldx>bw9}~wS9g51nTMmq&Z!V{d^v%HW;FVdAlsEF{23tI zm+}%t;m<&3yV0N5f_RPMZHg=}{e?dRd{SlM&p>`bSHppHuu2 z5$E};;VGIgS?)<0ljkCnEe9#hHp{C@v!+{z}C*^}kZ_HpS0s_rOL}SyjA5+mHCZ_>2FZ^0hJ$AS)Q}_vsj@1 z4eb}Ubak|cgp)z-k@C z!uFPy%W!f&J;c&1nu@1Ht45CR0P%>G;b;zi0S^$3U%KMCIdP7<<9sFfiD7*6`pJp- z&yn)yvdMk3qTTr9#F>XzhhNN-7tPzc4B4~SM7~+Vv>;DI$FVZU2^vl>@2!2T(2HM} zxnR%c&mEUq@O1_90j$cDsr~^^d^w*xVAIhubFEq5zxn8BTD!Li=_ssoLv4Fa8>~l{ z);H8{Xu`LGu6NbKboM-z&jGypLT8WJPw@x~-P5?i@u>Ai;m2OXc$B9qnp@J`1vU=^ zg?XoO?A|==>8lw*oei4@*&Z{9&mHzp>ugx|e3tz2YD8lB_$;#JTY_Vo28Z5X@S~d6 zIvd9Mr#)sE4UqIV&su{pw_V8lw(UZHd){^&Ge6dwZX1Lh=1~3_#@|JX;)%Z^G_E`a z)Pr&8w%~_0?i2xkA3?lvRsh;~7&pl00W}k8^hESLC-D=C?}a zdLk~CrpTZ%D zgug)40f>apB8sIBCi2$ep0HAW-kVIOB*UQ-2@gSzBoZFY)FF{@J{m0|5~dgy5(y7w z8A2lAM3x~W5(+;lBodOp5SufRl`R^Z=QCzVBow2FnMA@XaT*~KZe_ZVNVu5kBHNEL zk&lRkOIVsgY(M592O$zl%Z5b4Im|dD67t0t5eZqA*nSZSSD>0C5^^z}LnP!mvWbNM z#ZyH@!Y?4seh>+7W0oP2@SDtQ0NanV*zzHfP|W>>L_+zl5fTYM%a|dNP^e5Hk??U= z=m3a>cd?uykub(`4nQP4mNB21DE*`&kFWZONcb$%g+#(TC`CjVM8cPtJR%Za!^|ThA;*`AT@#~(6sL?oof(;*T*&x;<}ek6m|Arf-Jna9q{6p}o#CypfGv zE$hKzvW%6c)(w#MGKm#tiH(S7&It)T+?=dqT~%vMH%{_)?cm+iupZl-HIN*Ga#=FW zTieDvg9g>!un`0oUe~I&4Px5>Cu!-fMEE+^bz279 z0e_q3_n!kIWxWpwS^O@~w>`gQ(eb;q`zEmO2foZ14{v^Pa}_NxjP4lxn0~N$(-6m| z!J+UF&UZZQA;+8cnDIUbfp0nMY}g6#aJ;=AgTqjO!gI{Yub8X{%e4eQn+As-^>))8 z4|})>VQzk}9B$GxKYV%)^UMBzJq9o5G{UX3?Y9OVZhm`^UlM-IkN&oN{N`@UfJ1LS z^5b_&>ulIMc)0l$;6k!~%#WXUY<^pDY}4S-yAb&$d7#dQaUG4D-&o|w@6gQeApC58 zH{qCRY#l#={Jv@{sbLJiLyrOC7UKhXf8W__B4ky_A zdwXuy7jpOPjPG7C%DnQC3*^eVGFu>WfwY7xTaB)1C-Ra&>5)>hq=u&y4s}6Pa>kii zV@y6z2L1Mqz9Zk>fm0YC$mb97M8$cEyl?4$u41#|HpOccZ&SQiQFuT|_oT|-QG7wM zPf>V4h{q4OJdf~zfW;~c4+ygGfPlgS0tycZC_Esb@PL5#YC7QoL4HbQ`FsdjctAkm z0Re>v1QZ?+Pv1QZ?+Po7HAE6bio$-GImY5g?m#=dC89mlNYoh~Y0HGSGlkchO{u({ zUO6`JUH|_$Z?8*c*m!=y054^DxQn`DY^dXMoZ0_b}2^UqCOOBf{)Rwuq9 z!qJR9`EcAzp8p|M%U?PCM#7;YtQmeeg|Q;6@N(je zpA%;c>_&_7dVj*v+q7u2rmN}V1Dr!*)lln(`i6m0x3pu5+S;0`ZD~)HmZn-;YEw;h zb*Y-Jwvu)jX)kH0sclKghVm(!Q*__Tr!n~wP};IC&L5e)-oH9_Rj@sNWzH4DF3;VT z5L>5`zgL3Bz8$gb(?k-E!@miRi_E{?@CYTvS~*P1Ngt|eZD>D$FDC=6LX5n56YxV< zLw!;{oP^~IKk9TftcO8(DY%CNDM(#MdtJ?XiumxA@m)dEv#gRnBZ$@L&jfoINeU2| zAwMue8arXi)&d_ROs%@QI=ax3@BT!cJg~q0$@&CzN_1dvn08LSuX^>EV7o7-ZW%L! zhcPW!0KYN#F+JlY@S}=_vYnOi$?7_W(M`pV@dt~?IiXF1Ly!6Kxo({en+Fej%rK6n zd1qQ@4>|Y8P$6>phAYK-unlZI$j`B982Jv|%~U&BXAe1taP!-P{8%sMN3{9X;@GCa zp-0xkOdhDS?aaBqo8Rw|AIB@q53j{AKY80g4jnS!wY1Kjs{Y^ENBqK*Y_*H$2xYJ)|V5%KElUOGtUI@}+f^DLR$U=D?{kBED)Yl&mri6gk* zIQJL-uy^)ohIwg*oxS^)vOjtc&Jo#o^u6+zv0+f|<2KFE?Q`;B9ouvM$T15zg|Vhx#=}oC_g=>ln@S$1QW6Mw z(BWqypgXH$M%G0md7Z~Fy$7Xf754!&vjJ!3kvS&`rypl5S&=+7DRaBzWQ?X8YPuVy zBqyKRQQvSj^uBcsT^A)!S$1Y}dOAJpf*B=cQ=<8Z4E>{Q!+8ehJQ;#ij4y?^I_0pJ zsUHI)QW#dg|H+Ztwr8Ar>IuoosQ8rqs`n|pVh5y6e1A+*Py8IST&_))eaubnt{9mD82Zejev;-wMCroo}N6Tgdjpw5QPgKUo(L>&O{ zLhEeUN$_yT**&PobMWK)cNl)Q9?NiS)8J6P>GLUXoej&Lr*Ir=+l6TJtHrTR!#vWc zIO}GeZD)>4-12Qgeth?{e0;py{IcgM)yQum!mYFC%ATiecgn}-o6RqKp7Jr|m$aDy zZGKyE?3V8ar+oXGr`(17BAWvyKjwLtlQ#}U*TAu(b@se`S0Rf|>wj?0(B>&A#2d;y zg=<}@dmL<@!rdIF*g^np`5Z4fbp79rc?#P;a_-sLZtOXc+k5R!X6pWQjZtdmcZk@* zpdX(VoTs?&M)p_d)#uDC%&U-F|AFt+4klC=qt3*Sa|hmk`!n|Eb>LV!t$3Uw?{WH{ zrdXkPwqms+PtJH3DQ;Hey+Hq)74IbCz5N-*`_%tyieFcJPVv7LpCBR~@7*Df?LkW$ zs@`P!@nu6E+jH$2T*la*Hsv|Cr%ic|p*gnaxE_~cpW}LDH6ku!_wV<87-M@p=g`6I z7~hQP_vo13wMXx#w}QEg`9u1;K8)kvL*w<$(m0;C6zD&Ozy8PTpF;?S<_aHU}D&{2v#l!H;F!G^}iuByOTy}L105{vi8!*!oWn^AQbScF~2 zXfI)oXK-u6WsKEP3i0f3q`p}~%-`EHQkNktPx&`BWH(o8{|D?Js1lZ)Sz5DxeOF8E zhV@|g4%ziLM&InDwqwWaG5T6OmF-v*kA!fncNC5(V>~79Aw>%eqnnB!(+?Jp?_Zk+ zhw^D)C}VVf_aDj_y&m=8yOr-zjuGsbHG7PH1a9b;5pJC=Q}!5rrZWcK*BG4@XWgu` z?VLSEpX-c)InuJ_%O0b1%+G6Soh@JX7`?(NABG`ee%WJmZnu!MnE`EnTX8(x@n7zg zZ(n2d4&*n}W}^8~yi1R5mUp9qLm8w07vddh6FGVCBNR>*x<4S^P{!!AS2L6`I_<@< zk6Y(d$$AO8{_n;Zo!2sQ?%CNM>^YHpJI3gvG`r2f{&WdujBXz1_S-+-M%m+Y-UIK) z@%g`^Ui&>hZ)@mkY8cwL_ZhQh&m8KvckYP@moYxyv()Tsw)Fbfi-F|mR{9T91n0)2#LqYF?C5+vW4<{FjaX!rbmdc&@)xCw} zEy0o;zUzN7+%rrpY%IdaKGB~>%MN{^bT;OPQ|Ti#)@&dY4i2gw6Pgxt1Pk(MJ`w+&@jQ{aTaMH!2$>wI;SA1=FJwl!@peEaN9qKo z7{|XteQUtDr`FrhSPNF*y3m!wju^y5Ln zq8EbBEtJwT%7XSE;xokFdWd2)p>@2}^G6oXA36DY|C-p+Io4@Nnz#7zdUJ9Bh8X73s&@OiU8VI(vTf*g>XV%x_=wBkm96 z&I4>aXU~tGLVg9vi}~$qenh(y6QxAv&lWX%e)POkK31LQWjV9wN8GC`34iNsetciK z?f0TnzJ1M)xOS@5W`aC;$lqOx0C5vBNp;)BCb=J>xCEUV%{vG2hB80eh)VW?x)#uWqG`c#jbg?`e(q3Xz=%?Lzy~=zja9mzl))=woaj;)#lU zzES2_mRPCyUgKmXQE!%y<8?Btve)eYk_?nwCM7c}gYxmx-YeL=cmC!V-{UiykYnfvM9ynC-@iKb@z z!NKxJM=UIB_if)CtPxn)qC4lx!j@m7l~4&dGike4jd=mQF4M~0H9=j zno_QX3n4+pa|k*>wu6WI2sq~DYJI9RDi{Di|P-o-K zgKUo(#1(|R`>eBJd=$I&cp3HJ7=-oUn8Vg1ThCLD8+s?gt+V-M&to2N^eAi(n_n%C zZ5rm0#GssYv(C2jdGK({_mHDUK~cl}vh_Tb$ZwL(3~0}lJ&$?HDPO*mU-mqPra_ba zd%D1n1%uTGXEfn(LA%Ax%0>nLuh8W5`=8uTS=d5)$YYZtl-wEAVj9rE@ zkC~53l_L`lL8-&w^(erPb#?RGhKo=RKkMvyt!&Zte>dhaR_|iY@1Fggna5ygFOJU& z&STtb!FHQsg5{sG+t(?(*O;>VICmx{`p%SRy?IGtP9h6K8ro!?2rNjo!l03?S>e25 zGP2^lVl@$kY$am;!F&6?#Pj+j%Yz&6P9mNypHaL|{lBL8b;aitpClswe$5NeW-XmV z)E|`%eO>%CHY#qFnF6{l{uIm$%AxDQ+<%Bte6xrwA zDZH`OyK&bXzULI9Px3sJx!@D3m%8%6xMQxmXjtZAc{{<#&0H#<$XqJVmGkZd;}x_t zY6xd07#w-i@hW)Uq@pQF$|_ z4jF<}m3?yPQ;!c=We3PA>tAo;c1Mo8=(6Vydq69nFY*4eO=;K4DZb=9cH(-2sXea$y6#bch2 zZR>1)+4GIbcwn$z%#Uc>r549F4Gz8as5t9poo(my;Ng}pjr^d%p1veaLSpyt2bEKXAvQwjTH6yvU-{ z7K!$xFh&WTjh8*&pq;6q%r|aFr7DrhVDpXFa1rK*XN}s~@sdMZ9t!Wqe1mNtIrr@E z%zT6GOvh)%+o3m^E4i6J_IKyC=}bS&YcxYILWKyt`GZqG@Ya9++i+7&k_UZQxd;>|=ne`JmVyi@%@ulTUy_Y|KXA|9U^Lt1mv z*@X{yjdsaNaxh)Rab-i_52wdWOf%*rN$4u3_3prY;P$@!$~*h~Ug#Qjf(u671?L4= z8rc4$~E2xG(gK-lj+bhPr+mWnH&x!pPj&9O^n3TH|k%Qy{NV&TZd4OGX^bD~l5Zl>B=UikMjF&SNd3g<#CM`!+ zv7)#ar^!UKi%xtR3K<-gLP&l*{tW!hE;_N_Nx2U?8E_wd+(oAsn6-WV1`|#- zQX=oujHpt6-ZDoT`Yt-(K`QQ|BX{g{TaVj#o*DM6oPES*+Os~y=ALDw{5+0EVzZ4@ zkk>}(I3tb8>t-%!8PcWl%u3#aH5_v4k{_Uc}O^mpU&YxJ^ z#&1bJUfvDNr%BJ@jf!85(70^-)Nuk15BdVj(}WEY*wS@q*$%p_Li6&{SZ;kG&P!oU?1g?F)K z?4~;Th0~b!Bu!gTcr5dXcF_^@s;6jZy6_%m744$)akkui4V_c?VP+NWq9Z0_qg`}J z1I8{orjYXsALNOmU36|^Ru!?YB>+Vgg}-Fvr5d@iu!dr^i;ftfjds!Do$2nPBjXTf z7oABg^+mC#k#|t^Voo8AD!RMq-7oAC{xa^{HH}j8n(Wz#-XcryshPIDgbYff>+}TCvGRphd zMJILxBJ9sDI^0Lo*+u7@JpUlO=uE^ZG|Y_i0Jm%o(sx4$Uq5hwyRbSB|@f z!J|c3JMKP)n6IYijr##Z3MJ%hZ~Sqr^n^fm*YUj+rT6`YIy!}r53eu=*1q0Y4Xu(* zOw6(Db1|?j(Lz7f(DZ0bR`TM(fotIIsWX-rMIFbX^G7DG_b-pF9$A378)RGnxYKbJ ze~t?bG6)Uv+H)ZOmYQq?Ux_Jm)Vt6JJR zH*__KT_Wr?Q^R)Bol~kd*0a$Xy0Pa?752Wd+rD%(Hg0eRpQPtEx8EHP@mTtsSf_O2f|uQjv^L z&t}6Rv;R)J>;lx!H|UHVjxsj;G4(ZPW1+IP{;}I1VH2K<8fviN5UHJLZP|CI1GTg} zw^Vi4x72g1T=YNOORX)~Ey!#QRI&8b#Z}8rJ9Wjfvlp&Bt!g>jxTZd;tWa~Rq~r~o zu->J+y9F6XDg`;$MfEio;jG~J}tOf&b5K1U|eQ=-*4>b zYJ)XfZ07{)Qte=;R<+e^((8`<-`j|muaa=61Bk}%EjA!(K#yRhH%dWte$kd>= zb)D%0(l#yZ0SyiHUTaG`E+4-3L_0x++a!_y8t#3C6^zloPIVi)x=^4h*xqeu>VQt7 zYD4>m?uL4~sqLmqc8eslDHSB1v~~8(8ZLyCZm2t1*-e!WOvi$ZX@*&!PNitdcFEtA z$TW-D9*Vn0)wHf}fe~YgVQV4Ydds#+1M=Aa&9)`M(6 z)Y!)7w>AzO7!NO?z4Ra)c)3mn8St2jALC;*A#R{}X@uG|jL3M|>k#Na4?j2FixBu$ zw9bZQ>p^-@k0c7udhAONG6~~9~nqgxu*hdn8BZ^wFjG_yE9JE#{y zw+J2Eu{e}WyYl;ibqx2SS3_})SIl>s9m+Pg=$N*q78~o~B^(XEj4qKnj+w}UIu6!3 zh7Za^(rIArldKa3PGUM>TJc0hK3C|!Q1M*FX2ora*C^hmc(39=DL$!4(hKu@L9tKq zbw#m>i*VW32T0C5f4zCJ+N*9R#3 z`T%8LA7Hh{lYM<4%f3E9+1Cds`}zRo!xQi|jW7H9K$d-dfU>U-Q1U-Q1jRX1eSosB4^Z~?0m{BUK-t#^DEs;V zWnUkl?CS%ReSLtkuMbf6^#R85vShocLDah^?Co*VeH$Y&G%8_Z02=(@t=X3b8Ds~&OLX%(kK z$A+AY^T7^{BwTA20!_eY7+PHR_2JQ;(@K8k_n5U!)C2A*e*yNVm9ywA-%Va4?Op6i ze*C3;@1|Eu(Y;d1ox8;rwZ?k`X~0L^C2OSmN&AqdJqBrQx(UdG=kuY5^pem|LN}SK zY2O?qzk1DYl#}16edH(Wr%p3mM>%J;snfHtd*RAI&yv3nnQeqtD$h?tr`mfnc#_~( znsQ25zdBPjl@Yj#QrB+A2Rc)C{n^6NmLNI~1W|_qIzE#xdgNY8)F$3&a)FEzm4hp~ z9|QfrM~J0}{tlk;+==|BP7?am^8wJF@>Kxs>6r}aLV|d1s6^%4IY^#@|J>yW89<4u zsp7{YilapR921Y{384hZBN;SOq6YtrlNu#zFoHQBH5uXg@c_dX=EQ6*RDUsKSaix{=^GL!MTO4KT*JB?b_plGw7_bmoSO4RK<;~+{@>QF?9DlHo-QRg$`Ri+5>ycNthRHBM@ zXU$Id1x4F^eD>yLPkaJ@x8f(Cy(f4F`=jFYI_O*YtHCv;67?@Qj+Cg>sKuJ}9LVNs zc97?Is*V{r6ea2th||9kRnr+Isu2=-Uu2e{67^B$HGmTJ6n3*Om~>mww zg-X;Nj2S9XNAnD!5>+%(`=LZN=bM}NRpt^ZQGdlV44_1v&6v-abQO7*Fy^<7RGIgL z4=Gfll8_iFQRB^ws!CKQaFnPN(cV;v3YQ^Mi5f+wx?!|N9*PoGqee>9Fe{vG$V${( zaaK{Hp2>@HT&O_%7+b=sN#lh_GSrHR!V>m%E9Mt+#~LV6S%6qkLE(QBBPHsEjC_iQ zrVF<-a->A%Y#mBelXgzwXBatBq8`S`krK6wkr!#?`GxBk8Yxj1`w$}~>dzQ?sYb3W z{3WXpDN(OudV<|t7wV{VtmPQZXFDB77*IE~?ZD^Z04;V4nR zh-jijl?OniL>tHj*UFhi ziQ3HE93|?ZEVrXXeTeBDCF%~I&QYSmpz%JHsPT`W+4e_?`fZ-DBeslVc{J-hmS+$p zDldUtC0B{cd(|pY7qO5BrbL~Hyzz(_Scw{c0GVTJ5>C$Jah#OW5hWP;_@hyEe~eG9 zE8S$ofLgT+JU&s6R*wG)lKKZr+%-4}d)pB-#O|*`KK=wr$yDW%(nKFG(JQ?pk7Wfz zP3vq#dH-u#bprMlG_9lkrc~_w!n$BY;(;xyaOG3g)wd>jwbZfs=Z_r6eHyn1SH`c% zxqR5RT&8suoEu%NuORw2QrLpSyGW1rFBH5}VRTH$giqB{wBmG>4+BZYf6>7^w z0~jepLoFio+1(yASfaPH8aQcb`4e5KRe5KqHuq9y@>E7q6{QUI+eTSw^r)eNPW5~T zpf|TFH>Wp235dQyts=_N-2gor51O&HO|~*r6r`$LR6TH1;SB9>hJY?-E@_4?{H-bd z!aKJ=t+G{-TWz~h%o~lhQHo|My)%@UXbw@3i?tx5eP@FhJ+mqoLxn8VmdbsrLALsOs~K*q&7>@3@*a$mH{@DK1w_MX72`&A z9IDw-!8Yp6oe$wvq2@T$Q{!RaFeB_ED1-AMdNBKFC>G^_T z+@n;+h(jDF>#nn6woZ1Sc+`>DG|Y$bKI(Yb!+BZpeuMWO-;mbXc-cDH=TVP2C_L-I zHn8`bS899!7@vURctLBX1|nE`EnTXF1`Z!YrV zcWagpNy7X-fn%oO^`k36;81k3zg4}ONfn*TAj8YEUUOV8qs(ahTvb)yVFnOhYdy$aHj|9kAHEeJd)n>ec$|9Raw2s4%T?wlD#|wy z(f{sI|7X>Ir~2R28wR28weG7bD zMVDN>+KZr>?XNMG6)68fM8DQTW4nSJ~zMl&Eq$Z zGv}N+^PS&sKm}h06?_>~@MTcJmq7(z1{Hi6RPbd`!Iwb=Uj`L?8C39PP{Ef$1z!dg zd>K^mWzd&#qp+U^Uj`L?8C39PP{Ef$1z!dgd>K^mWl+JFL0fT;QI6otpx0?$@MZAd z(7fQw;D4fd!I!}cz6>h(GN|Copn@-h3cd^~_%i6rm?*HkKWX}=rbF@a;e9?#(-bMv z&DNCmn;5@H)3bH>T1|_2A0VFZX6nGoa{_#s=DB}{@$!7ZKSRy)1z$UjO%V#6>QQHP zW?BB{FucqcHM)w=C|nuAp<~2Wz3V#0y;-`Kp#zvI?)hHpp?cP$r-P_=!b}S}NZ89- z@st;xjt^D;r-(6_Dc@2WGyM|cfSIlV0cLsz9%}|OtwII|Gv!s)nCX1P_s95VAhTZZ8 z7mX#p#;6E0JstC5!xbh@a^mvGOcx>-G1DaKXED>0SopLeR1jD~LZF)nGnIAY2s7o} z(_*HRSch3E->3wSjj)($JL6`nxG{;F7?+8eUW6(LW?Ij<2s4!>U5l9th-NWUn$745 zGd%(F1T&SMjWAPrL#=xGjUpq=^j|3}2WEO2uU~|j-pYzanCVP%5oUT5Q%0ESAK9l7W_mYM_5m~9&U!|e z=}Rmj2WC2iDW6amVp(DwPaezbV%WmuQA}(x)1R|5EM{8G#1=DM!Ne9b#RoWUF^#pA zC9h^;ib0&!c+R320oGu_9;7Bl?}n_w~1k8`+M%#?Sgi<#a<-oZ?- zpfCqBZKN~@GvxwK7nrGFp$=yHRU{M4R2~2pGYwdr#Z1#=yTMGKL$?TK`tR%?iVy5#MYcW%q?OV)rF0Zo1Odn=qi&f|;(QGzT-~_o0iK-p%w5X37l;E@t`& z^LL|o8e4*H>J4W49TsRY)0wPKUocbNs|GWbkEVl!nI7+7g_8V2|F4))({YmHuN@v^ z7msOV^&?>OWO5!YhWC>}Z<#&!@iZMQtT$|}tt)Na)|yK~pN>wF3H+D30?GuHnUI@BCI=8n;53dFBjFhWDBXgQRuRym zav3nB3+^0-kmTP7hwOI%v2Vbp+%%=?QydWN-xq{D2)Lu!YmftX>XC7WZx-%f}7Sl-Z zjN|V%O+myxkH&H>)HtT0yAwZLreZP~ z1d;w`RoU-ss~OAidLP1gDW*p|BhT=Ly5WZcYjm#(Tghw7pK@+(*dC4~>-t0g6HDOY z*k{E4s4rn0!vNcH;o2g9`T_1ta}<__>m_U6gH-)FXJH|TUbH5F_P;Wul3x2A%vA^cIzKdtHWnqpyG%Kg2jf~_I_(dcg0N3b0UIB~^ z`Q;3|^sWxCT1Z& z8H-2K25pLCzeodwu+pn7)BX?d6d939sj^-Cp0^OxZ$pd$2>$}V1_&46t^z>#2P6SN zxEqrh0}wvX7^_ryKJsXQ@HdFb1rVxSF{-gR0O8lcT7d9=a^qK`NLr>1Y1B>wgrCI3 zDgp?{fzbfr-=r?0R7tFd0HGKg?HVAw4gw7%7*Bi^84OpLxWM7^2MB+PTm%STWSt|W zN_jIy0HNr|L;#^!Ka2oEF>x6wRbI+V5dnnXWo;v+%30(hfbe#9K_);*H5~y6Phnjm zfDnwUR5^kfEkL-Et?ogol6sH=5K7NR0HI)u5kUAw3W@+iQ5ou$QsrDUj{xD3loJ7j z_)6#u5I)VGumIutV0!@&p2Y$pfbc?gM-G7STP!>R2&Xe&1P~@zhX^1PD~=IB_-)2T z0HN$;>H|P1Rzo9z@J7}%2SB)=h@aJrS1qfT%O9ldriGj(8jVJGB&zRW4WE1mRfbcY4Z3_@iqbLgyZewB#5Wc{U zv;g51jI{vaa>iPKu!`kcfbe@P$O43-HfaIE|6yVa5Vn%F0O2}Hwg4gTOcx-$n4%qk za0eUV0EDs&(E$jHD7~{%*wG)6)bWklo zxQSvcKqxAy-2jB5zwQ8pOV~&Y5QbzeK)8^?EkO8n##(^zTkHS}5I)XW3lI)xUJDQk zW^4gMekMBrp?uw0fKc`!I7*eXDa!!}-@&3Bfbe?O!~qC@K0O4hfca$n` zAm1H8_!T7R4M2D~D{KM6r&xYp07BlY1|Z~0&OuYEd=m|XW!lx4>-Z`9-{}{D&~Ziq zHOl5KP^2sqMaorUX;#@Un}r(r7mi&>QYKlKkHLvbhFLML1@<@nGbqTfIKiiJVt=l1 zDe8DK`|)37iJQR$%FlBrszG_ayl4w4;T*1MA?*jv?_Z}%2_^(E@9CEs4y@a-S#y>cdZTjfAnZuB8-<~S+L@HHlI@D{m8w{)(Z)YXpuIvD-;jaOBN6*U1_6$tzcEwrZ<*=^#dYO(mX(8z_4+BQKm&;YOijE>1n0KYykee4Fl(G z(U%P$u;7bb11(-jP1EMhG#Xtpw~qjBwyr4OIqtgxvkY? z^O(Sh8^uV+88#cg&6SR2m^>82bX;OE&Uoh`!1x(=A6}e%YZ_OHe##>?@~WLY@QPw(t$5TwrlY$MKd0K>^^j-! znW&qQmyO@n0z56F0PRfuvhmx;oci&@#mLLXZ*PITlo1AM06S$Mtl!7g-{C z+4${4i2R9ZB+^kHf46B0BJLXM${7aKlzS)q7*owA>ibBCq9bS0W#hLUNcTXL%F1JU zHMdfcoTS}@K;pM-3#-a@v8`q-!|UyVuIPMvv@_)z-cUFE?}gu1n986R*^ZSC&uf3Z z!!w?9P~{Z<`%A+{S3w0FO#GL1B>szTjvTK;QN*e1auRr^U4S3cmuAJ!0MGVtPR;mt zX2ompC&H8Mlvls~^_<1b-}IDKO|oUO?Wr@`F<{uw0dV~W&@mWC>{s&llE?Ff{YakA zmtas2xHJZ^;L@NcGd<{ZO$C<*&u1OO-=nGE(%?5}ey65_OC$Vd&F|J!aA|};s(Hbs z!9TBg07N4H_nHbWjd;POK?Rov6ug39(~P|^7W6`fDebvm8se1aF9PtbdH_@kPN&L_fU^&eDlX;9Jm1Qm@M zP|^7W6`fB|(fI@wolnr$@DO6XMCTJ!bUr~v=Mz+PK0)VUOfjA4e1eM3C#dLrf{M;3 zsOWrxiq0pf=zM~T&L^noe1blw<%!NG_}4Wb#{gzIqVowVI-j7T^9j00$BWJ0(W5G;JisSZ&etdL6!7({JeT`!)T64u4tG6z?14AI19>?^!&8 zgimW;o*#%`rg?c@ftTkI{u#>WEamVF8wVEeQAc!EI{$M`mmP&d(6y`+pP)y3ctMY7 z+ix)Il-3uWlfD*@p%welwBwA;;^FOWdq+Z#^nW$>-6h^UaHc7bRK*?Jzh|1JIM(Ev zDdf0J{GPWB)EA&}Frw|5rau#IB4UFUTtl2`N+l)$$SrtCW}j*LQ6$!9n$qrF4&*pc zB?SM4Bo1;+M8=+J`cZP@SF&6n$FT`yi$4W6_Fg2UcY$3Ds@ax8Dx=uFf5SWa}N=|W15&NP+P^BJl} zg^7ER-=1kI>Wk5trq@tPbf&4i=b|%B1tZHm({v?@>G@1kQR}kE@yA%V9*|?cc?CI^ zo{f;>#jIX*rs(*aCZ|X*qkzV8gNGRF{n>f5DzHv4u&QAlfrc8zIs`j%B)M&orgl zT40gmN7#|}Ow$#thDDCIG1el-*RWiBrs=CJ$Rfv2F|kFCi^$qDO+U-L7CHVnV=Zzl zbKYj$;coTZ*8X(u0Pw;^W|eK-S5n>9)l| z9NmUK<2sa!qmnm{b4=<1U>LzoKu;3`<=2S>bOm#oX(pd))9tfnjp2S*PsVPLBfI+ORzwN!Im; z4l1ub9j_fRL##|kj{P_x;#9w$lEtfqa|0=w7iLvMgPaQA+|pEo-7zY-^IHnC*nXZx z%5rFfmTez6i&W!=(C-u65L9qOP{9pB1vdm0+z?c7Lr}pDL1q06RB%I3!3{wLHv|>j z5Om-yQj9nB!@yajsviV5M1Kfw2r9TCsNja6f*XPgZU`#4A*kSnpn@BM3T_B0xFKk7 z&muh%5AeR|w^lC91oEa#nU*e_nNClgol4E%KmC77Iz5wCUZ+loONBScM9|dIY#9<>7A)ctg1TX9Yld}qoCl#6_A_rxj3F%$O=btJ@9{#FG;NA%H zzsJZc@h`%h0zQucG;v)ZK1jy}b>RGXaId5kX~Cf2>niXTkf0!F1&J2~e8l^MV?JLj z{-mfxf9;^pFyxep{9mE=AO+rg!S$0>F}=*=sp}}MX)}@5w_hj!+qlu0{$r2ld zQ)~t!Uuj)fY_b9}k{{3_j_LXVLqPqwkJKGw#?Se^JNItGq=)k!ejD(XV>;D34>%)_&puNJcx4YH zpBKiNxa@DR4Nm>K`v#-BSjq?kHS)5*!J3`=b@vVSG6YZ~);N0kyG>IQ&ZAG=v0$>? zi3Au^%_be8-+aEo&O*9;zQHajKtH1}euE9ikNwPkNAohi!8ivPjWFX({S0rY8-6Ih z!B|i0+|m!uHy6ha9s7yjTxxre1WCU|FU1K}`i-W(pqOF|I+piZk9#Uni0r8Z9nbWj zX-#Ko%KMq&3pHJ)=?YEH*R)F04Vv=4V7`kry_6JV?_-)?p~EFT!g>GEUJ0)~(@FjD z&rpsPhQqSvCCyXP(Kf6e=Wb>B+a}?DL%3+}Hd;n20@^2cc&WC%>#zqa<}DX{BHR5P z?HKx3hTgR=(iTaq{qrx-mOri(_GZo7_r)~qnBbAZxnD}3-A@0XutzI|4H20WA`Ruz z|NH3N^$F!t3#941kEe$98uoKX@54np+ z;%+SR7LP1Vpx*C*2le(E^Ve5A)?1;asN1@TXUT#w%ndSadq9?C33 zKa77K!vkf1%Kz)IBQPPvlu+v9AIP-F4ztWj=MX;}vSf02Nl7@QWO8XZv?RQ^K0P)3 zKuLPj;-%POD220Lbg!JLsJWi!l?z{fjiQ%-ryRFO2FAyGz&Li{f?=_WVezZ|jP)nJF6w;Apr6KjV1Q(Phs; zQ+RevL^zg3`-qP#&p~cOm@DqwZDc9l*o> zGmdHLbkT;qh?M&QV;OXah zpc{r)1(za>V;q0?Yih#pL^_UXg8#9r29G1Zw1wqUw>m z7L8knz+(_H3P1KAuMhhKMMdrv1e8XcmFEPB*OWu%P|RuF@`)R8Own=7`rz3n>xO37 zo@5HfZ-^4OwP*W{G?gIqIKr$8G<4WepF4?J$Vn2=Q9oF7b42OV0gWp z_6wXv&z5_dE6Gca_*qoXM-GTN!?ARRu4)6>DnVBVVGzJBB=IKs)%#f&yOTncFuHfC z1VWEs5-!RrftXL4`7#p?XCjt5LMI!fk{y}!PQpy?s3bCGQOGJSV9S`y4q zafJzif;Tof3jXCnoM)s(baRUwvWqo7EEfpzJf0t1y*sKD?9b4CgbqCJ^?Hr8D% z*qXk3C)lnP79f1UE`tD_NkpjcZyl#;K!~4iZ3JkZf zevtwL7w!6THr97oUZlWq3G11|^xYno_k?QSvP3J(i%j1g#hOJ53>T7%6c}QInXzZn zcMl?2rUC=YaugWI=BdD-lWs+Gj`}kG`H?6HxB&t22l4Mp$djGWffxUQ%j3b!-Nu)q zMxwwV+Naj^-Abg5R1{*#ce!jl`8D5(Eli4Lt2KRh3Pd^z3`NXqP2XL>uCfXY-(^Qy z(|58X-zqRHWvo?TsA9R+^xdT_$SN>A!^BpB;ZIC#P2X)IYZVyIV`8hoz&q15eK&)m z9R-FuHo{S0c$M*v0>dxJcQ$=@DjVx4FuVt1M1esb09JuvG>f;U?=XMMPk}*{sH_4* zEyY*`hF2*jw*o^<4DLA!3}U3vn!XbSWUIg+`yQ+U!>8CIR)OI`cCR&kcRypT0)w2b zW)&C~vSK+E7(UIuvCH1*Ylv(VHyL_puI zy5-b}h%O?3AKuuLkqN$i_up!GdoJX}J!E7eCf&F@3@>8yBfXnCqC9 z?o|Ak9&-$Fxzfq3L#H8Ox?M&H{Kh-a@x$v;^_Fi(<4iiv3!Pw(w!KE9@@xm!5aE@2 zW#b|fu{Ji#2tgX-&BjG0;$6#jQ68z0SMB71*IS2|y1QP_bab4Cy7fy#UJ7B9hn2HP zUMu{j4)A(6LEaR4v@>x{;9YqYPW?EqF!jsUk9Y!+DJ_e{$m6`*mA3}+I45EKhT&)A z-3UMPn6dO*$a~Z@QpYj=Hth!y_cg5by8U9xy%Vt*E6qBYw;$=o83xp(LvS>v80}+? zHlMvYlK?2uMiuwwa9NjCWxLo`Ge+U{Zo#-;Nso4>T*Djch93$XBNJKhrS7;i+WCS! zqzsGRV%sJ;eB_1aVCYX^NmyJ8|A|YG8ppbDPHPJxZKDmKpI{!K zCo>=DbWKm!l+P-L^VvbVR?`id?$q=Xn%=DGZcX_m$9#`!`n0CcYucgd?==?pg)$y`K0{&&qi;Xt$VzdKPY_x%jjW$rR(FQ6u z+CX2#!-Mq^8*QLsqYYGSw1J9^Hc+wA1}Zk%K*dHIsMu%&6+Xaf}+ZJ=VK z4ODEjfr^bbP_fYlDmL0c#YP*b*k}V48*QLsqYYGSw1J9^Hc+wA1}Zk%K*dHIXe;(h zvc95g0V=u{prUI5D!LY+qH6&vx)z|KYXK^{7NDYQ0V=u{prUI5D!LY+VxtXIY_x%9 z+h{u)F9Fs=Y_tWKsc3L5i5nR;4_F%G-8y^I2X(-KWCq}j{Ec4{0X>3#40`S-2JHL(6aQ6c!aFjpMw9P z^s{@zvbMeR*W9xg?HXDPf7~0n4{bYck~wn>XM&9f&$QdUk^AuuJuW@sddN6uKiWLB zJiQa!4$j$odHPmFU6({z$MZa~G|n?ypwpq7j$_zE>BnR*;2`Y%Yu0C*4Thif`ww8I z^p8Lu@*Uu(YnyOVf8<{PnJ*)JjCXy9u?Yt&ocq0s_HX9QGyZd4*iTWY2LE%S{ zs!MowJ)YzSp1lRR9eDN_hXH~A)XOY^0XZa?v@GRj|2c8{8R>89iQPT*X z#l2wQ*>6i-1fIPZUc$4FFgDY^ToKv|i*<=LjEdmdjmTiQ!bHm9@`qH!dI8VM(Pt4ndo-^`AK=;R*#8kc zTShK|X9bXm;MsfFgkIQ}E0VD~C-EK92%g=}dgg#JnQ-6 zN2G)`UQ7^}p5fWgL;m3f&vG6r@a&Cjx`k&?VJ{gAa{nU2eC*4~=YoZ2Co-RfXMe@g zyMbqEwKj0z*&%GCg=fFd>=vHow9&CIcM}s^c=jWdW#L)cpK##WA2Zg%vnNqzglAW><19RTHS5rYsGLLbR0Q^^KSQY*J?Yp!cm{)VQSP09x??%KL~_;DTJ-`E5%E-WUc$bzZi_dFk` ziA|o8{^I597ni0ttpE9jigamMyCfV|e_6QgfgOv&<39E=g&JcJAd9Q-&F@X)czG8L z8*#ONS+FbI8I!b(V>r{vK3qxMih=QGj1apxHU}YUflLy}GMMPz7C{i3>g!u^U|{9u>QV+^uTZvT<`=r9$in&IIc>b9!Ck#qLYNyehKs;>V6vXW?);60ah8`{Cu&2`^s5 zNXHpA8!yh4j%%$Z55+LuRZf8M&dW;o0$#*?BN}JYW#h%8pl~x0jbuBxp3C;K9ocyC zYP_V0n;2)j*?93BfSAlrd89^OHT)(Iyxyw-_~y`~o$2Rnym$fRrI3d5y2Fdp0BhN& z#+kC35a4u!SL@V|^A1zLY`plrke4#TK#jZ|@VoLFAdmPR>xV3nyllMqgNS^{G!p43 zkH6bA1raw3cwL!cKux*XcySZbq3Fn&blG_ECy_26y!e~If!iRYC%kwK#{K)EQf>X5 zAn}^|kU121F~^2=3Lhp;s2nxl)SS`q#FtY}yb4$U4+dT=7%#+g-b(xzw_W5ImyH*5 z?Z7z3FER`$`HC!lbrxR(-pr9%o}LKf1)l*f%l@O*`ewdkHdR*DynpM)7R=muifCpO z6rk&>S`k&*y0H;`Qoz6yeWm%Ib~5 z_!C?glln2>iBqRQ1Mqw<^=S73c-8<;jea8D$9@AHz^PR~4B*tN9}ZWX`ejTMWZY_6 zfEO$m3KN_&J)^>G1b)+#??zEg86VTJzIM5iidZ{4={*CI7R)+PMh}uR_+r;MQs2)_!~2-tzKWI|AUf)Ugdyupa~bnb`3#;I|&|Ut+<& z*DP2z^>5P}NA?U}o!*svUE{w4IB!4Wybh8(HWSz#XYD#J9yte-$rHFBmC|r8)QZn6 zWT>}}!;@EC!@VoT?|Ixl<%{a5hI@IQm4A<~bL9T^+SCJdf+VMEC@b{Fg;NA-`agE?!feS`bl`PgS zbrHDtCU^<=UI!sL;NB^Wis0TWk->0*h6KPpi}DG}WJQ^w6!abps#l#&Ve9*tr|8#l%L3#gzQ6f1iP z!9sFj@peD)6$-U*?*i7X2e|iR$SZKK^lSw89z{v3RfS@SdKMSKy{t>`v~m9v`3d*> z%o%Cpa*o;w?%m9SE!_J$a`po5eJ2Zu;NHpX#~g6)-7NfW)xgmSev(^l+<#_sBe++# z+eL8iTGlUudj&J<1Kj&pmL9>qqF0#%?)@msi{RcG)-%$^eT`fM_s(anE!_J9vOUAS z+|+k?!M)sRAaL(iHr>L#b9prlpc_kyo~B{r$!pmchAm7U!Mqmkl~?qc!S$R06pu=Z zQl5o-k6~g9_g=}Kvv98fffnvfGuFbr=dfH0_uj_~YqfE2U}6jRKF7os?tL#=3-`)C zPYd_*&UCeLH&e8ujk}!v;lRCI+#X4{=QDcF7og?qow`t=3wm0dv^?%l*rIaqM-f1`moPV8LF zb^K4FAivBnLJ%Ei6h<3&n&7dk#?;q(zU;{IFC0^|IbxQNscKnoVpfc80j%W9Ti34` z=eM9w{5h2BL(3<1Hrb*t+YBE^aRDl^1Tou)?eTUBS+xeDuh z>l@(%ba{9mErzN$Hgy5Mif*xnUFDY18kPrJwf3L`r-#kCV|{xn$`chhv#hZIXFfQv zYh_~wi0UBmStzPhMAoa z;QFFzM>d}Nk%Z^XHbRijc;AyHZx1?({Xlu7MqV}iCJ(&cH?h(*i5~5kj_yMI-1fPr+iJ!#yxw+< zmv_*ko#_|D8|sGtz3|iuQ<>=Mseprtm-5*`{1UKpuA{mb;C z0}HxA^E);Dgr+xZx?9uxHGNdmr!{?E(+*94uc=_AkS}X}pt3*)Dmt*Bq5})sjDf@Y zhz>01RhkzaSn#_wf1jq0X(~Ffi0{z+z_W2zrT2NwMyIT8>t>l%B36_!oUTgSDQ4<9s@&lrOhQpYt8e9&LlwpXyi z)F<~5Clo!=a^QsC%Kg+ajiuZ6BD>aqg`OyQ)Olzu{rQfE%J)#$6*{TU962X-YllB) z$H<4$dyb^e>4enwjx@qj>Fphpz(2fh&)!K08{=*7n20dS;Tack;EzU+RjTLwqpjf4 z)IV*9{wdP?skXhuFvAh37tYc^U0-7I0gUn>Vw9QZ%H_~S)rW`}tP*C7HCFj$-VSm} zW4Iwa?+$_b7N_>P;BCL`CLKtC{H&aR`R>`?S+z;m`Qmjh` zRvB8XlA2qg#VV=$8TNoxUW1aa^}|)FXCtigWJ+4CDjQ4OPC*e?$-0E+vxCCo%YAg< zY{-b;h<`WXCmnc#ccec&#-JmSMQ?Fpb7ONZ%_JZ&$!z!D- z@T(Msku(fT0O9T;>GBvY2ZwhkCZ1T$0wS!EdTn6_RvF&)1(7i#@gVy#!YZdSUt~G> zaij?&tg?|@gjH^1{UWUL73RypD#LH764Jvex1!Dut2&o~L#4m1>NzJdg!v+@@+#Id z1FHpxu*g9 zBz~Cu6q|0b%CYPvgGR=Z!(BF>B-|3k7A9${I?Ti>LyJ{XbuhG8WeHh}RepvYX|YNw zu7(z?B!&@MtdcNOXtB!2IIJvIc^4B~tnxJ`wpis>vKFgc%fuF|#0A2n7PZU~ZZFulbpsYDoBta2WOTdeZS>=BDqew!U&vC4-TYq82B znb%^K#H+(h)zt99K%nR1<|KEkgchr$I&bJ;l`|>JQB9=+Zs=f@H?k%UR`~?QIauW` z#yeQ$hZ*l+l~PqR}F7FPK; zG|(R$E<(o!N;S0-(;okeXa`hN>8HCLKLcATBf<){oL|I`*R0&>cDf=~2 zXuSvA;ik}fm{~YhUuXiC8XZ+!VWZoMs~73E!jBY6qZJoV>$xH{LQbL3x@1PU4Zq>_ zVN1#6aCphm$zh@d=fq8)#zW&S!ufGaO4FyN=|edAl5ki_>Hn54Ub=L$sJe2E$;Da; zm>S0+06o_Q!$wD{uCfNjc*b!;3;W5``*w6*@4!G(ITdeAgy-@ew8 z^HPsBLtC^`8a7g^cG=nUmsT!cIDggh6^qYZShwsX`sum3hNv8$~f zi-F{Rw0*3NC|6x_aVTM!EK`V81S1a8>-kL^^KyZ z5986bFdSLAY8eJP0R6fxIKHs1Qc(VW#aq?A-!~vwD;%50b7j5g9-$HWLbuWp0|t}( z#b9z*_LAKf1YU>Y0Lx|IbT0sqDMuLA8iCH>8wZ*$%Gpns#L4wF~g_zSjsrI^)g8YhC?P z_J@&I?c{;idmU@fi|Emg>FBcYTI!dk5YGBxSvr!Jjn|d~EM=b>XX=-Y*IosAtQX~R zK4R*Zjn{61ycFV%GxByI!0A@+ddTCNIOQQrB##>&nTOYp?h}Z7!ZZ>*4=*UqPUAF$~ok*7tUi&O?Sk9??(tq8FaetvIO8%R2ouE$Pe=ofD`lwP$ z|Mhl<$MEwWclgK)&%wlVS%Yp4*#5{@8kV|c)pii8_v@;Uq*^} zgKHbgXCuSw>ze8%a!Umx+PD)*ZHt<6q_cSsXd5kD`saN6`+PKbz@z8Wh|C0ucG* zSbGDATm(*Ox&l2uABkfriYy==n*%-8B?SM+BK5hmK#yspHa1pD0(wk4r4~JoO(!ep zajXX8EOufk3Mq`mIGI)GalqyOSb;Tc4D|Rvkt+*5R`O$sOBi*k;^K*o$ZI%d*w}FS zqsO0t45G(vs98AGwBrXXXPPPXX~s=ArGAc;pP{(I#2$1im~YNX!b!5=npGA+SvmbMy$6HyIyH&o?iI>Sm=rPr6EqZ(rxd=V}0_zu{$NYHd4SKA~ zQ-+N#dfdQz=0J}hWqD7ie9IEESl*M0t4REeT!bFiv7Qln9Eh&6)^ueCb(HKZ6g848 z`um;m2j7DHO!U|$CJ15@zYqRV%rQK+1pkk^2LJpYqDUoId|IwOcQz7*TzQ{6yB#$W z^!PqDeO5pr*fWr%dSQeQ$C9VHtTJpI#TF)4GVd8W?}+3nkl~=mN#>oaW7EkCnb@Mo zKW0ZR(6MF7M#ft7csXM&dVC_U!4jQ#LGn@-WYJ?n_zrq}KNFv=6IUc@*w{gj*D?#r_w=>|H|0h=yBj0HYR#}5*vALPz32510Bq6(c^^_Zqegi zOl;BPkFW*j>)u|J{4!%LdQ2sC2R(i_CFewsKh3_h=<(SU<)FvhKI5Xt)I|uZrR1=< z%}-XaEC)T_L2(Xxd?w=^^!N#7{1~xt<+$p^UiqaY0bS|8GOKajV6F9yxinwj zcBj%FG?din5M$wv!0zFq-g-b7nHufVo~j0A{k5vK#+rgv$M9k$^5PoU;%ltC*b_s3 zK*Mo5uctssvwBGgw63bf>jPkaD2*6nRaIHJeG8pSE02J~0haAGmKqHpV#@=NYQI3L zUFyKPF9OU1#ARcuZFsqG{f+M)%mgAV?L^IEh9T}lni|5iblI3{u5`pCOdjTAI&KCw z&Uoh`!1x*W7chM58E4`+M|6U{d)N*%lI`HSBHN1>rC=~74_I$@0_&GffbqTuajv|4 zbztuWpgEC(wKM(9DXA+jUme(ALLRS?ai)Gv2yo@)s{{KQ*8^;XVnfhg8s>G=tFo{4-I#M+^Qjv@D)PcPOKb& zvx68W;Ka!BIpK~?@@moEAe!o>q|NnafRl5Olsd3%OMq)BYyZHFSmS(jV8=5Z#vY#| zq^E1j=LPx2nhxl|s{W|KO~HPVPe#x$Y5r@P@)MZxatRspxru$~my0atTAF%gH+N=PN?gz9y}ob&SYaw0zzVSw;0Q0|VWm*= zEW^b-dL+QU5Qr#)4x%1vU$Mfac=-7QsIsua|3*-kSmCvJie+Pki?BjkckB~Z_-Bgg9ai}7sFh%a(z6j(Naf@H!wO3w zEl;fQeim%8LaG+^87rjzP+zb@pLK{dO;6)>i?G74GOnMo!e-Vp2UaM^bPlZWS9rZx ztng&k(_)3kqoPLBl;3hWu)^;l+2Ms1QrB3p!f&&yEmpXUy<{~_Ik$?~PFUeu=FN!} z9?QHID_qaS7At(79ci(`iy3RNLQ(I{7c1b)#uI9v4lpLea9cSYat!VKq(Pq?m57!k0K>ax_g( zWg{(C_*-VTSm6)~w^-p7Oq>%dyo0e8E2M>D2P>?gyAl$b)flASy;@F061HhumRy zqG>LqueGJ76yO99zR6Qcrc7^csnaY$zZ!$?^*>f9pC$c+7C!1_z=e6^g|u6Ss}EO> zuPcQYvRV=}2LDwgF1L1E>@jWtF?^eyNLmj~JY4(Amg!|sy{+0(1<+1Z5tXju)<&(8 zD*B}K{~b}k0|PGgt(TXAC)6c-q1IXHbeQy0C*{t{w-9tVfEvzt|Fp?dPWI-G#Z#|} zdpEoD98FiUg(|Tnaz~X^x3

%X&Ot0n_nwUkBzTk&PP)-iEYqb=+`IFL1-I@XBo5@ELSeT=xqp`;W95KlZb6 zw4FQAFrcQNvvEV>e8gGU&sa%|%_j%MRbTsCg_qEkO&FQ$Ikx|n}MWXcEw zHS%`Ak4Z)3UUBM2?8wN=*2Nr)wO$$*Gmi53yG>IQ{$pT7)DtnzlzS%v@ZHgD!iQju zHXq#ZB&5p+H(Z$~ZnzWUr7N9RQ!hhJy~!U6+>m3#I&~K5f+)bP4f`=Ob${T7f(4?y zMfednL^nl_ajsowNvozM*jG29%9~IN7*Wkq2C%~c`?&+yAwJRYyj%^CoU~rk%QU@4 z(=TXxx28YT^jDg`tm$7heY;|Z8G46!wDpJ`$~nST({Rd^Y3Z_=>GagusniVq)BmTW z(=%sIPo-u}pFJ~Q?C?3YVIo7%5SG99)0Qr6=e~nFh15CpsB>7cAMfnr-td09H|~wt zk7wr45$kS1___P>z8~tPZ@`ZK5&OgP`gU*Ku8vXZ8wSC~ElOCqKc3#zfvrr>52l@4 z*t{L%-Ow>%&kY^J+u?t+bT4Jc%GV*^W$kz`KhHdWdh^XEq5X}zeCx$=NK=-+7GrGE-}?fc8qJ7CB6yLphwWe3!O$2lO8` z+Ig(SLUFB=KtfN#-0Jv}{PiE5<3Ky>Kh_XHmn)(4AKUd+S%5&l9y6{iO!H2JcZq2( z#q=s0)8rXu`D2<~Ds?bTZWXbZ=K16-rb#6;jcLw6B_m8zkPNY&+m-&KsGnt8&*dZ< zC~0C2$%zb zj{^7g9@G2-OL6ocN1~id@xO#V|Mf(Co-SKG#_AWH<%`oR2S3y z3)5RnQ?$k{rWsJU#WYuQgyh6D|CO;8)6CL;Ot7GQG0h^1axhI=8E`Sp?^D>}jA@Ea zcRyg7yjP9>;{tZdLB=#oaKSaEc_yYkJ~y@cXGWN2JDwa`|M8s?ziKR0Av5F@BbE9~`mQii3NUT}BYm4;q;Cmuv{$%hy&BE=S*;y_H-V3@Z)mCp z^zG^j_pABZUh7F75EyPA#>#^4fR^RK#7o=FdjS-)AaQ`jGH|kXyo@;e=m{_7apJBs zY_^_du5@W+HhCzA>AJ!#=Vhh)6edZ06B=h^oPhu**o))EnU9|3>sXxpq7eca#+!|o zj>ZCL9P#WIQuZHdHGU=!yxuKX2cJZbcBY@R@zNCJ5nt*FFMS;H^1(~fPW?E)F!jsE zOFJMhrRzpw>b?VhxBtqV`gMnw4npJ}(?~6kGH-Ka!|Qz)_+~zM>EH6iOOMCuaz1$J zA}m(Zt_#eIN`JGe?02>mUj>o73FCfY#Mypvg2Ze3i_G5(FMT$ulv^9N=iuR`?I<%J zycD=Wm zJz=m@0mkNw!Pcr5P=vuI@q{HF>H#MO{^u+!#o463w|(DV-+Xf@G11Og zrUvQ+ggdEl@yH|nqx^Eb5W>t;FHu_P0Cj_`-B<5CJ}dFVn+@gKeP8c_-^Vl53s%ur zU*GEaDW85i&K7+t=YWip1j}RCr&uK33U83IXX>>eKJZrafB)F;+Ptx~273f|X?c45^Oi!Iq}E#!@3&9R+Iw|OmmMfkCKbX_g3Fo$s$H?`FEaZ^95 zUaD%|dy7NfyXVh8Ej1AtPfm#iu+&8CzO2LHJSV3n&c|seD{wkbOx_z`OEz zhBWh29z;j-`2Aw?!0YV3 zH^!+SKHVaDJK#5YDC1!;DSEUsaUTKi%A4TS53h+x-lySbo-}@RzXo%O^2&e4@%MR6 zB@qA4#Y3pfFizZ8;Kx{LHc>?H#u>&*M@uJWOfi}VTi!>Hb}W;QRGxRjAsq)c0x|XV zhU3S6X1}wo8S-#Z`8{Wxk!N^A-SD2jbKIJ+Jhw#hW^^d&p^Q{h65|VGtl1E^bjG_^ zj6AQrb)m;AXI&^g;PUJV>q4A_V!o6nBADMb`bC0Gp6dC}?(Ffq0WTALCW{UEsif$J znVP;+hu3PJ*CjwRMr&T=;e7P#JN)$gecXc;OYg+_<=4YXE9WFXx!p_eq{Y?;vTe@)0ei2wFY9%^2dndZ z1rv{fy;uFV_lj05^vUI&_g-b&p5K7MMz;h5&R>qpm$mom4up5P_i71l>;v0-^$3f! zw&%}*K)d&f=FFYFS3C+=@4X_F9qqk(7|C+mp8q^!yWV?sI-?GO?Ri?%&$ajJ^Jt0P zd$j{iw6^EV$whmwM29`vd-b1;i|k2=9fZE@y}E~0>)qa~t5CA+y^@}d_FjoG{C?Ye z^;;B@=iV!xZ}05A3c&Vx@6{hEs}Fmx9^}=C_Fjo$>1gj&6=nAG-m6nMYI5wo+Qstn z+IuCtTL-k~d#{Sf+PzoT^YYuhS5p|<$Gum#QdGWsuZo%2?!Drj*_}NJ8ZGOCJ&9K+*4cZ- z>6`4mk_SM}y;n~&TRwZQKEv*^_9VDl#@T!IZ;b85-YYRSZ}(n(iP>}Ry_(M+$+`FH ztBlRL_i895=ezgn2#V@v?-h--9M*fUKE$ii4|}h8ubRDAX?Ds%-g`A2^>*z^aJ!=v-e8dleiJJ^2_-l(7ip03-FcDPit3iKil*2+0s9Is?HE=67k}N8-l@I?w8`X zlySVC#{Rr~TS-JYzO-bo6ssj6U9IMsX)qHEY?T_=DwWfEynK`o*pP2&scYOqBl=Yh zJo2*!i_VQ(aSG_>jHA8#<4|vVp0}J6{+2WZaX{Om^y75E1pUD4>{UQ$x&Z=BWr^`kvCIk;deq49d%AZ`84v>hR5H zoRL9n!3p->Ks)l;8+9I*S-UEi*n%ss5HDA@i~T}s`lT9vQwMmx=dfNnksj?#KNDMU z<&AHDS;4+SW!% z+}co{S@Bm1`ooq4aTdA__z^>3KN`n=BsO3ic|IqMBd-_xBhwNxS;ZMI8yh!nkt4Mc zkg*jCSytl5eNPvV;ySav-1j6n0suhv!GN9mfqhN`cIt5-;Q9NHYHNZA>k?1oJCp|! z=Yu;oH`%>TJ>rhjX5?*aVhzE6yk4dYnTS0%3U>_3)%n!E*UUXnBmGnxUJ5&5VYh9s z!4qTclRHKepKOO63hsl#-l$=S4{1-L{qrvXV|-#VW+FPCM~GikLv{`U+o#KUPr0gwru1V}oLQ;m0Y~H{ePG zNj!@&KVnRQI?Os8U$7E+!qi;E6#NHb!XnQ5y!a0MyAr=4^kBN6a>aNMhyfJC;>0ar z!?8t365udvQN$h3cP0(ghw~UI2I|8GOgF+4IU6mEg+ssuV$31-2dRr3X3dkdM+YY- zUPP|I1r&o*mHb$OYVU@NCq9P^hAT|0aX2~5I+(POLB*qRz-2oMj;{jyBY31m*rL-8 z{t5gh1XB{vAv~B`#Q$i=FIdhr#l;c@NE1v~Ts%SeJ(!`m!o-i*`7;$aB5^UfS&AE# z_!mkkQ{3ppDdc7=ZcJharJSa?lse4%XdiX-gZYURYq5aF$XORKUa*i{SiId&@Tl0p z0*c&gAM|jT_0N&_T0dB&dNu+SiFXF8RTW~18!0F{%$juxdUcrfbV!Q_bqVYN^n&Ox zYi=$AXK5PW4=WwRH2l}fp2^{~noFW9Z~@i6P)4#mV1 zi&?;(JOw)_E=+%`ZB^c!#9vwZqcr^y6qhHql4byk!S|Gu z1&L=^-V-X{vP2Whds1-~iIJ>XbeMG|xd>2VpZJj|ly(CG;t%3q^xO!%_zzqjA3Ri>CSdQyf*&RyV+&>l6oRXs zJO^n5gCNF|^IbNcyv=uF3zM|D5uBm(j!32{9AgffDcU*Ax|-P>V-Axj%{k2aNb(;Eo<*C(;+F^E60o-iaoa=!4SEGcwQ%uW43MpMLxZU1vt!l9}`+Yv5sP_F$W$$666LHV<{%r z2I_+iL6Rs{aBjd?6UV@RQMd&Z&tz(A%;9P#wt(V4vjfi8y}c;;b;epiF=XBgf{$Xv z1;uNUt0*}WPz){%1_C!b{b_Au);6y*SlwD%G?2I`Mwe6^G;hgo0FnmC79KS*)T zVb&Kj-Z{+rBE~z1S??m>&0*HD8<8O2!>oh%2T6G<<@UJ5i_^m-@-iIj z#aqDh5@>!j@1s{RRFCDoipwO2S$~j??i-+31lbs$xev3B{WlW$gF_yTK3E-QU506o z9|!NRkU>fj6Par5nC2}lo_{u+0dh7?ZAm7Z(VRFl50q?cY7W zq;zWajK2ou}P z+qVE8+g#n!P}gX<`o=?j_O=~Dht`^Y-)>mB+e&qvakuu$h{S;Ph=!_GjKTUwd8&Dp zRkgKPKwh=1sc}6FM$~PA@%Oq)ST6P||GuUo%!6#e+CzU@$L|WybYBVPMUjnXF2JH- zK6vI%dCAy+d}q;RdLO{r#SSOHc(d`$4>@=tUdEBU>MVK0AIlMD9LuH4#xr+9UJBu?-%$Ka z{kX1W>Hx1-4tbO5(aywW&h2P*d)m@MB`tY@$Abbot;F| z38#Keka$hK$s7tiQZCWb}iI6jD9GS0-iW0mn{ zo{HBu^r&Dg-26K$)ATV-2kbYf{vEL2p!(tMYQJF#UR1n~R*?ptcb=vn(BYeSKOmg% zE*IyVr1>-{;yEwCcH)TgdBt!(jx6fgvweqIGpEDSK3&h}bFX2g@ao{Rh)+%8p06yN zj1}2)_Iqu>FP}MUpWocJH>haa>v?TI!5*9EV^gfn{h{02_7*`c+HZdMKD^pq@?dkn zz+1VupuDYU=!mxcw5LB9SSa-@y*-q1!G7A=k0Xq6Dddg8HopgZ`(e7aJ+|kn_89E( zdwX_uFi)&`b$e|4^Iy4t5c0mD?d;PQ1-k4w#{DO7R%3_%c^&^8!iIWl z_CgobM_1w;fVTZ!`tgpTEdQBL?t5jSvfuCTxoRKlQCMEzF7?oLaO)~zD%RtT(!yHyMU5#xQO(Y;2SNo_7NR{W%B-#^c|h zpYmo4e}l+aK}-R^0fFDa1;o_CcQay8_$vGs_+^&Cm*QV6Hol-5iDRi1;0j)4;vz

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 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�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�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l 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 E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_a5/gnu/example_build/libgcc.a b/ports/cortex_a5/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a5/gnu/readme_threadx.txt b/ports/cortex_a5/gnu/readme_threadx.txt new file mode 100644 index 00000000..37a92981 --- /dev/null +++ b/ports/cortex_a5/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A5 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a5 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a5 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a5 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a5 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A5 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A5 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5/gnu/src/tx_thread_context_restore.S b/ports/cortex_a5/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..2a3f0165 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_context_save.S b/ports/cortex_a5/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..d35776b6 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..b7a6d9cb --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..44dbcf7d --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..884f3347 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..f80d74b6 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ff7db62d --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..a65b911d --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..4bea9e52 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..35284eed --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..6b702e93 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_schedule.S b/ports/cortex_a5/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..df86a053 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a5/gnu/src/tx_thread_stack_build.S b/ports/cortex_a5/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..90f28e0b --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A5 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_system_return.S b/ports/cortex_a5/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..7c2878de --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..de6a5a7c --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a5/gnu/src/tx_timer_interrupt.S b/ports/cortex_a5/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..cdecf06c --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a5/iar/example_build/azure_rtos.eww b/ports/cortex_a5/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a5/iar/example_build/cstartup.s b/ports/cortex_a5/iar/example_build/cstartup.s new file mode 100644 index 00000000..647de2e8 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/cstartup.s @@ -0,0 +1,156 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #0x40000000 ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.c b/ports/cortex_a5/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..68cd97fe --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.c @@ -0,0 +1,374 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.dep b/ports/cortex_a5/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..5846d006 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.dep @@ -0,0 +1,220 @@ + + + 4 + 1484414870 + + Debug + + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\xencoding_limits.h + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\Debug\Obj\cstartup.o + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\tx_execution_profile.c + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\cstartup.s + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\lib\m7Sx_tl.a + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + [ROOT_NODE] + + + ILINK + 40 3 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 29 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 49 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 0 + + + + + ICCARM + 32 41 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 26 + + + BICOMP + 22 + + + + + ICCARM + 32 41 20 1 2 6 27 10 4 7 14 50 13 5 + + + BICOMP + 32 41 20 1 2 6 10 4 7 14 50 13 5 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 9 19 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 12 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 9 19 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 47 + + + __cstat + 45 + + + BICOMP + 51 + + + + + ICCARM + 57 58 16 25 52 30 35 21 28 53 36 54 43 56 55 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 3 + + + + + ILINK + 24 12 47 31 9 15 48 44 46 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 12 17 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.ewd b/ports/cortex_a5/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..af953994 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.ewp b/ports/cortex_a5/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..ea70843b --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.ewt b/ports/cortex_a5/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..7bc99f50 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.icf b/ports/cortex_a5/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..5d070138 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 234 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000900259600000100000010860000090000000C81000002000000048600000100000017810000010000000E8100000100000011860000090000004681000001000000E880000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000056040000000A000065050000 + 000000003F040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 0000000032000000320100003B040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF3201000032000000360100003B0400000100000002000010040000000100000023FFFFFF83080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000003B040000000A00003F040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000056040000000A000065050000000000003F040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..ad03338f --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..de4f156b --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..50057893 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A5" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..22442691 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a5/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..57b93b13 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1385 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 155 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1A0000000900259600000100000010860000090000000C81000002000000048600000100000017810000010000000E8100000100000011860000090000004681000001000000E880000001000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 2800578600001800000059920000240000001581000055000000239200000000000007E100006B00000004E1000069000000008D00001E00000007860000280000001D920000110000000D8000004700000001E100006600000004860000250000009A860000160000001781000057000000008400007800000025920000190000001481000054000000449200002200000000810000490000001A860000320000001F9200001F00000003E10000680000008E8600003B00000006860000270000002D9200002100000000E1000065000000698600003800000041E10000750000005586000006000000239600008900000016810000560000000E86000017000000518400008600000005E100006A000000A18600003C000000C38600000300000002E1000067000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + FA0800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFFF60800004C000000FA0800009A040000010000000200001004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000000062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..e0660a42 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 3259531530 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..50057893 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A5" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.crun b/ports/cortex_a5/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.dbgdt b/ports/cortex_a5/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.dnx b/ports/cortex_a5/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a5/iar/example_build/tx.dep b/ports/cortex_a5/iar/example_build/tx.dep new file mode 100644 index 00000000..e9942276 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.dep @@ -0,0 +1,10500 @@ + + + 4 + 2746525381 + + Debug + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Txe_bytr.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Txe_bytp.c + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Tx_tt.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Tx_tpch.c + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + [ROOT_NODE] + + + IARCHIVE + 621 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 499 + + + __cstat + 926 + + + BICOMP + 664 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 590 + + + __cstat + 920 + + + BICOMP + 496 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 15 + + + BICOMP + 15 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 642 + + + __cstat + 938 + + + BICOMP + 610 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 315 + + + __cstat + 907 + + + BICOMP + 404 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 10 + + + BICOMP + 479 850 868 113 943 134 474 841 5 10 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 751 + + + __cstat + 921 + + + BICOMP + 396 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 10 + + + BICOMP + 479 850 868 113 943 134 474 841 5 10 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 405 + + + __cstat + 856 + + + BICOMP + 546 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 15 + + + BICOMP + 868 479 227 483 5 15 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 826 + + + __cstat + 917 + + + BICOMP + 422 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 15 + + + BICOMP + 15 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 657 + + + __cstat + 905 + + + BICOMP + 603 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 10 + + + BICOMP + 868 474 841 227 479 943 850 5 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 632 + + + __cstat + 918 + + + BICOMP + 500 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 10 + + + BICOMP + 868 10 474 841 227 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 807 + + + __cstat + 913 + + + BICOMP + 506 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 15 + + + BICOMP + 868 479 227 483 5 15 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 645 + + + __cstat + 923 + + + BICOMP + 618 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 10 + + + BICOMP + 868 474 841 227 479 943 850 5 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 811 + + + __cstat + 937 + + + BICOMP + 600 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 490 + + + __cstat + 860 + + + BICOMP + 656 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 15 + + + BICOMP + 113 483 134 868 479 5 15 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 749 + + + __cstat + 915 + + + BICOMP + 611 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 15 + + + BICOMP + 113 483 134 868 479 5 15 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 675 + + + __cstat + 934 + + + BICOMP + 492 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 15 + + + BICOMP + 15 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 475 + + + __cstat + 886 + + + BICOMP + 550 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 113 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 430 + + + __cstat + 909 + + + BICOMP + 759 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 943 10 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 689 + + + __cstat + 895 + + + BICOMP + 571 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 40 + + + BICOMP + 809 464 227 868 854 850 5 40 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 320 + + + __cstat + 887 + + + BICOMP + 351 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 854 40 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + __cstat + 872 + + + BICOMP + 382 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 854 40 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 778 + + + __cstat + 894 + + + BICOMP + 526 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 854 40 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 777 + + + __cstat + 878 + + + BICOMP + 502 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 27 + + + BICOMP + 113 809 464 227 868 854 850 5 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 773 + + + __cstat + 847 + + + BICOMP + 415 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 943 10 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 425 + + + __cstat + 819 + + + BICOMP + 655 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 10 + + + BICOMP + 868 10 474 841 227 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 513 + + + __cstat + 873 + + + BICOMP + 85 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 560 + + + __cstat + 891 + + + BICOMP + 650 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 27 + + + BICOMP + 113 809 464 227 868 854 850 5 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 109 + + + __cstat + 810 + + + BICOMP + 652 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 723 + + + __cstat + 900 + + + BICOMP + 651 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 27 + + + BICOMP + 113 809 464 227 868 854 850 5 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 784 + + + __cstat + 890 + + + BICOMP + 767 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 705 + + + __cstat + 881 + + + BICOMP + 846 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 27 + + + BICOMP + 27 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 540 + + + __cstat + 925 + + + BICOMP + 497 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 943 10 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 837 + + + __cstat + 862 + + + BICOMP + 489 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 27 + + + BICOMP + 868 850 854 134 809 464 5 27 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 722 + + + __cstat + 897 + + + BICOMP + 672 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 27 + + + BICOMP + 113 27 809 464 227 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 534 + + + __cstat + 896 + + + BICOMP + 509 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 40 + + + BICOMP + 479 850 868 134 943 5 474 841 38 40 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 333 + + + __cstat + 859 + + + BICOMP + 570 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 440 + + + __cstat + 877 + + + BICOMP + 801 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 40 + + + BICOMP + 868 850 113 854 134 809 464 5 40 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 654 + + + __cstat + 838 + + + BICOMP + 100 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 10 + + + BICOMP + 868 10 474 841 227 113 479 943 850 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 597 + + + __cstat + 885 + + + BICOMP + 756 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 + + + BICOMP + 483 38 868 479 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 504 + + + __cstat + 857 + + + BICOMP + 599 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 10 + + + BICOMP + 479 850 868 943 134 113 474 841 5 10 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 602 + + + __cstat + 876 + + + BICOMP + 418 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 27 + + + BICOMP + 27 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 530 + + + __cstat + 864 + + + BICOMP + 582 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 38 134 235 117 138 27 40 15 10 + + + BICOMP + 117 15 713 227 134 27 113 850 5 38 235 138 40 10 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 336 + + + __cstat + 884 + + + BICOMP + 604 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 227 40 + + + BICOMP + 40 809 464 134 868 854 850 5 227 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 472 + + + __cstat + 861 + + + BICOMP + 716 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 765 + + + __cstat + 889 + + + BICOMP + 359 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 731 + + + __cstat + 916 + + + BICOMP + 592 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 785 + + + __cstat + 919 + + + BICOMP + 485 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 117 + + + BICOMP + 113 868 479 227 483 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 818 + + + __cstat + 901 + + + BICOMP + 776 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 138 + + + BICOMP + 850 134 113 713 5 138 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 536 + + + __cstat + 931 + + + BICOMP + 548 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 138 + + + BICOMP + 713 227 850 5 138 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 788 + + + __cstat + 928 + + + BICOMP + 434 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 568 + + + __cstat + 929 + + + BICOMP + 390 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 113 713 227 850 5 134 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 340 + + + __cstat + 912 + + + BICOMP + 512 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 467 + + + __cstat + 898 + + + BICOMP + 747 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 693 + + + __cstat + 933 + + + BICOMP + 401 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 629 + + + __cstat + 935 + + + BICOMP + 408 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 686 + + + __cstat + 908 + + + BICOMP + 636 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 113 117 868 479 227 483 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 549 + + + __cstat + 893 + + + BICOMP + 770 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 580 + + + __cstat + 930 + + + BICOMP + 574 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 412 + + + __cstat + 902 + + + BICOMP + 802 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 117 + + + BICOMP + 113 868 479 227 483 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 714 + + + __cstat + 882 + + + BICOMP + 752 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 522 + + + __cstat + 927 + + + BICOMP + 735 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 138 + + + BICOMP + 713 227 850 5 138 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 391 + + + __cstat + 924 + + + BICOMP + 514 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 138 + + + BICOMP + 113 713 227 850 5 138 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 358 + + + __cstat + 899 + + + BICOMP + 458 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 403 + + + __cstat + 892 + + + BICOMP + 397 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 117 + + + BICOMP + 113 868 479 227 483 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 456 + + + __cstat + 903 + + + BICOMP + 697 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 569 + + + __cstat + 932 + + + BICOMP + 762 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 409 + + + __cstat + 906 + + + BICOMP + 545 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 113 138 713 227 850 5 134 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 748 + + + __cstat + 922 + + + BICOMP + 453 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 117 + + + BICOMP + 113 483 134 868 479 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 865 + + + __cstat + 880 + + + BICOMP + 678 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 460 + + + __cstat + 888 + + + BICOMP + 790 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 663 + + + __cstat + 910 + + + BICOMP + 647 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 648 + + + __cstat + 883 + + + BICOMP + 791 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 40 + + + BICOMP + 868 850 113 854 134 809 464 5 40 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 332 + + + __cstat + 936 + + + BICOMP + 732 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 + + + BICOMP + 134 113 5 868 479 38 474 854 850 464 809 483 943 713 841 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 781 + + + __cstat + 59 + + + BICOMP + 707 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 38 + + + BICOMP + 868 479 38 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 585 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 494 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 537 + + + __cstat + 879 + + + BICOMP + 316 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 673 + + + __cstat + 97 + + + BICOMP + 575 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 867 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 348 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 699 + + + __cstat + 874 + + + BICOMP + 665 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 38 + + + BICOMP + 868 479 38 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 581 + + + __cstat + 848 + + + BICOMP + 821 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 344 + + + __cstat + 940 + + + BICOMP + 641 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 113 943 227 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 596 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 353 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 794 + + + __cstat + 300 + + + BICOMP + 524 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 727 + + + __cstat + 849 + + + BICOMP + 399 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 782 + + + __cstat + 852 + + + BICOMP + 615 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 771 + + + __cstat + 904 + + + BICOMP + 721 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 113 943 227 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 843 + + + __cstat + 855 + + + BICOMP + 720 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 113 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 468 + + + __cstat + 55 + + + BICOMP + 313 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 591 + + + __cstat + 53 + + + BICOMP + 307 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 416 + + + __cstat + 283 + + + BICOMP + 695 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 442 + + + __cstat + 49 + + + BICOMP + 327 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 842 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 324 + + + __cstat + 875 + + + BICOMP + 331 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 437 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 744 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 853 + + + __cstat + 107 + + + BICOMP + 870 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 113 809 464 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 635 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 780 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 473 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 719 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 692 + + + __cstat + 942 + + + BICOMP + 669 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 113 483 15 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 851 + + + __cstat + 70 + + + BICOMP + 566 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 15 + + + BICOMP + 235 113 483 38 868 479 5 134 15 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 660 + + + __cstat + 98 + + + BICOMP + 310 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 486 + + + __cstat + 84 + + + BICOMP + 828 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 15 + + + BICOMP + 868 15 113 474 841 134 479 943 850 5 235 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 450 + + + __cstat + 78 + + + BICOMP + 431 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 745 + + + __cstat + 914 + + + BICOMP + 775 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 10 + + + BICOMP + 479 850 868 235 943 38 474 841 5 134 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 89 + + + __cstat + 911 + + + BICOMP + 757 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 10 + + + BICOMP + 850 113 868 10 854 134 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 557 + + + __cstat + 941 + + + BICOMP + 833 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 447 + + + __cstat + 392 + + + BICOMP + 626 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 113 943 10 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 746 + + + __cstat + 387 + + + BICOMP + 681 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 10 + + + BICOMP + 479 850 868 235 943 38 113 474 841 5 134 10 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 432 + + + __cstat + 380 + + + BICOMP + 640 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 27 + + + BICOMP + 113 850 27 134 713 5 235 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 330 + + + __cstat + 329 + + + BICOMP + 772 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 113 943 10 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 99 + + + __cstat + 367 + + + BICOMP + 544 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 27 + + + BICOMP + 850 27 134 113 713 5 235 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 395 + + + __cstat + 379 + + + BICOMP + 362 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 428 + + + __cstat + 373 + + + BICOMP + 361 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 27 + + + BICOMP + 113 868 850 235 854 38 809 464 5 134 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 302 + + + __cstat + 389 + + + BICOMP + 786 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 844 + + + __cstat + 63 + + + BICOMP + 863 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 799 + + + __cstat + 364 + + + BICOMP + 813 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 113 854 27 809 464 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 343 + + + __cstat + 383 + + + BICOMP + 423 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 40 + + + BICOMP + 113 850 40 134 713 5 235 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 609 + + + __cstat + 66 + + + BICOMP + 711 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 606 + + + __cstat + 51 + + + BICOMP + 586 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 436 + + + __cstat + 384 + + + BICOMP + 326 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 40 + + + BICOMP + 868 850 235 854 38 809 464 5 134 40 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 858 + + + __cstat + 56 + + + BICOMP + 462 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 480 + + + __cstat + 77 + + + BICOMP + 834 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 113 943 227 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 646 + + + __cstat + 385 + + + BICOMP + 445 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 40 + + + BICOMP + 868 850 235 113 854 38 809 464 5 134 40 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 323 + + + __cstat + 76 + + + BICOMP + 449 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 357 + + + __cstat + 96 + + + BICOMP + 463 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 113 483 15 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 728 + + + __cstat + 939 + + + BICOMP + 671 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 10 + + + BICOMP + 479 850 868 235 943 38 474 841 5 134 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 410 + + + __cstat + 62 + + + BICOMP + 598 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 113 943 227 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 312 + + + __cstat + 52 + + + BICOMP + 539 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 471 + + + __cstat + 61 + + + BICOMP + 561 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 15 + + + BICOMP + 113 868 15 474 841 134 479 943 850 5 235 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 439 + + + __cstat + 106 + + + BICOMP + 350 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 + + + BICOMP + 809 464 235 113 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 448 + + + __cstat + 60 + + + BICOMP + 739 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 134 + + + BICOMP + 850 868 134 113 854 227 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 435 + + + __cstat + 319 + + + BICOMP + 633 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 113 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 583 + + + __cstat + 93 + + + BICOMP + 400 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 402 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 420 + + + __cstat + 95 + + + BICOMP + 355 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 601 + + + __cstat + 94 + + + BICOMP + 407 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 589 + + + __cstat + 110 + + + BICOMP + 667 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 742 + + + __cstat + 80 + + + BICOMP + 304 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 555 + + + __cstat + 54 + + + BICOMP + 356 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + __cstat + 82 + + + BICOMP + 614 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 476 + + + __cstat + 81 + + + BICOMP + 519 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 113 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 613 + + + __cstat + 72 + + + BICOMP + 523 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 + + + BICOMP + 809 464 113 235 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 871 + + + __cstat + 64 + + + BICOMP + 869 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 469 + + + __cstat + 75 + + + BICOMP + 87 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 620 + + + __cstat + 65 + + + BICOMP + 789 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 338 + + + __cstat + 103 + + + BICOMP + 661 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 823 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 493 + + + __cstat + 83 + + + BICOMP + 342 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 470 + + + __cstat + 321 + + + BICOMP + 737 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 227 + + + BICOMP + 850 868 227 854 235 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 832 + + + __cstat + 111 + + + BICOMP + 643 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 779 + + + __cstat + 101 + + + BICOMP + 388 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 113 854 227 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 363 + + + __cstat + 104 + + + BICOMP + 102 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 134 + + + BICOMP + 850 868 134 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 368 + + + __cstat + 91 + + + BICOMP + 301 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 113 868 854 850 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 508 + + + __cstat + 108 + + + BICOMP + 419 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 113 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 491 + + + __cstat + 309 + + + BICOMP + 639 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 787 + + + __cstat + 57 + + + BICOMP + 608 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 868 854 850 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 386 + + + __cstat + 58 + + + BICOMP + 501 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 668 + + + __cstat + 69 + + + BICOMP + 511 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 455 + + + __cstat + 295 + + + BICOMP + 349 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 577 + + + __cstat + 288 + + + BICOMP + 325 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 117 + + + BICOMP + 113 868 117 474 841 134 479 943 850 5 235 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 417 + + + __cstat + 370 + + + BICOMP + 717 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 235 134 138 + + + BICOMP + 113 850 134 38 713 5 235 138 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 627 + + + __cstat + 67 + + + BICOMP + 730 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 457 + + + __cstat + 290 + + + BICOMP + 755 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 868 854 850 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 631 + + + __cstat + 378 + + + BICOMP + 736 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 40 + + + BICOMP + 113 479 850 868 40 943 38 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 322 + + + __cstat + 377 + + + BICOMP + 616 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 113 854 40 809 464 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 831 + + + __cstat + 285 + + + BICOMP + 92 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 113 138 713 5 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 588 + + + __cstat + 365 + + + BICOMP + 783 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 138 113 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 753 + + + __cstat + 274 + + + BICOMP + 835 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 113 483 117 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 768 + + + __cstat + 287 + + + BICOMP + 866 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 798 + + + __cstat + 270 + + + BICOMP + 733 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 117 + + + BICOMP + 235 483 38 868 479 5 134 117 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 822 + + + __cstat + 71 + + + BICOMP + 105 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 527 + + + __cstat + 68 + + + BICOMP + 605 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 517 + + + __cstat + 73 + + + BICOMP + 341 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 113 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 587 + + + __cstat + 271 + + + BICOMP + 617 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 138 113 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 584 + + + __cstat + 74 + + + BICOMP + 306 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 724 + + + __cstat + 366 + + + BICOMP + 305 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 113 854 40 809 464 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 334 + + + __cstat + 284 + + + BICOMP + 840 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 113 138 713 5 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 829 + + + __cstat + 277 + + + BICOMP + 90 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 623 + + + __cstat + 273 + + + BICOMP + 520 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 117 + + + BICOMP + 868 117 474 841 134 479 943 850 5 235 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 495 + + + __cstat + 79 + + + BICOMP + 718 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 113 483 117 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 443 + + + __cstat + 282 + + + BICOMP + 477 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 674 + + + __cstat + 376 + + + BICOMP + 552 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 138 113 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 433 + + + __cstat + 275 + + + BICOMP + 824 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 758 + + + __cstat + 374 + + + BICOMP + 488 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 426 + + + __cstat + 371 + + + BICOMP + 649 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 113 138 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 830 + + + __cstat + 298 + + + BICOMP + 564 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 113 483 117 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 729 + + + __cstat + 289 + + + BICOMP + 406 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 658 + + + __cstat + 372 + + + BICOMP + 634 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 113 138 713 5 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 804 + + + __cstat + 296 + + + BICOMP + 595 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 481 + + + __cstat + 279 + + + BICOMP + 704 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 644 + + + __cstat + 278 + + + BICOMP + 498 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 682 + + + __cstat + 286 + + + BICOMP + 444 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 868 854 850 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 734 + + + __cstat + 291 + + + BICOMP + 624 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 461 + + + __cstat + 50 + + + BICOMP + 814 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 113 479 943 850 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 725 + + + __cstat + 280 + + + BICOMP + 726 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 709 + + + __cstat + 294 + + + BICOMP + 806 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 5 113 630 820 825 593 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 5 113 593 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 5 113 800 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 5 113 825 820 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 5 113 820 630 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 5 113 630 820 825 345 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 5 113 345 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 5 113 630 820 825 738 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 5 113 630 820 825 703 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 5 113 630 820 825 738 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 5 113 738 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 5 113 820 703 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 5 113 653 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 5 113 630 820 825 703 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 5 113 820 703 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 5 113 703 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 5 113 630 820 825 345 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 5 113 820 825 630 345 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 5 113 630 820 825 653 800 703 593 738 345 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 5 113 800 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 5 113 345 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 5 113 703 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 490 749 405 675 807 642 811 499 590 826 315 751 657 632 645 773 430 540 425 504 654 837 560 602 722 777 333 784 109 705 723 534 530 513 597 440 336 472 475 689 320 803 778 788 648 569 818 536 693 456 568 522 549 731 629 765 409 580 391 686 748 785 865 460 412 714 340 663 467 358 403 473 719 699 324 344 437 348 596 353 537 727 332 744 842 635 780 585 782 581 771 843 853 794 781 867 673 416 468 494 591 442 742 620 448 823 363 493 470 774 368 625 583 420 386 832 779 476 435 508 439 491 787 402 601 589 555 338 613 871 469 609 844 858 323 606 410 480 312 660 450 486 851 471 357 692 557 728 745 89 447 330 746 428 432 99 799 395 302 646 343 436 724 322 631 417 426 658 674 334 831 587 588 829 804 798 577 623 495 753 830 758 627 443 668 433 729 584 455 457 768 822 527 517 644 734 461 481 709 682 725 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 5 113 825 820 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 5 113 593 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 5 113 825 820 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 5 113 630 820 825 653 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 5 113 630 820 825 800 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 5 113 630 820 825 593 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 5 113 820 630 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 5 113 593 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 5 113 653 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 5 113 800 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 5 113 630 820 825 738 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 5 113 738 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 5 113 630 820 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 758 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 457 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 829 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 627 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 768 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 804 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 443 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 822 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 517 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 830 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 644 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 461 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 734 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 623 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 527 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 709 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 682 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 584 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 668 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 588 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 495 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 729 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 455 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 577 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 433 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 587 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 481 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 798 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 831 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 334 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 753 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 340 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 358 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 403 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 748 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 865 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 699 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1011 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 412 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 344 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 332 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 782 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 581 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 843 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 771 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 537 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 794 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 416 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 663 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 853 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 460 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 324 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 468 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 714 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 591 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 442 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 742 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 620 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 781 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1011 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 673 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 785 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 727 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 467 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 686 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 590 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 405 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 807 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 811 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 749 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 315 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 826 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 632 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 540 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 490 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 430 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 499 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 645 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 425 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 504 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 837 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 560 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 602 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 722 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 657 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 777 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 333 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 675 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 751 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 642 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 773 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 654 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 784 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 109 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 725 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 613 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 493 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 491 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 476 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 435 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 508 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 779 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 439 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 601 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 609 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 555 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 844 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 858 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 368 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 469 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 323 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 363 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 420 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 583 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 832 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 410 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 480 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 448 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 589 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 787 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 338 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 606 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 871 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 470 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 386 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 447 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 395 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 660 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 450 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 428 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 99 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 302 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 646 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 557 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 471 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 799 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 89 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 343 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 746 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 724 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 322 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 432 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 436 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 417 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 426 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 692 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 357 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 330 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 658 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 674 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 312 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 631 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 851 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 745 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 486 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 728 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1007 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 823 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 402 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 689 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 320 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 818 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 456 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 568 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 648 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 522 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 549 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 440 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 731 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 629 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 723 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 475 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 765 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 705 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 409 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 580 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 530 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1011 1019 1015 1014 1013 1010 1008 1009 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 472 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 788 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 569 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 536 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 391 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 336 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1016 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 778 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 597 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 693 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 513 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 534 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1008 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 719 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 635 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 780 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 473 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 437 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 348 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 596 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 744 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 585 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 842 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 353 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 867 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 494 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a5/iar/example_build/tx.ewd b/ports/cortex_a5/iar/example_build/tx.ewd new file mode 100644 index 00000000..4173bf74 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a5/iar/example_build/tx.ewp b/ports/cortex_a5/iar/example_build/tx.ewp new file mode 100644 index 00000000..5e6c7287 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.ewp @@ -0,0 +1,2763 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a5/iar/example_build/tx.ewt b/ports/cortex_a5/iar/example_build/tx.ewt new file mode 100644 index 00000000..d903833d --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.ewt @@ -0,0 +1,3424 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a5/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a5/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..5369491b --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a5/iar/inc/tx_port.h b/ports/cortex_a5/iar/inc/tx_port.h new file mode 100644 index 00000000..7c107cdf --- /dev/null +++ b/ports/cortex_a5/iar/inc/tx_port.h @@ -0,0 +1,397 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_a5/iar/readme_threadx.txt b/ports/cortex_a5/iar/readme_threadx.txt new file mode 100644 index 00000000..b3b9f85c --- /dev/null +++ b/ports/cortex_a5/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A5 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A5 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A5 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A5 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A5 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5/iar/src/tx_iar.c b/ports/cortex_a5/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a5/iar/src/tx_thread_context_restore.s b/ports/cortex_a5/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..b212254e --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_context_restore.s @@ -0,0 +1,261 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR +#ifdef __D32__ + VSTMDB sp!, {D16-D31} ; Save D16-D31 +#endif + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_context_save.s b/ports/cortex_a5/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..63733553 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..64a1a9eb --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,272 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR +#ifdef __D32__ + VSTMDB sp!, {D16-D31} ; Save D16-D31 +#endif + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..22e2d0c7 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..368cec31 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..00f81c4e --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a5/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..76b0d89c --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b892e436 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..84827bbd --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..755d2280 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..66ff64dd --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_schedule.s b/ports/cortex_a5/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..6c07f922 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_schedule.s @@ -0,0 +1,243 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 +#ifdef __D32__ + VLDMIA sp!, {D16-D31} ; Recover D16-D31 +#endif + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 +#ifdef __D32__ + VLDMIA sp!, {D16-D31} ; Recover D16-D31 +#endif + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_stack_build.s b/ports/cortex_a5/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..efa63ed9 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_system_return.s b/ports/cortex_a5/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..457af6d0 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_system_return.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR +#ifdef __D32__ + VSTMDB sp!, {D16-D31} ; Save D16-D31 +#endif + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..1f363c90 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a5/iar/src/tx_timer_interrupt.s b/ports/cortex_a5/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d4b8b35f --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject b/ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..5ed0406b --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/.project b/ports/cortex_a5x/ac6/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml b/ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..dd0920bb --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S new file mode 100644 index 00000000..aaf0f7f8 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S @@ -0,0 +1,431 @@ +// ------------------------------------------------------------ +// ARMv8-A AArch64 Generic Timer Access Functions +// +// Copyright ARM Ltd 2013. All rights reserved. +// ------------------------------------------------------------ + + + .section AArch64_GenericTimer,"ax" + .align 3 + +// ------------------------------------------------------------ + + .global getCNTFRQ + // uint32_t getCNTFRQ(void) + // Returns the value of CNTFRQ_EL0 + .type getCNTFRQ, @function +getCNTFRQ: + MRS x0, CNTFRQ_EL0 + RET + + +// ------------------------------------------------------------ + + .global setCNTFRQ + // void setCNTFRQ(uint32_t freq) + // Sets the value of CNTFRQ_EL0 (only possible at EL3) + // w0 - freq - The value to be written into CNTFRQ_EL0 + .type setCNTFRQ, @function +setCNTFRQ: + MSR CNTFRQ_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getPhysicalCount + // uint64_t getPhysicalCount(void) + // Returns the current value of physical count (CNTPCT_EL0) + .type getPhysicalCount, @function +getPhysicalCount: + MRS x0, CNTPCT_EL0 + RET + + +// ------------------------------------------------------------ + + .global getVirtualCount + // uint64_t getVirtualCount(void) + // Returns the current value of the virtual count register (CNTVCT_EL0) + .type getVirtualCount, @function +getVirtualCount: + MRS x0, CNTVCT_EL0 + RET + + +// ------------------------------------------------------------ + + .global getEL1Ctrl + // uint32_t getEL1Ctrl(void) + // Returns the value of EL1 Timer Control Register (CNTKCTL_EL1) + .type getEL1Ctrl, @function +getEL1Ctrl: + MRS x0, CNTKCTL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setEL1Ctrl + // void setEL1Ctrl(uint32_t value) + // Sets the value of Counter Non-secure EL1 Control Register (CNTKCTL_EL1) + // 0 - value - The value to be written into CNTKCTL_EL1 + .type setEL1Ctrl, @function +setEL1Ctrl: + MSR CNTKCTL_EL1, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL2Ctrl + // uint32_t getEL2Ctrl(void) + // Returns the value of the EL2 Timer Control Register (CNTHCTL_EL2) + .type getEL2Ctrl, @function +getEL2Ctrl: + MRS x0, CNTHCTL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2Ctrl + // void setEL2Ctrl(uint32_t value) + // Sets the value of the EL2 Timer Control Register (CNTHCTL_EL2) + // x0 - value - The value to be written into CNTHCTL_EL2 + .type setEL2Ctrl, @function +setEL2Ctrl: + MSR CNTHCTL_EL2, x0 + RET + + +// ------------------------------------------------------------ +// Non-Secure Physical Timer +// ------------------------------------------------------------ + + .global getNSEL1PhysicalCompValue + // uint64_t getNSEL1PhysicalCompValue(void) + // Returns the value of Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) + .type getNSEL1PhysicalCompValue, @function +getNSEL1PhysicalCompValue: + MRS x0, CNTP_CVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setNSEL1PhysicalCompValue + // void setNSEL1PhysicalCompValue(uint64_t value) + // Sets the value of the Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) + // x0 - value - The value to be written into CNTP_CVAL_EL0 + .type setNSEL1PhysicalCompValue, @function +setNSEL1PhysicalCompValue: + MSR CNTP_CVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getNSEL1PhysicalTimerValue + // uint32_t getNSEL1PhysicalTimerValue(void) + // Returns the value of Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) + .type getNSEL1PhysicalTimerValue, @function +getNSEL1PhysicalTimerValue: + MRS x0, CNTP_TVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setNSEL1PhysicalTimerValue + // void setNSEL1PhysicalTimerValue(uint32_t value) + // Sets the value of the Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) + // w0 - value - The value to be written into CNTP_TVAL_EL0 + .type setNSEL1PhysicalTimerValue, @function +setNSEL1PhysicalTimerValue: + MSR CNTP_TVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getNSEL1PhysicalTimerCtrl + // uint32_t getNSEL1PhysicalTimerCtrl(void) + // Returns the value of Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) + .type getNSEL1PhysicalTimerCtrl, @function +getNSEL1PhysicalTimerCtrl: + MRS x0, CNTP_CTL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setNSEL1PhysicalTimerCtrl + // void setNSEL1PhysicalTimerCtrl(uint32_t value) + // Sets the value of the Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) + // w0 - value - The value to be written into CNTP_CTL_EL0 + .type setNSEL1PhysicalTimerCtrl, @function +setNSEL1PhysicalTimerCtrl: + MSR CNTP_CTL_EL0, x0 + RET + + +// ------------------------------------------------------------ +// Secure Physical Timer +// ------------------------------------------------------------ + + .global getSEL1PhysicalCompValue + // uint64_t getSEL1PhysicalCompValue(void) + // Returns the value of Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) + .type getSEL1PhysicalCompValue, @function +getSEL1PhysicalCompValue: + MRS x0, CNTPS_CVAL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setSEL1PhysicalCompValue + // void setSEL1PhysicalCompValue(uint64_t value) + // Sets the value of the Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) + // x0 - value - The value to be written into CNTPS_CVAL_EL1 + .type setSEL1PhysicalCompValue, @function +setSEL1PhysicalCompValue: + MSR CNTPS_CVAL_EL1, x0 + RET + + + +// ------------------------------------------------------------ + + .global getSEL1PhysicalTimerValue + // uint32_t getSEL1PhysicalTimerValue(void) + // Returns the value of Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) + .type getSEL1PhysicalTimerValue, @function +getSEL1PhysicalTimerValue: + MRS x0, CNTPS_TVAL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setSEL1PhysicalTimerValue + // void setSEL1PhysicalTimerValue(uint32_t value) + // Sets the value of the Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) + // w0 - value - The value to be written into CNTPS_TVAL_EL1 + .type setSEL1PhysicalTimerValue, @function +setSEL1PhysicalTimerValue: + MSR CNTPS_TVAL_EL1, x0 + RET + + +// ------------------------------------------------------------ + + .global getSEL1PhysicalTimerCtrl + // uint32_t getSEL1PhysicalTimerCtrl(void) + // Returns the value of Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) + .type getSEL1PhysicalTimerCtrl, @function +getSEL1PhysicalTimerCtrl: + MRS x0, CNTPS_CTL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setSEL1PhysicalTimerCtrl + // void setSEL1PhysicalTimerCtrl(uint32_t value) + // Sets the value of the Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) + // w0 - value - The value to be written into CNTPS_CTL_EL1 + .type setSEL1PhysicalTimerCtrl, @function +setSEL1PhysicalTimerCtrl: + MSR CNTPS_CTL_EL1, x0 + RET + + +// ------------------------------------------------------------ + + .global configSecureEL1TimerAccess + // void configSecureEL1TimerAccess(unsigned int config)// + // Sets the values of the SCR_EL3.ST bit (bit 11) based on the value in x0 + // EL3 accessible only! + .type configSecureEL1TimerAccess, @function +configSecureEL1TimerAccess: + MRS x1, SCR_EL3 + BFI x1, x0, #11, #1 + MSR SCR_EL3, x1 + RET + + +// ------------------------------------------------------------ +// Virtual Timer +// ------------------------------------------------------------ + + .global getEL1VirtualCompValue + // uint64_t getEL1VirtualCompValue(void) + // Returns the value of EL1 Virtual Compare Value Register (CNTV_CVAL_EL0) + .type getEL1VirtualCompValue, @function +getEL1VirtualCompValue: + MRS x0, CNTV_CVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setEL1VirtualCompValue + // void setEL1VirtualCompValue(uint64_t value) + // Sets the value of the EL1 Virtual Compare Value Register (CNTV_CVAL_EL0) + // x0 - value - The value to be written into CNTV_CVAL_EL0 + .type setEL1VirtualCompValue, @function +setEL1VirtualCompValue: + MSR CNTV_CVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL1VirtualTimerValue + // uint32_t getEL1VirtualTimerValue(void) + // Returns the value of EL1 Virtual Timer Value Register (CNTV_TVAL_EL0) + .type getEL1VirtualTimerValue, @function +getEL1VirtualTimerValue: + MRS x0, CNTV_TVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setEL1VirtualTimerValue + // void setEL1VirtualTimerValue(uint32_t value) + // Sets the value of the EL1 Virtual Timer Value Register (CNTV_TVAL_EL0) + // w0 - value - The value to be written into CNTV_TVAL_EL0 + .type setEL1VirtualTimerValue, @function +setEL1VirtualTimerValue: + MSR CNTV_TVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL1VirtualTimerCtrl + // uint32_t getEL1VirtualTimerCtrl(void) + // Returns the value of EL1 Virtual Timer Control Register (CNTV_CTL_EL0) + .type getEL1VirtualTimerCtrl, @function +getEL1VirtualTimerCtrl: + MRS x0, CNTV_CTL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setEL1VirtualTimerCtrl + // void setEL1VirtualTimerCtrl(uint32_t value) + // Sets the value of the EL1 Virtual Timer Control Register (CNTV_CTL_EL0) + // w0 - value - The value to be written into CNTV_CTL_EL0 + .type setEL1VirtualTimerCtrl, @function +setEL1VirtualTimerCtrl: + MSR CNTV_CTL_EL0, x0 + RET + + +// ------------------------------------------------------------ +// Virtual Timer functions to be called by EL2 +// ------------------------------------------------------------ + + .global getVirtualCounterOffset + // uint64_t getVirtualCounterOffset(void) + // Returns the value of the Counter Virtual Offset Register (CNTVOFF_EL2) + // EL2 and EL3 only + .type getVirtualCounterOffset, @function +getVirtualCounterOffset: + MRS x0, CNTVOFF_EL2 + RET + + +// ------------------------------------------------------------ + + .global setVirtualCounterOffset + // void setVirtualCounterOffset(uint64_t offset) + // Sets the value of the Counter Virtual Offset Register (CNTVOFF_EL2) + // x0 - offset - The value to be written into CNTVOFF_EL2 + // EL2 and EL3 only + .type setVirtualCounterOffset, @function +setVirtualCounterOffset: + MSR CNTVOFF_EL2, x0 + RET + + +// ------------------------------------------------------------ +// EL2 Physical Timer +// ------------------------------------------------------------ + + .global getEL2PhysicalCompValue + // uint64_t getEL2PhysicalCompValue(void) + // Returns the value of EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) + .type getEL2PhysicalCompValue, @function +getEL2PhysicalCompValue: + MRS x0, CNTHP_CVAL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2PhysicalCompValue + // void setEL2PhysicalCompValue(uint64_t value) + // Sets the value of the EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) + // x0 - value - The value to be written into CNTHP_CVAL_EL2 + .type setEL2PhysicalCompValue, @function +setEL2PhysicalCompValue: + MSR CNTHP_CVAL_EL2, x0 + RET + + + +// ------------------------------------------------------------ + + .global getEL2PhysicalTimerValue + // uint32_t getEL2PhysicalTimerValue(void) + // Returns the value of EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) + .type getEL2PhysicalTimerValue, @function +getEL2PhysicalTimerValue: + MRS x0, CNTHP_TVAL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2PhysicalTimerValue + // void setEL2PhysicalTimerValue(uint32_t value) + // Sets the value of the EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) + // w0 - value - The value to be written into CNTHP_TVAL_EL2 + .type setEL2PhysicalTimerValue, @function +setEL2PhysicalTimerValue: + MSR CNTHP_TVAL_EL2, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL2PhysicalTimerCtrl + // uint32_t getEL2PhysicalTimerCtrl(void) + // Returns the value of EL2 Physical Timer Control Register (CNTHP_CTL_EL2) + .type getEL2PhysicalTimerCtrl, @function +getEL2PhysicalTimerCtrl: + MRS x0, CNTHP_CTL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2PhysicalTimerCtrl + // void setEL2PhysicalTimerCtrl(uint32_t value) + // Sets the value of the EL2 Physical Timer Control Register (CNTHP_CTL_EL2) + // w0 - value - The value to be written into CNTHP_CTL_EL2 + .type setEL2PhysicalTimerCtrl, @function +setEL2PhysicalTimerCtrl: + MSR CNTHP_CTL_EL2, x0 + RET + + +// ------------------------------------------------------------ +// End of code +// ------------------------------------------------------------ diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h new file mode 100644 index 00000000..63474ac8 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h @@ -0,0 +1,206 @@ +// ------------------------------------------------------------ +// ARMv8-A AArch64 System Timer +// Header Filer +// +// Copyright ARM Ltd 2013. All rights reserved. +// ------------------------------------------------------------ + +#ifndef _ARMV8A_SYSTEM_TIMER_H +#define _ARMV8A_SYSTEM_TIMER_H + +// ------------------------------------------------------------ +// CNTFRQ holds the frequency of the system counter +// Readable in all ELs +// Writable only by EL3 + +// Returns the value of CNTFRQ_EL0 +unsigned int getCNTFRQ(void); + +// Sets the value of CNTFRQ_EL0 (EL3 only!) +// freq - The value to be written into CNTFRQ_EL3 +void setCNTFRQ(unsigned int freq); + +// ------------------------------------------------------------ +// CNTPCT_EL0 and CNTVCT_EL0 hold the physical and virtual counts +// Always accessable in Hpy and Secure EL1 +// Access from EL2 and Non-Secure EL1 is configurable + +// Returns the current value of physical count (CNTPCT_EL0) +unsigned long long getPhysicalCount(void); + +// Returns the current value of the virtual count register (CNTVCT_EL0) +unsigned long long getVirtualCount(void); + +// ------------------------------------------------------------ +// The CNTKCTL register controls whether CNTPCT can be accessed from EL0 +// Only acceable from EL1 and EL2 + +#define CNTKCTL_PCTEN (1 << 0) // Controls whether the physical counter, CNTPCT, and the frequency register CNTFRQ, are accessible from EL0 +#define CNTKCTL_VCTEN (1 << 1) // Controls whether the virtual counter, CNTVCT, and the frequency register CNTFRQ, are accessible from +#define CNTKCTL_EVNTEN (1 << 2) // Enables the generation of an event stream from the virtual counter +#define CNTKCTL_EVNTDIR (1 << 3) // Controls which transition of the CNTVCT trigger bit, defined by EVNTI, generates an event + +// Returns the value of EL1 Timer Control Register (CNTKCTL_EL1) +unsigned int getEL1Ctrl(void); + +// Sets the value of EL1 Timer Control Register (CNTKCTL_EL1) +// value - The value to be written into CNTKCTL_EL1 +void setEL1Ctrl(unsigned int value); + +// ------------------------------------------------------------ +// The CNTHCTL_EL2 register controls whether CNTPCT_EL0 can be accessed from EL1 +// Only accessable from EL2 and EL3 + +#define CNTHCTL_CNTPCT (1 << 0) +#define CNTHCTL_EVNTEN (1 << 2) +#define CNTHCTL_EVNTDIR (1 << 3) + +// Returns the value of the EL2 Timer Control Register (CNTHCTL_EL2) +unsigned int getEL2Ctrl(void); + +// Sets the value of EL2 Timer Control Register (CNTHCTL_EL2) +// value - The value to be written into CNTHCTL_EL2 +void setEL2Ctrl(unsigned int value); + +// ------------------------------------------------------------ +// Non-Secure Physical Timer +// ------------------------------------------------------------ +// Accessible from EL3, EL2 and EL1 + +// Returns the value of Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) +unsigned long long getNSEL1PhysicalCompValue(void); + +// Sets the value of the Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) +// value - The value to be written into CNTP_CVAL_EL0 +void setNSEL1PhysicalCompValue(unsigned long long value); + +// Returns the value of Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) +unsigned int getNSEL1PhysicalTimerValue(void); + +// Sets the value of the Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) +// value - The value to be written into CNTP_TVAL_EL0 +void setNSEL1PhysicalTimerValue(unsigned int value); + +#define CNTP_CTL_ENABLE (1 << 0) +#define CNTP_CTL_MASK (1 << 1) +#define CNTP_CTL_STATUS (1 << 2) + +// Returns the value of Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) +unsigned int getNSEL1PhysicalTimerCtrl(void); + +// Sets the value of the Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) +// value - The value to be written into CNTP_CTL_EL0 +void setNSEL1PhysicalTimerCtrl(unsigned int value); + +// ------------------------------------------------------------ +// Secure Physical Timer +// ------------------------------------------------------------ +// Accessible from EL3, and configurably from secure EL1 + +// Returns the value of Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) +unsigned long long getSEL1PhysicalCompValue(void); + +// Sets the value of the Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) +// value - The value to be written into CNTPS_CVAL_EL1 +void setSEL1PhysicalCompValue(unsigned long long value); + +// Returns the value of Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) +unsigned int getSEL1PhysicalTimerValue(void); + +// Sets the value of the Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) +// value - The value to be written into CNTPS_TVAL_EL1 +void setSEL1PhysicalTimerValue(unsigned int value); + +#define CNTPS_CTL_ENABLE (1 << 0) +#define CNTPS_CTL_MASK (1 << 1) +#define CNTPS_CTL_STATUS (1 << 2) + +// Returns the value of Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) +unsigned int getSEL1PhysicalTimerCtrl(void); + +// Sets the value of the Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) +// value - The value to be written into CNTPS_CTL_EL1 +void setSEL1PhysicalTimerCtrl(unsigned int value); + +// The SCR_EL3 register controls whether CNTPS_TVAL_EL1, +// CNTPS_CTL_EL1, and CNTPS_CVAL_EL1 can be accessed by secure +// EL1. +// Only accessible from EL3 + +#define SCR_ENABLE_SECURE_EL1_ACCESS (1) +#define SCR_DISABLE_SECURE_EL1_ACCESS (0) + +// Sets the values of the SCR_EL3.ST bit (bit 11) based on the value passed in 'config' +void configSecureEL1TimerAccess(unsigned int config); + +// ------------------------------------------------------------ +// Virtual Timer +// ------------------------------------------------------------ +// Accessible from Non-Secure EL1 and EL2 + +// Returns the value of EL1 Virtual Compare Value Register (CNTV_CVAL) +unsigned long long getEL1VirtualCompValue(void); + +// Sets the value of the EL1 Virtual Compare Value Register (CNTV_CVAL) +// value - The value to be written into CNTV_CVAL +void setEL1VirtualCompValue(unsigned long long value); + +// Returns the value of EL1 Virtual Timer Value Register (CNTV_TVAL) +unsigned int getEL1VirtualTimerValue(void); + +// Sets the value of the EL1 Virtual Timer Value Register (CNTV_TVAL) +// value - The value to be written into CNTV_TVAL +void setEL1VirtualTimerValue(unsigned int value); + +#define CNTV_CTL_ENABLE (1 << 0) +#define CNTV_CTL_MASK (1 << 1) +#define CNTV_CTL_STATUS (1 << 2) + +// Returns the value of EL1 Virtual Timer Control Register (CNTV_CTL) +unsigned int getEL1VirtualTimerCtrl(void); + +// Sets the value of the EL1 Virtual Timer Control Register (CNTV_CTL) +// value - The value to be written into CNTV_CTL +void setEL1VirtualTimerCtrl(unsigned int value); + +// +// Virtual timer functions to be called by EL2 +// + +// CNTVCT_EL2 holds the offset the virtual count is from the physical count +// Only accessable from EL2 and EL3 + +// Returns the value of the Counter Virtual Offset Register (CNTVOFF_EL2) +unsigned long long getVirtualCounterOffset(void); + +// Sets the value of the Counter Virtual Offset Register (CNTVOFF_EL2) +// offset - The value to be written into CNTVOFF_EL2 +void setVirtualCounterOffset(unsigned long long offset); + +// ------------------------------------------------------------ +// Hypervisor (EL2) Timer +// ------------------------------------------------------------ + +// Returns the value of EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) +unsigned long long getEL2PhysicalCompValue(void); + +// Sets the value of the EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) +// value - The value to be written into CNTHP_CVAL_EL2 +void setEL2PhysicalCompValue(unsigned long long value); + +// Returns the value of EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) +unsigned int getEL2PhysicalTimerValue(void); + +#define CNTHP_CTL_ENABLE (1 << 0) +#define CNTHP_CTL_MASK (1 << 1) +#define CNTHP_CTL_STATUS (1 << 2) + +// Sets the value of the EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) +// value - The value to be written into CNTHP_TVAL_EL2 +void setEL2PhysicalTimerValue(unsigned int value); + +#endif + +// ------------------------------------------------------------ +// End of armv8_aarch64_SystemTimer.h +// ------------------------------------------------------------ diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S b/ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S new file mode 100644 index 00000000..7f4effe7 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S @@ -0,0 +1,138 @@ +// ------------------------------------------------------------ +// Exceptions workbook exercise +// +// Copyright ARM LTD, 2012 +// ------------------------------------------------------------ + + .section VECTORS,"ax" + .align 12 + + + .global el3_vectors +el3_vectors: + + .global fiqHandler + .global irqHandler + +// ------------------------------------------------------------ +// Current EL with SP0 +// ------------------------------------------------------------ + .balign 128 +sync_current_el_sp0: + B . // Synchronous + + .balign 128 +irq_current_el_sp0: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_current_el_sp0: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_current_el_sp0: + B . // SError + +// ------------------------------------------------------------ +// Current EL with SPx +// ------------------------------------------------------------ + + .balign 128 +sync_current_el_spx: + B . // Synchronous + + .balign 128 +irq_current_el_spx: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_current_el_spx: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_current_el_spx: + B . // SError + +// ------------------------------------------------------------ +// Lower EL using AArch64 +// ------------------------------------------------------------ + + .balign 128 +sync_lower_el_aarch64: + B . + + .balign 128 +irq_lower_el_aarch64: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_lower_el_aarch64: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_lower_el_aarch64: + B . // SError + +// ------------------------------------------------------------ +// Lower EL using AArch32 +// ------------------------------------------------------------ + + .balign 128 +sync_lower_el_aarch32: + B . + + .balign 128 +irq_lower_el_aarch32: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_lower_el_aarch32: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_lower_el_aarch32: + B . // SError + + +// ------------------------------------------------------------ + +irqFirstLevelHandler: + STP x29, x30, [sp, #-16]! + BL _tx_thread_context_save + + BL irqHandler + + B _tx_thread_context_restore + +fiqFirstLevelHandler: + STP x29, x30, [sp, #-16]! + STP x18, x19, [sp, #-16]! + STP x16, x17, [sp, #-16]! + STP x14, x15, [sp, #-16]! + STP x12, x13, [sp, #-16]! + STP x10, x11, [sp, #-16]! + STP x8, x9, [sp, #-16]! + STP x6, x7, [sp, #-16]! + STP x4, x5, [sp, #-16]! + STP x2, x3, [sp, #-16]! + STP x0, x1, [sp, #-16]! + + BL fiqHandler + + LDP x0, x1, [sp], #16 + LDP x2, x3, [sp], #16 + LDP x4, x5, [sp], #16 + LDP x6, x7, [sp], #16 + LDP x8, x9, [sp], #16 + LDP x10, x11, [sp], #16 + LDP x12, x13, [sp], #16 + LDP x14, x15, [sp], #16 + LDP x16, x17, [sp], #16 + LDP x18, x19, [sp], #16 + LDP x29, x30, [sp], #16 + ERET + +// ------------------------------------------------------------ +// End of file +// ------------------------------------------------------------ + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c new file mode 100644 index 00000000..1ecd5f33 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c @@ -0,0 +1,419 @@ +// ---------------------------------------------------------- +// GIC400 - Generic Interrupt Controller +// +// GIC Exercise +// ---------------------------------------------------------- + +#include "gic400_gic.h" + +struct gic400_dist_if +{ + volatile unsigned int GICD_CTLR; // +0x000 - RW - Distributor Control Register + const volatile unsigned int GICD_TYPRE; // +0x004 - RO - Interrupt Controller Type Register + const volatile unsigned int GICD_IIDR; // +0x008 - RO - Distributor Implementer Identification Register + + const volatile unsigned int padding0[29]; + + volatile unsigned int GICD_IGROUPR[32]; // +0x080 - RW - Interrupt Groupt Registers (Security Registers in GICv1) + + volatile unsigned int GICD_ISENABLER[32]; // +0x100 - RW - Interrupt Set-Enable Registers + volatile unsigned int GICD_ICENABLER[32]; // +0x180 - RW - Interrupt Clear-Enable Registers + volatile unsigned int GICD_ISPENDR[32]; // +0x200 - RW - Interrupt Set-Pending Registers + volatile unsigned int GICD_ICPENDR[32]; // +0x280 - RW - Interrupt Clear-Pending Registers + volatile unsigned int GICD_ISACTIVER[32]; // +0x300 - RW - Interrupt Set-Active Register + volatile unsigned int GICD_ICACTIVER[32]; // +0x380 - RW - Interrupt Clear-Active Register + + volatile unsigned char GICD_IPRIORITYR[1024]; // +0x400 - RW - Interrupt Priority Registers + volatile unsigned int GICD_ITARGETSR[256]; // +0x800 - RW - Interrupt Processor Targets Registers + volatile unsigned int GICD_ICFGR[64]; // +0xC00 - RW - Interrupt Configuration Registers + + const volatile unsigned int padding2[128]; + + volatile unsigned int GICD_SGIR; // +0xF00 - WO - Software Generated Interrupt Register + +}; + +struct gic400_physical_cpu_if +{ + volatile unsigned int GICC_CTLR; // +0x000 - RW - CPU Interface Control Register + volatile unsigned int GICC_PMR; // +0x004 - RW - Interrupt Priority Mask Register + volatile unsigned int GICC_BPR; // +0x008 - RW - Binary Point Register + const volatile unsigned int GICC_IAR; // +0x00C - RO - Interrupt Acknowledge Register + volatile unsigned int GICC_EOIR; // +0x010 - WO - End of Interrupt Register + const volatile unsigned int GICC_RPR; // +0x014 - RO - Running Priority Register + const volatile unsigned int GICC_HPPIR; // +0x018 - RO - Highest Pending Interrupt Register + volatile unsigned int GICC_ABPR; // +0x01C - RW - Aliased Binary Point Register + const volatile unsigned int GICC_AIAR; // +0x020 - RO - Aliased Interrupt Acknowledge Register + volatile unsigned int GICC_AEOIR; // +0x024 - WO - Aliased End of Interrupt Register + const volatile unsigned int GICC_AHPPIR; // +0x028 - RO - Aliased Highest Pending Interrupt Register + + const volatile unsigned int padding0[52]; + + const volatile unsigned int GICC_IIDR; // +0x0FC - RO - CPU Interface Identification Register +}; + +struct gic400_dist_if* gic_dist; +struct gic400_physical_cpu_if* gic_cpu; + + +// ------------------------------------------------------------ + +void setGICAddr(void* dist, void* cpu) +{ + gic_dist = (struct gic400_dist_if*)dist; + gic_cpu = (struct gic400_physical_cpu_if*)cpu; + return; +} + +// ------------------------------------------------------------ + +// Global enable of the Interrupt Distributor +void enableGIC(void) +{ + gic_dist->GICD_CTLR = 3; + return; +} + +// Global disable of the Interrupt Distributor +void disableGIC(void) +{ + gic_dist->GICD_CTLR = 0; + return; +} + +// ------------------------------------------------------------ + +// Enables the interrupt source number ID +void enableIntID(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ISENABLER[bank] = ID; + + return; +} + +// Disables the interrupt source number ID +void disableIntID(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ICENABLER[bank] = ID; + + return; +} + +// ------------------------------------------------------------ + +// Sets the priority of the specified ID +void setIntPriority(unsigned int ID, unsigned int priority) +{ + if (ID > 1020) // Check ID in range + return; + + // The priority registers allows byte accesses + // meaning using a char array we can directly + // reference the correct entry + gic_dist->GICD_IPRIORITYR[ID] = priority; + + return; +} + +// Returns the priority of the specified ID +unsigned int getIntPriority(unsigned int ID) +{ + if (ID > 1020) // Check ID in range + return 0; + + return gic_dist->GICD_IPRIORITYR[ID]; +} + +// ------------------------------------------------------------ + +// Sets the target CPUs of the specified ID +// For 'target' use one of the above defines +void setIntTarget(unsigned int ID, unsigned int target) +{ + unsigned int bank, tmp; + + target = target & 0xFF; // Target field is 8-bits, mask off unused bit + bank = ID/4; // There are 4 IDs per register, need to work out which register to access + ID = ID & 0x3; // ... and which field within the register + ID = ID * 8; // Convert from which field to a bit offset (8-bits per field) + + target = target << ID; // Move prioity value into correct bit position + + tmp = gic_dist->GICD_ITARGETSR[bank]; // Read the current value in the register + tmp = tmp & ~(0xFF << ID); // Blank out the field holding the value we're modifying + tmp = tmp | target; // OR in the new target + gic_dist->GICD_ITARGETSR[bank] = tmp; + + return; +} + +// Returns the target CPUs of the specified ID +unsigned int getIntTarget(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/4; // There are 4 IDs per register, need to work out which register to access + ID = ID & 0x3; // ... and which field within the register + ID = ID * 8; // Convert from which field to a bit offset (8-bits per field) + + tmp = gic_dist->GICD_ITARGETSR[bank]; + + tmp = tmp >> ID; // Shift desired field to bit position 0 + tmp = tmp & 0xFF; // Mask off the other bits + + return tmp; +} + +// ---------------------------------------------------------- + +// Configures the specified ID as being level or edge triggered +void configureSPI(unsigned int ID, unsigned int conf) +{ + unsigned int bank, tmp; + + conf = conf & 0x3; // Mask out unused bits + + bank = ID/16; // There are 16 IDs per register, need to work out which register to access + ID = ID & 0xF; // ... and which field within the register + ID = ID * 2; // Convert from which field to a bit offset (2-bits per field) + + conf = conf << ID; // Move configuration value into correct bit position + + tmp = gic_dist-> GICD_ICFGR[bank]; // Read current vlase + tmp = tmp & ~(0x3 << ID); // Clear the bits for the specified field + tmp = tmp | conf; // OR in new configuration + gic_dist-> GICD_ICFGR[bank] = tmp; // Write updated value back + + return; +} + +// ---------------------------------------------------------- + +// Sets the pending bit of the specified ID +void setIntPending(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ISPENDR[bank] = ID; + + return; +} + +// Clears the pending bit of the specified ID +void clearIntPending(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ICPENDR[bank] = ID; + + return; +} + +// Returns the value of the status bit of the specifed ID +unsigned int getIntPending(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + tmp = gic_dist->GICD_ICPENDR[bank]; // Read the register containing the ID we are interested in + tmp = tmp >> ID; // Shift the status bit for specified ID to position 0 + tmp = tmp & 0x1; // Mask off the rest of the register + + return tmp; +} + +// ------------------------------------------------------------ + +// Send a software generate interrupt +void sendSGI(unsigned int ID, unsigned int cpu_list, unsigned int filter_list, unsigned int SATT) +{ + // Ensure unused bits are clear, and shift into correct bit position + ID = ID & 0xF; + SATT = (SATT & 0x1) << 15; + cpu_list = (cpu_list & 0xFF) << 16; + filter_list = (filter_list & 0x3) << 24; + + // Combine fields + ID = ID | SATT | cpu_list | filter_list; + + gic_dist->GICD_SGIR = ID; + + return; +} + +// ------------------------------------------------------------ + +// Sets the specified ID as secure +void makeIntGroup0(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + ID = ~ID; // Invert to get mask + + tmp = gic_dist->GICD_IGROUPR[bank]; // Read current value + tmp = tmp & ID; + gic_dist->GICD_IGROUPR[bank] = tmp; + + return; +} + +// Set the specified ID as non-secure +void makeIntGroup1(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + tmp = gic_dist->GICD_IGROUPR[bank]; // Read current value + tmp = tmp | ID; // Or with bit mask to set the bit + gic_dist->GICD_IGROUPR[bank] = tmp; // Write-back +} + +// Returns the security of the specified ID +unsigned int getIntGroup(unsigned int ID) +{ + // TBD + return 0; +} + +// ------------------------------------------------------------ +// CPU Interface functions +// ------------------------------------------------------------ + +// Enables the CPU interface +// Must been done one each core seperately +void enableCPUInterface(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0x1; // Set bit 0 + gic_cpu->GICC_CTLR = tmp; +} + +// Enables the group 1 (non-secure) CPU interface +// This function can only be called from the Secure world +// Must been done one each core seperately +void enableNonSecureCPUInterface(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0x2; // Set bit 1 + gic_cpu->GICC_CTLR = tmp; +} + +// Disables the processor interface +void disableCPUInterface(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp & 0xFFFFFFFFE; // Clear bit 0 + gic_cpu->GICC_CTLR = tmp; +} + +// Enables the sending of secure interrupts as FIQs +void enableSecureFIQs(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0x8; // Set bit 3 + gic_cpu->GICC_CTLR = tmp; +} + +// Disables the sending of secure interrupts as FIQs +void disableSecureFIQs(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0xFFFFFFFF7; // Clear bit 3 + gic_cpu->GICC_CTLR = tmp; +} + +// Returns the value of the Interrupt Acknowledge Register +unsigned int readIntAck(void) +{ + return gic_cpu->GICC_IAR; +} + +// Writes ID to the End Of Interrupt register +void writeEOI(unsigned int ID) +{ + gic_cpu->GICC_EOIR = ID; + return; +} + +// Returns the value of the Aliased Interrupt Acknowledge Register +unsigned int readAliasedIntAck(void) +{ + return gic_cpu->GICC_AIAR; +} + +// Writes ID to the Aliased End Of Interrupt register +void writeAliasedEOI(unsigned int ID) +{ + gic_cpu->GICC_AEOIR = ID; + return; +} + +// Sets the Priority mask register for the core run on +// The reset value masks ALL interrupts! +void setPriorityMask(unsigned int priority) +{ + gic_cpu->GICC_PMR = (priority & 0xFF); + return; +} + +// Sets the Binary Point Register for the core run on +void setBinaryPoint(unsigned int priority) +{ + gic_cpu->GICC_BPR = (priority & 0xFF); + return; +} + +// Sets the Aliased Binary Point Register for the core run on +void setAliasedBinaryPoint(unsigned int priority) +{ + gic_cpu->GICC_ABPR = (priority & 0xFF); + return; +} + +// ------------------------------------------------------------ +// End of gic400_gic.c +// ------------------------------------------------------------ diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h new file mode 100644 index 00000000..aca064c3 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h @@ -0,0 +1,192 @@ +// ---------------------------------------------------------- +// GIC400 - Generic Interrupt Controller +// Header +// +// Martin Weidmann Dec 2011 +// ---------------------------------------------------------- + +#ifndef __gic400_gic_h +#define __gic400_gic_h + +#define GIC_GIC400_PPI0 (0) +#define GIC_GIC400_PPI1 (1) +#define GIC_GIC400_PPI2 (2) +#define GIC_GIC400_PPI3 (3) +#define GIC_GIC400_PPI4 (4) +#define GIC_GIC400_PPI5 (5) +#define GIC_GIC400_PPI6 (6) +#define GIC_GIC400_PPI7 (7) +#define GIC_GIC400_PPI8 (8) +#define GIC_GIC400_PPI9 (9) +#define GIC_GIC400_PPI10 (10) +#define GIC_GIC400_PPI11 (11) +#define GIC_GIC400_PPI12 (12) +#define GIC_GIC400_PPI13 (13) +#define GIC_GIC400_PPI14 (14) +#define GIC_GIC400_PPI15 (15) +#define GIC_GIC400_PPI16 (16) +#define GIC_GIC400_PPI17 (17) +#define GIC_GIC400_PPI18 (18) +#define GIC_GIC400_PPI19 (19) +#define GIC_GIC400_PPI20 (20) +#define GIC_GIC400_PPI21 (21) +#define GIC_GIC400_PPI22 (22) +#define GIC_GIC400_PPI23 (23) +#define GIC_GIC400_PPI24 (24) +#define GIC_GIC400_PPI25 (25) +#define GIC_GIC400_PPI26 (26) +#define GIC_GIC400_PPI27 (27) +#define GIC_GIC400_PPI28 (28) +#define GIC_GIC400_PPI29 (29) +#define GIC_GIC400_PPI30 (30) +#define GIC_GIC400_PPI31 (31) + +// ---------------------------------------------------------- + +// Sets the address of the GIC's distributor and CPU interfaces +void setGICAddr(void* dist, void* cpu); + +// ---------------------------------------------------------- + +// Global enable of the Interrupt Distributor +void enableGIC(void); + +// Global disable of the Interrupt Distributor +void disableGIC(void); + +// ---------------------------------------------------------- + +// Enables the interrupt source number ID +void enableIntID(unsigned int ID); + +// Disables the interrupt source number ID +void disableIntID(unsigned int ID); + +// ---------------------------------------------------------- + +// Sets the priority of the specified ID +void setIntPriority(unsigned int ID, unsigned int priority); + +// Returns the priority of the specified ID +unsigned int getIntPriority(unsigned int ID); + +// ---------------------------------------------------------- + +#define GIC_GIC400_TARGET_CPU0 (0x01) +#define GIC_GIC400_TARGET_CPU1 (0x02) +#define GIC_GIC400_TARGET_CPU2 (0x04) +#define GIC_GIC400_TARGET_CPU3 (0x08) +#define GIC_GIC400_TARGET_CPU4 (0x10) +#define GIC_GIC400_TARGET_CPU5 (0x20) +#define GIC_GIC400_TARGET_CPU6 (0x40) +#define GIC_GIC400_TARGET_CPU7 (0x80) + +// Sets the target CPUs of the specified ID +// For 'target' use one of the above defines +void setIntTarget(unsigned int ID, unsigned int target); + +// Returns the target CPUs of the specified ID +unsigned int getIntTarget(unsigned int ID); + +// ---------------------------------------------------------- + +#define GIC_GIC400_CONFIG_LEVEL (0) +#define GIC_GIC400_CONFIG_EDGE (2) + +// Configures the specified ID as being level or edge triggered + +void configureSPI(unsigned int ID, unsigned int conf); + +// ---------------------------------------------------------- + +// Sets the pending bit of the specified ID +void setIntPending(unsigned int ID); + +// Clears the pending bit of the specified ID +void clearIntPending(unsigned int ID); + +#define GIC_GIC400_PENDING_IS_SET (1) +#define GIC_GIC400_PENDING_IS_CLEAR (0) + +// Returns the value of the status bit of the specified ID +unsigned int getIntPending(unsigned int ID); + +// ---------------------------------------------------------- + +#define GIC_GIC400_SGI_SECURE (0) +#define GIC_GIC400_SGI_NONSECURE (1) +#define GIC_GIC400_SGI_FILTER_USE_LIST (0) +#define GIC_GIC400_SGI_FILTER_NOT_THIS_CPU (1) +#define GIC_GIC400_SGI_FILTER_THIS_CPU (2) +#define GIC_GIC400_SGI_CPU0 (0x01) +#define GIC_GIC400_SGI_CPU1 (0x02) +#define GIC_GIC400_SGI_CPU2 (0x04) +#define GIC_GIC400_SGI_CPU3 (0x08) +#define GIC_GIC400_SGI_CPU4 (0x10) +#define GIC_GIC400_SGI_CPU5 (0x20) +#define GIC_GIC400_SGI_CPU6 (0x40) +#define GIC_GIC400_SGI_CPU7 (0x80) + +// Send a software generate interrupt +void sendSGI(unsigned int ID, unsigned int cpu_list, unsigned int filter_list, unsigned int SATT); + +// ---------------------------------------------------------- + +// Sets the specified ID as secure +void makeIntGroup0(unsigned int ID); + +// Set the specified ID as non-secure +void makeIntGroup1(unsigned int ID); + +// Returns the security of the specified ID +unsigned int getIntGroup(unsigned int ID); + +// ------------------------------------------------------------ +// CPU Interface functions +// ------------------------------------------------------------ + +// Enables the processor interface +// Must been done one each core seperately +void enableCPUInterface(void); + +// Enables the group 1 (non-secure) CPU interface +// This function can only be called from the Secure world +// Must been done one each core seperately +void enableNonSecureCPUInterface(void); + +// Disables the processor interface +void disableCPUInterface(void); + +// Enables the sending of secure interrupts as FIQs +void enableSecureFIQs(void); + +// Disables the sending of secure interrupts as FIQs +void disableSecureFIQs(void); + +// Returns the value of the Interrupt Acknowledge Register +unsigned int readIntAck(void); + +// Writes ID to the End Of Interrupt register +void writeEOI(unsigned int ID); + +// Returns the value of the Aliased Interrupt Acknowledge Register +unsigned int readAliasedIntAck(void); + +// Writes ID to the Aliased End Of Interrupt register +void writeAliasedEOI(unsigned int ID); + +// Sets the Priority mask register for the core run on +// The reset value masks ALL interrupts! +void setPriorityMask(unsigned int priority); + +// Sets the Binary Point Register for the core run on +void setBinaryPoint(unsigned int priority); + +// Sets the Aliased Binary Point Register for the core run on +void setAliasedBinaryPoint(unsigned int priority); + +#endif + +// ---------------------------------------------------------- +// End of gic400_gic.h +// ---------------------------------------------------------- diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c b/ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c new file mode 100644 index 00000000..dc19cd3b --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c @@ -0,0 +1,104 @@ +// +// Copyright ARM LTD, 2013 + +#include +#include "gic400_gic.h" +#include "armv8_aarch64_SystemTimer.h" +#include "tx_api.h" + + +void _tx_timer_interrupt(void); + + + +// -------------------------------------------------------- + +void hw_setup(void) +{ + long long current_time; + + + setGICAddr((void*)0x2C001000, (void*)0x2C002000); + + // + // Configure interrupt controller (GICv2 assumed) + // + enableGIC(); + enableCPUInterface(); + enableNonSecureCPUInterface(); + setPriorityMask(0xFF); + enableSecureFIQs(); + + // Secure Physical Timer (ID 29) + enableIntID(29); + setIntPriority(29, 0); + makeIntGroup0(29); + + // Non-Secure Physical Timer (ID 30) + enableIntID(30); + setIntPriority(30, 0); + makeIntGroup1(30); + + + // + // Configure timer + // + configSecureEL1TimerAccess(SCR_ENABLE_SECURE_EL1_ACCESS); + + current_time = getPhysicalCount(); + + // Configure the Secure Physical Timer + setSEL1PhysicalCompValue(current_time + 10000); + setSEL1PhysicalTimerCtrl(CNTPS_CTL_ENABLE); + + // Configure the Non-Secure Physical Timer + setNSEL1PhysicalCompValue(current_time + 20000); + setNSEL1PhysicalTimerCtrl(CNTP_CTL_ENABLE); + + + // NOTE: + // This code assumes that the IRQ and FIQ exceptions + // have been routed to the appropriate EL. In this + // example that is done in the startup.s file +} + + +// -------------------------------------------------------- + +void fiqHandler(void) +{ + unsigned int ID; + +// printf("Hello from the FIQ handler\n"); + + ID = readIntAck(); + setSEL1PhysicalTimerCtrl(0); // Disable timer to clear interrupt + writeEOI(ID); + + return; +} + +// -------------------------------------------------------- + +void irqHandler(void) +{ + unsigned int ID; + unsigned long long current_time; + +// printf("Hello from the IRQ handler\n"); + + ID = readAliasedIntAck(); + setNSEL1PhysicalTimerCtrl(0); // Disable timer to clear interrupt + writeAliasedEOI(ID); + + current_time = getPhysicalCount(); + setNSEL1PhysicalCompValue(current_time + 20000); + setNSEL1PhysicalTimerCtrl(CNTP_CTL_ENABLE); + + //tx_thread_resume(&thread_1); + _tx_timer_interrupt(); + + return; +} + +// -------------------------------------------------------- diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..db5318f0 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,381 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include + +#define DEMO_STACK_SIZE 2048 +#define DEMO_BYTE_POOL_SIZE 64000 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define board-specific hardware setup. */ + +void hw_setup(void); + + +/* Define main entry point. */ + +int main() +{ + + /* Setup hardware. */ + hw_setup(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +UCHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt new file mode 100644 index 00000000..90c80d28 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt @@ -0,0 +1,15 @@ +LOAD 0x80000000 +{ + BASE 0x80000000 + { + * (+RO) + } + + RAM +0x0 + { + * (+RW, +ZI) + } + + ARM_LIB_STACKHEAP 0x80090000 EMPTY -0x00040000 + {} +} \ No newline at end of file diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S b/ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S new file mode 100644 index 00000000..8b1f8f3b --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S @@ -0,0 +1,199 @@ +//================================================================== +// Copyright ARM Ltd 2012. All rights reserved. +// +// ARMv8 example - Startup Code +//================================================================== + + .section BOOT,"ax" + .align 3 + +// ------------------------------------------------------------ + +.equ Mode_USR, 0x10 + +.equ AArch32_Mode_USR, 0x10 +.equ AArch32_Mode_FIQ, 0x11 +.equ AArch32_Mode_IRQ, 0x12 +.equ AArch32_Mode_SVC, 0x13 +.equ AArch32_Mode_ABT, 0x17 +.equ AArch32_Mode_UNDEF, 0x1B +.equ AArch32_Mode_SYS, 0x1F +.equ AArch32_Mode_HYP, 0x1A +.equ AArch32_Mode_MON, 0x16 + +.equ AArch64_EL2_SP2, 0x09 // EL2h +.equ AArch64_EL2_SP0, 0x08 // EL2t +.equ AArch64_EL1_SP1, 0x05 // EL1h +.equ AArch64_EL1_SP0, 0x04 // EL1t +.equ AArch64_EL0_SP0, 0x00 + +.equ AArch32_State_Thumb, 0x20 +.equ AArch32_State_ARM, 0x00 + +// ------------------------------------------------------------ + +.equ TT_S1_TABLE, 0x00000000000000003 // NSTable=0, PXNTable=0, UXNTable=0, APTable=0 + +// TT block entries templates (L1 and L2, NOT L3) +// Assuming table contents: +// 0 = b01000100 = Normal, Inner/Outer Non-Cacheable +// 1 = b11111111 = Normal, Inner/Outer WB/WA/RA +// 2 = b00000000 = Device-nGnRnE +.equ TT_S1_FAULT, 0x0 +.equ TT_S1_NORMAL_NO_CACHE, 0x00000000000000401 // Index = 0, AF=1 +.equ TT_S1_NORMAL_WBWA, 0x00000000000000405 // Index = 1, AF=1 +.equ TT_S1_DEVICE_nGnRnE, 0x00000000000000409 // Index = 2, AF=1 + +.equ TT_S1_UXN, (1 << 54) +.equ TT_S1_PXN, (1 << 53) +.equ TT_S1_nG, (1 << 11) +.equ TT_S1_NS, (1 << 5) + +.equ TT_S1_NON_SHARED, (0 << 8) // Non-shareable +.equ TT_S1_INNER_SHARED, (3 << 8) // Inner-shareable +.equ TT_S1_OUTER_SHARED, (2 << 8) // Outer-shareable + +.equ TT_S1_PRIV_RW, (0x0) +.equ TT_S1_PRIV_RO, (0x2 << 6) +.equ TT_S1_USER_RW, (0x1 << 6) +.equ TT_S1_USER_RO, (0x3 << 6) + +// ------------------------------------------------------------ + + .global start64 + .type start64, @function +start64: + + // Clear registers + // --------------- + // This is primarily for RTL simulators, to avoid + // possibility of X propergation + MOV x0, #0 + MOV x1, #0 + MOV x2, #0 + MOV x3, #0 + MOV x4, #0 + MOV x5, #0 + MOV x6, #0 + MOV x7, #0 + MOV x8, #0 + MOV x9, #0 + MOV x10, #0 + MOV x11, #0 + MOV x12, #0 + MOV x13, #0 + MOV x14, #0 + MOV x15, #0 + MOV x16, #0 + MOV x17, #0 + MOV x18, #0 + MOV x19, #0 + MOV x20, #0 + MOV x21, #0 + MOV x22, #0 + MOV x23, #0 + MOV x24, #0 + MOV x25, #0 + MOV x26, #0 + MOV x27, #0 + MOV x28, #0 + MOV x29, #0 + MOV x30, #0 + + // Which core am I + // ---------------- + MRS x0, MPIDR_EL1 + AND x0, x0, #0xFF // Mask off to leave Aff0 + CBZ x0, boot // If core 0, run the primary init code +sleep: + WFI + B sleep +boot: + + + // Disable trapping of CPTR_EL3 accesses or use of Adv.SIMD/FPU + // ------------------------------------------------------------- + MOV x0, #0 // Clear all trap bits + MSR CPTR_EL3, x0 + + + // Install vector table + // --------------------- + LDR x0, vector_table_address + MSR VBAR_EL3, x0 + + + // Configure SCR_EL3 + // ------------------ + MOV w1, #0 // Initial value of register is unknown + ORR w1, w1, #(1 << 11) // Set ST bit (Secure EL1 can access CNTPS_TVAL_EL1, CNTPS_CTL_EL1 & CNTPS_CVAL_EL1) + ORR w1, w1, #(1 << 10) // Set RW bit (EL1 is AArch64, as this is the Secure world) + ORR w1, w1, #(1 << 3) // Set EA bit (SError routed to EL3) + ORR w1, w1, #(1 << 2) // Set FIQ bit (FIQs routed to EL3) + ORR w1, w1, #(1 << 1) // Set IRQ bit (IRQs routed to EL3) + MSR SCR_EL3, x1 + + + // + // Cortex-A series specified configuration + // + .ifdef CORTEXA + // Configure ACTLR_EL1 + // -------------------- + // These bits are IMP DEF, so need to different for different + // processors + //MRS x1, ACTLR_EL1 + //ORR x1, x1, #1 // Enable EL1 access to ACTLR_EL1 + //ORR x1, x1, #(1 << 1) // Enable EL1 access to CPUECTLR_EL1 + //ORR x1, x1, #(1 << 4) // Enable EL1 access to L2CTLR_EL1 + //ORR x1, x1, #(1 << 5) // Enable EL1 access to L2ECTLR_EL1 + //ORR x1, x1, #(1 << 6) // Enable EL1 access to L2ACTLR_EL1 + //MSR ACTLR_EL1, x1 + + // Configure CPUECTLR_EL1 + // ----------------------- + // These bits are IMP DEF, so need to different for different + // processors + // SMPEN - bit 6 - Enables the processor to receive cache + // and TLB maintenance operations + // + // NOTE: For Cortex-A57/53 CPUEN should be set beforebefore + // enabling the caches and MMU, or performing any cache + // and TLB maintenance operations. + //MRS x0, S3_1_c15_c2_1 // Read EL1 CPU Extended Control Register + //ORR x0, x0, #(1 << 6) // Set the SMPEN bit + //MSR S3_1_c15_c2_1, x0 // Write EL1 CPU Extended Control Register + //ISB + .endif + + + // Ensure changes to system register are visible before MMU enabled + ISB + + + // Enable Interrupts + // ------------------ + MSR DAIFClr, 0x3 + + + // Branch to scatter loading and C library init code + .global __main + B __main + +//================================================================== +// Manually created literals pool +//================================================================== + .align 3 + +lit_stackheap_limit: + .global Image$$ARM_LIB_STACKHEAP$$ZI$$Limit // Linker symbol from scatter file + .quad (Image$$ARM_LIB_STACKHEAP$$ZI$$Limit) + +vector_table_address: + .global el3_vectors + .quad el3_vectors + +// ------------------------------------------------------------ +// End of file +// ------------------------------------------------------------ + diff --git a/ports/cortex_a5x/ac6/example_build/tx/.cproject b/ports/cortex_a5x/ac6/example_build/tx/.cproject new file mode 100644 index 00000000..11f9c6c9 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/tx/.cproject @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/example_build/tx/.project b/ports/cortex_a5x/ac6/example_build/tx/.project new file mode 100644 index 00000000..863ca5cb --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml b/ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..118220fc --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/inc/tx_port.h b/ports/cortex_a5x/ac6/inc/tx_port.h new file mode 100644 index 00000000..33a029ff --- /dev/null +++ b/ports/cortex_a5x/ac6/inc/tx_port.h @@ -0,0 +1,367 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5x/ARM */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef int LONG; +typedef unsigned int ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Override the alignment type to use 64-bit alignment and storage for pointers. */ + +#define ALIGN_TYPE_DEFINED +typedef unsigned long long ALIGN_TYPE; + + +/* Override the free block marker for byte pools to be a 64-bit constant. */ + +#define TX_BYTE_BLOCK_FREE ((ALIGN_TYPE) 0xFFFFEEEEFFFFEEEE) + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 4096 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#define TX_INT_ENABLE 0x00 /* Enable IRQ & FIQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_fp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) b = (UINT) __builtin_ctz((unsigned int) m); + +#endif + + +/* Define the internal timer extension to also hold the thread pointer such that _tx_thread_timeout + can figure out what thread timeout to process. */ + +#define TX_TIMER_INTERNAL_EXTENSION VOID *tx_timer_internal_thread_timeout_ptr; + + +/* Define the thread timeout setup logic in _tx_thread_create. */ + +#define TX_THREAD_CREATE_TIMEOUT_SETUP(t) (t) -> tx_thread_timer.tx_timer_internal_timeout_function = &(_tx_thread_timeout); \ + (t) -> tx_thread_timer.tx_timer_internal_timeout_param = 0; \ + (t) -> tx_thread_timer.tx_timer_internal_thread_timeout_ptr = (VOID *) (t); + + +/* Define the thread timeout pointer setup in _tx_thread_timeout. */ + +#define TX_THREAD_TIMEOUT_POINTER_SETUP(t) (t) = (TX_THREAD *) _tx_timer_expired_timer_ptr -> tx_timer_internal_thread_timeout_ptr; + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef TX_DISABLE_INLINE + +/* Define macros, with in-line assembly for performance. */ + +__attribute__( ( always_inline ) ) static inline unsigned int __disable_interrupts(void) +{ + +unsigned long long daif_value; + + __asm__ volatile (" MRS %0, DAIF ": "=r" (daif_value) ); + __asm__ volatile (" MSR DAIFSet, 0x3" : : : "memory" ); + return((unsigned int) daif_value); +} + +__attribute__( ( always_inline ) ) static inline void __restore_interrupts(unsigned int daif_value) +{ + +unsigned long long temp; + + temp = (unsigned long long) daif_value; + __asm__ volatile (" MSR DAIF,%0": : "r" (temp): "memory" ); +} + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#define TX_DISABLE interrupt_save = __disable_interrupts(); +#define TX_RESTORE __restore_interrupts(interrupt_save); + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define FP extension for the Cortex-A5x. Each is assumed to be called in the context of the executing + thread. */ + +#ifndef TX_SOURCE_CODE +#define tx_thread_fp_enable _tx_thread_fp_enable +#define tx_thread_fp_disable _tx_thread_fp_disable +#endif + +VOID tx_thread_fp_enable(VOID); +VOID tx_thread_fp_disable(VOID); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5x/ARM Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + diff --git a/ports/cortex_a5x/ac6/readme_threadx.txt b/ports/cortex_a5x/ac6/readme_threadx.txt new file mode 100644 index 00000000..6907bd0f --- /dev/null +++ b/ports/cortex_a5x/ac6/readme_threadx.txt @@ -0,0 +1,255 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5x + + Using the ARM Compiler 6 & DS + +1. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace, which is located inside your ThreadX installation +directory. + +Note: the workspace and projects were made using DS-5, so DS will prompt you +to migrate the projects. This is expected, so please do so. + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply select the Eclipse project file +"tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the DS debugger on the +VE-AEMv8x1 Bare Metal simulator. + +Building the demonstration is easy; simply open the workspace file, select the +sample_threadx project, and select the build button. Next, right-click on the +project and select "Debug As -> Debug Configurations". The debugger is setup +for VE_AEMv8x1 Bare Metal Debug, so selecting "Debug" will launch the simulator, +load the sample_threadx.axf ELF file and run to main. You are now ready to +execute the ThreadX demonstration. + + +4. System Initialization + +The entry point in ThreadX for the Cortex-A5x using ARM tools is at label +start64. This is defined within the ARM compiler's startup code. In addition, +this is where all static and global pre-set C variable initialization processing +takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for determining the +first available RAM address for use by the application, which is supplied as the +sole input parameter to your application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The 64-bit ARM compiler assumes that registers x0-x18 are scratch registers +for each function. All other registers used by a C function must be preserved +by the function. ThreadX takes advantage of this in situations where a context +switch happens as a result of making a ThreadX service call (which is itself a +C function). In such cases, the saved context of a thread is only the +non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + +FP not enabled and TX_THREAD.tx_thread_fp_enable == 0: + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x000 SPSR DAIF + 0x008 ELR 0 + 0x010 x28 x27 + 0x018 reserved x28 + 0x020 x26 x25 + 0x028 x27 x26 + 0x030 x24 x23 + 0x038 x25 x24 + 0x040 x22 x21 + 0x048 x23 x22 + 0x050 x20 x19 + 0x058 x21 x20 + 0x060 x18 x29 + 0x068 x19 x30 + 0x070 x16 + 0x078 x17 + 0x080 x14 + 0x088 x15 + 0x090 x12 + 0x098 x13 + 0x0A0 x10 + 0x0A8 x11 + 0x0B0 x8 + 0x0B8 x9 + 0x0C0 x6 + 0x0C8 x7 + 0x0D0 x4 + 0x0D8 x5 + 0x0E0 x2 + 0x0E8 x3 + 0x0F0 x0 + 0x0F8 x1 + 0x100 x29 + 0x108 x30 + + +FP enabled and TX_THREAD.tx_thread_fp_enable == 1: + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x000 SPSR DAIF + 0x008 ELR 0 + 0x010 FPSR FPSR + 0x018 FPCR FPCR + 0x020 q30 q14 + 0x030 q31 q15 + 0x040 q28 q12 + 0x050 q29 q13 + 0x060 q26 q10 + 0x070 q27 q11 + 0x080 q24 q8 + 0x090 q25 q9 + 0x0A0 q22 x27 + 0x0A8 x28 + 0x0B0 q23 x25 + 0x0B8 x26 + 0x0C0 q20 x23 + 0x0C8 x24 + 0x0D0 q21 x21 + 0x0D8 x22 + 0x0E0 q18 x19 + 0x0E8 x20 + 0x0F0 q19 x29 + 0x0F8 x30 + 0x100 q16 + 0x110 q17 + 0x120 q14 + 0x130 q15 + 0x140 q12 + 0x150 q13 + 0x160 q10 + 0x170 q11 + 0x180 q8 + 0x190 q9 + 0x1A0 q6 + 0x1B0 q7 + 0x1C0 q4 + 0x1D0 q5 + 0x1E0 q2 + 0x1F0 q3 + 0x200 q0 + 0x210 q1 + 0x220 x28 + 0x228 reserved + 0x230 x26 + 0x238 x27 + 0x240 x24 + 0x248 x25 + 0x250 x22 + 0x258 x23 + 0x260 x20 + 0x268 x21 + 0x270 x18 + 0x278 x19 + 0x280 x16 + 0x288 x17 + 0x290 x14 + 0x298 x15 + 0x2A0 x12 + 0x2A8 x13 + 0x2B0 x10 + 0x2B8 x11 + 0x2C0 x8 + 0x2C8 x9 + 0x2D0 x6 + 0x2D8 x7 + 0x2E0 x4 + 0x2E8 x5 + 0x2F0 x2 + 0x2F8 x3 + 0x300 x0 + 0x308 x1 + 0x310 x29 + 0x318 x30 + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the project settings to the desired compiler optimization level. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5x +targets. Interrupts handlers for the 64-bit mode of the Cortex-A5x have the following +format: + + .global irq_handler +irq_handler: + + STP x29, x30, [sp, #-16]! + BL _tx_thread_context_save + + /* Your ISR call goes here! */ + BL application_isr_handler + + B _tx_thread_context_restore + +By default, ThreadX assumes EL3 level of execution. Running and taking exceptions in EL1 +and EL2 can be done by simply building the ThreadX library with either EL1 or EL2 defined. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, thread sleeps, +timeouts, and application timers. Without such a timer interrupt source, these services +are not functional. However, all other ThreadX services are operational without a +periodic timer source. + + +9. ARM FP Support + +By default, FP support is disabled for each thread. If saving the context of the FP registers +is needed, the following API call must be made from the context of the application thread - before +the FP usage: + +void tx_thread_fp_enable(void); + +After this API is called in the application, FP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the FP registers +to be saved/restored. + +To disable FP register context saving, simply call the following API: + +void tx_thread_fp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A5x using ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5x/ac6/src/tx_initialize_low_level.S b/ports/cortex_a5x/ac6/src/tx_initialize_low_level.S new file mode 100644 index 00000000..699a819a --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_initialize_low_level.S @@ -0,0 +1,112 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_initialize_low_level(VOID) +{ */ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + + MSR DAIFSet, 0x3 // Lockout interrupts + + + /* Save the system stack pointer. */ + /* _tx_thread_system_stack_ptr = (VOID_PTR) (sp); */ + + LDR x0, =_tx_thread_system_stack_ptr // Pickup address of system stack ptr + MOV x1, sp // Pickup SP + BIC x1, x1, #0xF // Get 16-bit alignment + STR x1, [x0] // Store system stack + + /* Save the first available memory address. */ + /* _tx_initialize_unused_memory = (VOID_PTR) Image$$ZI$$Limit; */ + + LDR x0, =_tx_initialize_unused_memory // Pickup address of unused memory ptr + LDR x1, =zi_limit // Pickup unused memory address + LDR x1, [x1] // + STR x1, [x0] // Store unused memory address + + /* Done, return to caller. */ + + RET // Return to caller +/* } */ + + +zi_limit: + .quad (Image$$ARM_LIB_STACKHEAP$$ZI$$Limit) + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_context_restore.S b/ports/cortex_a5x/ac6/src/tx_thread_context_restore.S new file mode 100644 index 00000000..b8de07ac --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_context_restore.S @@ -0,0 +1,302 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + +/* .set ENABLE_ARM_FP,1 */ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling routine */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_restore(VOID) +{ */ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, @function +_tx_thread_context_restore: + + /* Lockout interrupts. */ + + MSR DAIFSet, 0x3 // Lockout interrupts + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR exit function to indicate an ISR is complete. */ + + BL _tx_execution_isr_exit // Call the ISR exit function +.endif + + /* Determine if interrupts are nested. */ + /* if (--_tx_thread_system_state) + { */ + + LDR x3, =_tx_thread_system_state // Pickup address of system state var + LDR w2, [x3, #0] // Pickup system state + SUB w2, w2, #1 // Decrement the counter + STR w2, [x3, #0] // Store the counter + CMP w2, #0 // Was this the first interrupt? + BEQ __tx_thread_not_nested_restore // If so, not a nested restore + + /* Interrupts are nested. */ + + /* Just recover the saved registers and return to the point of + interrupt. */ + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL +.ifdef EL1 + MSR SPSR_EL1, x4 // Setup SPSR for return + MSR ELR_EL1, x5 // Setup point of interrupt +.else +.ifdef EL2 + MSR SPSR_EL2, x4 // Setup SPSR for return + MSR ELR_EL2, x5 // Setup point of interrupt +.else + MSR SPSR_EL3, x4 // Setup SPSR for return + MSR ELR_EL3, x5 // Setup point of interrupt +.endif +.endif + LDP x18, x19, [sp], #16 // Recover x18, x19 + LDP x16, x17, [sp], #16 // Recover x16, x17 + LDP x14, x15, [sp], #16 // Recover x14, x15 + LDP x12, x13, [sp], #16 // Recover x12, x13 + LDP x10, x11, [sp], #16 // Recover x10, x11 + LDP x8, x9, [sp], #16 // Recover x8, x9 + LDP x6, x7, [sp], #16 // Recover x6, x7 + LDP x4, x5, [sp], #16 // Recover x4, x5 + LDP x2, x3, [sp], #16 // Recover x2, x3 + LDP x0, x1, [sp], #16 // Recover x0, x1 + LDP x29, x30, [sp], #16 // Recover x29, x30 + ERET // Return to point of interrupt + + /* } */ +__tx_thread_not_nested_restore: + + /* Determine if a thread was interrupted and no preemption is required. */ + /* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) + || (_tx_thread_preempt_disable)) + { */ + + LDR x1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR x0, [x1, #0] // Pickup actual current thread pointer + CMP x0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_restore // Yes, idle system was interrupted + + LDR x3, =_tx_thread_preempt_disable // Pickup preempt disable address + LDR w2, [x3, #0] // Pickup actual preempt disable flag + CMP w2, #0 // Is it set? + BNE __tx_thread_no_preempt_restore // Yes, don't preempt this thread + LDR x3, =_tx_thread_execute_ptr // Pickup address of execute thread ptr + LDR x2, [x3, #0] // Pickup actual execute thread pointer + CMP x0, x2 // Is the same thread highest priority? + BNE __tx_thread_preempt_restore // No, preemption needs to happen + + +__tx_thread_no_preempt_restore: + + /* Restore interrupted thread or ISR. */ + + /* Pickup the saved stack pointer. */ + /* sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; */ + + LDR x4, [x0, #8] // Switch to thread stack pointer + MOV sp, x4 // + + /* Recover the saved context and return to the point of interrupt. */ + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL1 +.ifdef EL1 + MSR SPSR_EL1, x4 // Setup SPSR for return + MSR ELR_EL1, x5 // Setup point of interrupt +.else +.ifdef EL2 + MSR SPSR_EL2, x4 // Setup SPSR for return + MSR ELR_EL2, x5 // Setup point of interrupt +.else + MSR SPSR_EL3, x4 // Setup SPSR for return + MSR ELR_EL3, x5 // Setup point of interrupt +.endif +.endif + LDP x18, x19, [sp], #16 // Recover x18, x19 + LDP x16, x17, [sp], #16 // Recover x16, x17 + LDP x14, x15, [sp], #16 // Recover x14, x15 + LDP x12, x13, [sp], #16 // Recover x12, x13 + LDP x10, x11, [sp], #16 // Recover x10, x11 + LDP x8, x9, [sp], #16 // Recover x8, x9 + LDP x6, x7, [sp], #16 // Recover x6, x7 + LDP x4, x5, [sp], #16 // Recover x4, x5 + LDP x2, x3, [sp], #16 // Recover x2, x3 + LDP x0, x1, [sp], #16 // Recover x0, x1 + LDP x29, x30, [sp], #16 // Recover x29, x30 + ERET // Return to point of interrupt + + /* } + else + { */ +__tx_thread_preempt_restore: + + LDR x4, [x0, #8] // Switch to thread stack pointer + MOV sp, x4 // + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL1 + STP x20, x21, [sp, #-16]! // Save x20, x21 + STP x22, x23, [sp, #-16]! // Save x22, x23 + STP x24, x25, [sp, #-16]! // Save x24, x25 + STP x26, x27, [sp, #-16]! // Save x26, x27 + STP x28, x29, [sp, #-16]! // Save x28, x29 +.ifdef ENABLE_ARM_FP + LDR w3, [x0, #248] // Pickup FP enable flag + CMP w3, #0 // Is FP enabled? + BEQ _skip_fp_save // No, skip FP save + STP q0, q1, [sp, #-32]! // Save q0, q1 + STP q2, q3, [sp, #-32]! // Save q2, q3 + STP q4, q5, [sp, #-32]! // Save q4, q5 + STP q6, q7, [sp, #-32]! // Save q6, q7 + STP q8, q9, [sp, #-32]! // Save q8, q9 + STP q10, q11, [sp, #-32]! // Save q10, q11 + STP q12, q13, [sp, #-32]! // Save q12, q13 + STP q14, q15, [sp, #-32]! // Save q14, q15 + STP q16, q17, [sp, #-32]! // Save q16, q17 + STP q18, q19, [sp, #-32]! // Save q18, q19 + STP q20, q21, [sp, #-32]! // Save q20, q21 + STP q22, q23, [sp, #-32]! // Save q22, q23 + STP q24, q25, [sp, #-32]! // Save q24, q25 + STP q26, q27, [sp, #-32]! // Save q26, q27 + STP q28, q29, [sp, #-32]! // Save q28, q29 + STP q30, q31, [sp, #-32]! // Save q30, q31 + MRS x2, FPSR // Pickup FPSR + MRS x3, FPCR // Pickup FPCR + STP x2, x3, [sp, #-16]! // Save FPSR, FPCR +_skip_fp_save: +.endif + STP x4, x5, [sp, #-16]! // Save x4 (SPSR_EL3), x5 (ELR_E3) + + MOV x3, sp // Move sp into x3 + STR x3, [x0, #8] // Save stack pointer in thread control + // block + LDR x3, =_tx_thread_system_stack_ptr // Pickup address of system stack + LDR x4, [x3, #0] // Pickup system stack pointer + MOV sp, x4 // Setup system stack pointer + + + /* Save the remaining time-slice and disable it. */ + /* if (_tx_timer_time_slice) + { */ + + LDR x3, =_tx_timer_time_slice // Pickup time-slice variable address + LDR w2, [x3, #0] // Pickup time-slice + CMP w2, #0 // Is it active? + BEQ __tx_thread_dont_save_ts // No, don't save it + + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; */ + + STR w2, [x0, #36] // Save thread's time-slice + MOV w2, #0 // Clear value + STR w2, [x3, #0] // Disable global time-slice flag + + /* } */ +__tx_thread_dont_save_ts: + + + /* Clear the current task pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + MOV x0, #0 // NULL value + STR x0, [x1, #0] // Clear current thread pointer + + /* Return to the scheduler. */ + /* _tx_thread_schedule(); */ + + /* } */ + +__tx_thread_idle_system_restore: + + /* Just return back to the scheduler! */ + + LDR x1, =_tx_thread_schedule // Build address for _tx_thread_schedule +.ifdef EL1 + MSR ELR_EL1, x1 // Setup point of interrupt + MOV x1, #0x5 // Setup EL1 return + MSR spsr_el1, x1 // Move into SPSR +.else +.ifdef EL2 + MSR ELR_EL2, x1 // Setup point of interrupt + MOV x1, #0x9 // Setup EL2 return + MSR spsr_el2, x1 // Move into SPSR +.else + MSR ELR_EL3, x1 // Setup point of interrupt + MOV x1, #0xD // Setup EL3 return + MSR spsr_el3, x1 // Move into SPSR +.endif +.endif + ERET // Return to scheduler +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_context_save.S b/ports/cortex_a5x/ac6/src/tx_thread_context_save.S new file mode 100644 index 00000000..88774af3 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_context_save.S @@ -0,0 +1,228 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_save(VOID) +{ */ + .global _tx_thread_context_save + .type _tx_thread_context_save, @function +_tx_thread_context_save: + + /* Upon entry to this routine, it is assumed that IRQ/FIQ interrupts are locked + out, x29 (frame pointer), x30 (link register) are saved, we are in EL1, + and all other registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) + { */ + + STP x0, x1, [sp, #-16]! // Save x0, x1 + STP x2, x3, [sp, #-16]! // Save x2, x3 + LDR x3, =_tx_thread_system_state // Pickup address of system state var + LDR w2, [x3, #0] // Pickup system state + CMP w2, #0 // Is this the first interrupt? + BEQ __tx_thread_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD w2, w2, #1 // Increment the nested interrupt counter + STR w2, [x3, #0] // Store it back in the variable + + /* Save the rest of the scratch registers on the stack and return to the + calling ISR. */ + + STP x4, x5, [sp, #-16]! // Save x4, x5 + STP x6, x7, [sp, #-16]! // Save x6, x7 + STP x8, x9, [sp, #-16]! // Save x8, x9 + STP x10, x11, [sp, #-16]! // Save x10, x11 + STP x12, x13, [sp, #-16]! // Save x12, x13 + STP x14, x15, [sp, #-16]! // Save x14, x15 + STP x16, x17, [sp, #-16]! // Save x16, x17 + STP x18, x19, [sp, #-16]! // Save x18, x19 +.ifdef EL1 + MRS x0, SPSR_EL1 // Pickup SPSR + MRS x1, ELR_EL1 // Pickup ELR (point of interrupt) +.else +.ifdef EL2 + MRS x0, SPSR_EL2 // Pickup SPSR + MRS x1, ELR_EL2 // Pickup ELR (point of interrupt) +.else + MRS x0, SPSR_EL3 // Pickup SPSR + MRS x1, ELR_EL3 // Pickup ELR (point of interrupt) +.endif +.endif + STP x0, x1, [sp, #-16]! // Save SPSR, ELR + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + STP x29, x30, [sp, #-16]! // Save x29, x30 + BL _tx_execution_isr_enter // Call the ISR enter function + LDP x29, x30, [sp], #16 // Recover x29, x30 +.endif + + /* Return to the ISR. */ + + RET // Return to ISR + +__tx_thread_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) + { */ + + ADD w2, w2, #1 // Increment the interrupt counter + STR w2, [x3, #0] // Store it back in the variable + LDR x1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR x0, [x1, #0] // Pickup current thread pointer + CMP x0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Save minimal context of interrupted thread. */ + + STP x4, x5, [sp, #-16]! // Save x4, x5 + STP x6, x7, [sp, #-16]! // Save x6, x7 + STP x8, x9, [sp, #-16]! // Save x8, x9 + STP x10, x11, [sp, #-16]! // Save x10, x11 + STP x12, x13, [sp, #-16]! // Save x12, x13 + STP x14, x15, [sp, #-16]! // Save x14, x15 + STP x16, x17, [sp, #-16]! // Save x16, x17 + STP x18, x19, [sp, #-16]! // Save x18, x19 +.ifdef EL1 + MRS x4, SPSR_EL1 // Pickup SPSR + MRS x5, ELR_EL1 // Pickup ELR (point of interrupt) +.else +.ifdef EL2 + MRS x4, SPSR_EL2 // Pickup SPSR + MRS x5, ELR_EL2 // Pickup ELR (point of interrupt) +.else + MRS x4, SPSR_EL3 // Pickup SPSR + MRS x5, ELR_EL3 // Pickup ELR (point of interrupt) +.endif +.endif + STP x4, x5, [sp, #-16]! // Save SPSR, ELR + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + MOV x4, sp // + STR x4, [x0, #8] // Save thread stack pointer + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + LDR x3, =_tx_thread_system_stack_ptr // Pickup address of system stack + LDR x4, [x3, #0] // Pickup system stack pointer + MOV sp, x4 // Setup system stack pointer + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + STP x29, x30, [sp, #-16]! // Save x29, x30 + BL _tx_execution_isr_enter // Call the ISR enter function + LDP x29, x30, [sp], #16 // Recover x29, x30 +.endif + + RET // Return to caller + + /* } + else + { */ + +__tx_thread_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + + /* Not much to do here, just adjust the stack pointer, and return to IRQ + processing. */ + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + STP x29, x30, [sp, #-16]! // Save x29, x30 + BL _tx_execution_isr_enter // Call the ISR enter function + LDP x29, x30, [sp], #16 // Recover x29, x30 +.endif + + ADD sp, sp, #48 // Recover saved registers + RET // Continue IRQ processing + + /* } +} */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c b/ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c new file mode 100644 index 00000000..8a921e86 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c @@ -0,0 +1,95 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fp_disable Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function disables the FP for the currently executing thread. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_fp_disable(VOID) +{ + +TX_THREAD *thread_ptr; +ULONG system_state; + + + /* Pickup the current thread pointer. */ + TX_THREAD_GET_CURRENT(thread_ptr); + + /* Get the system state. */ + system_state = TX_THREAD_GET_SYSTEM_STATE(); + + /* Make sure it is not NULL. */ + if (thread_ptr != TX_NULL) + { + + /* Thread is running... make sure the call is from the thread context. */ + if (system_state == 0) + { + + /* Yes, now set the FP enable flag to false in the TX_THREAD structure. */ + thread_ptr -> tx_thread_fp_enable = TX_FALSE; + } + } +} + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c b/ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c new file mode 100644 index 00000000..818b3e8a --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c @@ -0,0 +1,95 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fp_enable Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function enabled the FP for the currently executing thread. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_fp_enable(VOID) +{ + +TX_THREAD *thread_ptr; +ULONG system_state; + + + /* Pickup the current thread pointer. */ + TX_THREAD_GET_CURRENT(thread_ptr); + + /* Get the system state. */ + system_state = TX_THREAD_GET_SYSTEM_STATE(); + + /* Make sure it is not NULL. */ + if (thread_ptr != TX_NULL) + { + + /* Thread is running... make sure the call is from the thread context. */ + if (system_state == 0) + { + + /* Yes, now setup the FP enable flag in the TX_THREAD structure. */ + thread_ptr -> tx_thread_fp_enable = TX_TRUE; + } + } +} + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..1096b0b8 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S @@ -0,0 +1,89 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/*#define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_control(UINT new_posture) +{ */ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, @function +_tx_thread_interrupt_control: + + /* Pickup current interrupt lockout posture. */ + + MRS x1, DAIF // Pickup current interrupt posture + + /* Apply the new interrupt posture. */ + + MSR DAIF, x0 // Set new interrupt posture + MOV x0, x1 // Setup return value + RET // Return to caller +/* } */ + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..fb865d66 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S @@ -0,0 +1,87 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_disable Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for disabling interrupts */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_disable(void) +{ */ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable, @function +_tx_thread_interrupt_disable: + + /* Pickup current interrupt lockout posture. */ + + MRS x0, DAIF // Pickup current interrupt lockout posture + + /* Mask interrupts. */ + + MSR DAIFSet, 0x3 // Lockout interrupts + RET // Return to caller +/* } */ + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..336f54f8 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S @@ -0,0 +1,85 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_restore Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for restoring interrupts to the state */ +/* returned by a previous _tx_thread_interrupt_disable call. */ +/* */ +/* INPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_restore(UINT old_posture) +{ */ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore, @function +_tx_thread_interrupt_restore: + + /* Restore the old interrupt posture. */ + + MSR DAIF, x0 // Setup the old posture + RET // Return to caller + +/* } */ + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_schedule.S b/ports/cortex_a5x/ac6/src/tx_thread_schedule.S new file mode 100644 index 00000000..7b4e7ff4 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_schedule.S @@ -0,0 +1,240 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + +/* .set ENABLE_ARM_FP,1 */ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* _tx_thread_system_return Return to system from thread */ +/* _tx_thread_context_restore Restore thread's context */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_schedule(VOID) +{ */ + .global _tx_thread_schedule + .type _tx_thread_schedule, @function +_tx_thread_schedule: + + /* Enable interrupts. */ + + MSR DAIFClr, 0x3 // Enable interrupts + + /* Wait for a thread to execute. */ + /* do + { */ + + LDR x1, =_tx_thread_execute_ptr // Address of thread execute ptr + +.ifdef TX_ENABLE_WFI +__tx_thread_schedule_loop: + LDR x0, [x1, #0] // Pickup next thread to execute + CMP x0, #0 // Is it NULL? + BNE _tx_thread_schedule_thread // + WFI // + B __tx_thread_schedule_loop // Keep looking for a thread +_tx_thread_schedule_thread: +.else +__tx_thread_schedule_loop: + LDR x0, [x1, #0] // Pickup next thread to execute + CMP x0, #0 // Is it NULL? + BEQ __tx_thread_schedule_loop // If so, keep looking for a thread +.endif + + /* } + while(_tx_thread_execute_ptr == TX_NULL); */ + + /* Yes! We have a thread to execute. Lockout interrupts and + transfer control to it. */ + + MSR DAIFSet, 0x3 // Lockout interrupts + + /* Setup the current thread pointer. */ + /* _tx_thread_current_ptr = _tx_thread_execute_ptr; */ + + LDR x1, =_tx_thread_current_ptr // Pickup address of current thread + STR x0, [x1, #0] // Setup current thread pointer + + /* Increment the run count for this thread. */ + /* _tx_thread_current_ptr -> tx_thread_run_count++; */ + + LDR w2, [x0, #4] // Pickup run counter + LDR w3, [x0, #36] // Pickup time-slice for this thread + ADD w2, w2, #1 // Increment thread run-counter + STR w2, [x0, #4] // Store the new run counter + + /* Setup time-slice, if present. */ + /* _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; */ + + LDR x2, =_tx_timer_time_slice // Pickup address of time slice + // variable + LDR x4, [x0, #8] // Switch stack pointers + MOV sp, x4 // + STR w3, [x2, #0] // Setup time-slice + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread entry function to indicate the thread is executing. */ + + MOV x19, x0 // Save x0 + BL _tx_execution_thread_enter // Call the thread execution enter function + MOV x0, x19 // Restore x0 +.endif + + /* Switch to the thread's stack. */ + /* sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; */ + + /* Determine if an interrupt frame or a synchronous task suspension frame + is present. */ + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL1 + CMP x5, #0 // Check for synchronous context switch (ELR_EL1 = NULL) + BEQ _tx_solicited_return +.ifdef EL1 + MSR SPSR_EL1, x4 // Setup SPSR for return + MSR ELR_EL1, x5 // Setup point of interrupt +.else +.ifdef EL2 + MSR SPSR_EL2, x4 // Setup SPSR for return + MSR ELR_EL2, x5 // Setup point of interrupt +.else + MSR SPSR_EL3, x4 // Setup SPSR for return + MSR ELR_EL3, x5 // Setup point of interrupt +.endif +.endif +.ifdef ENABLE_ARM_FP + LDR w1, [x0, #248] // Pickup FP enable flag + CMP w1, #0 // Is FP enabled? + BEQ _skip_interrupt_fp_restore // No, skip FP restore + LDP x0, x1, [sp], #16 // Pickup FPSR, FPCR + MSR FPSR, x0 // Recover FPSR + MSR FPCR, x1 // Recover FPCR + LDP q30, q31, [sp], #32 // Recover q30, q31 + LDP q28, q29, [sp], #32 // Recover q28, q29 + LDP q26, q27, [sp], #32 // Recover q26, q27 + LDP q24, q25, [sp], #32 // Recover q24, q25 + LDP q22, q23, [sp], #32 // Recover q22, q23 + LDP q20, q21, [sp], #32 // Recover q20, q21 + LDP q18, q19, [sp], #32 // Recover q18, q19 + LDP q16, q17, [sp], #32 // Recover q16, q17 + LDP q14, q15, [sp], #32 // Recover q14, q15 + LDP q12, q13, [sp], #32 // Recover q12, q13 + LDP q10, q11, [sp], #32 // Recover q10, q11 + LDP q8, q9, [sp], #32 // Recover q8, q9 + LDP q6, q7, [sp], #32 // Recover q6, q7 + LDP q4, q5, [sp], #32 // Recover q4, q5 + LDP q2, q3, [sp], #32 // Recover q2, q3 + LDP q0, q1, [sp], #32 // Recover q0, q1 +_skip_interrupt_fp_restore: +.endif + LDP x28, x29, [sp], #16 // Recover x28 + LDP x26, x27, [sp], #16 // Recover x26, x27 + LDP x24, x25, [sp], #16 // Recover x24, x25 + LDP x22, x23, [sp], #16 // Recover x22, x23 + LDP x20, x21, [sp], #16 // Recover x20, x21 + LDP x18, x19, [sp], #16 // Recover x18, x19 + LDP x16, x17, [sp], #16 // Recover x16, x17 + LDP x14, x15, [sp], #16 // Recover x14, x15 + LDP x12, x13, [sp], #16 // Recover x12, x13 + LDP x10, x11, [sp], #16 // Recover x10, x11 + LDP x8, x9, [sp], #16 // Recover x8, x9 + LDP x6, x7, [sp], #16 // Recover x6, x7 + LDP x4, x5, [sp], #16 // Recover x4, x5 + LDP x2, x3, [sp], #16 // Recover x2, x3 + LDP x0, x1, [sp], #16 // Recover x0, x1 + LDP x29, x30, [sp], #16 // Recover x29, x30 + ERET // Return to point of interrupt + +_tx_solicited_return: + +.ifdef ENABLE_ARM_FP + LDR w1, [x0, #248] // Pickup FP enable flag + CMP w1, #0 // Is FP enabled? + BEQ _skip_solicited_fp_restore // No, skip FP restore + LDP x0, x1, [sp], #16 // Pickup FPSR, FPCR + MSR FPSR, x0 // Recover FPSR + MSR FPCR, x1 // Recover FPCR + LDP q14, q15, [sp], #32 // Recover q14, q15 + LDP q12, q13, [sp], #32 // Recover q12, q13 + LDP q10, q11, [sp], #32 // Recover q10, q11 + LDP q8, q9, [sp], #32 // Recover q8, q9 +_skip_solicited_fp_restore: +.endif + LDP x27, x28, [sp], #16 // Recover x27, x28 + LDP x25, x26, [sp], #16 // Recover x25, x26 + LDP x23, x24, [sp], #16 // Recover x23, x24 + LDP x21, x22, [sp], #16 // Recover x21, x22 + LDP x19, x20, [sp], #16 // Recover x19, x20 + LDP x29, x30, [sp], #16 // Recover x29, x30 + MSR DAIF, x4 // Recover DAIF + RET // Return to caller +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_stack_build.S b/ports/cortex_a5x/ac6/src/tx_thread_stack_build.S new file mode 100644 index 00000000..cd8609f2 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_stack_build.S @@ -0,0 +1,170 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +{ */ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, @function +_tx_thread_stack_build: + + + /* Build a fake interrupt frame. The form of the fake interrupt stack + on the Cortex-A5x should look like the following after it is built: + + Stack Top: SSPR Initial SSPR + ELR Point of interrupt + x28 Initial value for x28 + not used Not used + x26 Initial value for x26 + x27 Initial value for x27 + x24 Initial value for x24 + x25 Initial value for x25 + x22 Initial value for x22 + x23 Initial value for x23 + x20 Initial value for x20 + x21 Initial value for x21 + x18 Initial value for x18 + x19 Initial value for x19 + x16 Initial value for x16 + x17 Initial value for x17 + x14 Initial value for x14 + x15 Initial value for x15 + x12 Initial value for x12 + x13 Initial value for x13 + x10 Initial value for x10 + x11 Initial value for x11 + x8 Initial value for x8 + x9 Initial value for x9 + x6 Initial value for x6 + x7 Initial value for x7 + x4 Initial value for x4 + x5 Initial value for x5 + x2 Initial value for x2 + x3 Initial value for x3 + x0 Initial value for x0 + x1 Initial value for x1 + x29 Initial value for x29 (frame pointer) + x30 Initial value for x30 (link register) + 0 For stack backtracing + + Stack Bottom: (higher memory address) */ + + LDR x4, [x0, #24] // Pickup end of stack area + BIC x4, x4, #0xF // Ensure 16-byte alignment + + /* Actually build the stack frame. */ + + MOV x2, #0 // Build clear value + MOV x3, #0 // + + STP x2, x3, [x4, #-16]! // Set backtrace to 0 + STP x2, x3, [x4, #-16]! // Set initial x29, x30 + STP x2, x3, [x4, #-16]! // Set initial x0, x1 + STP x2, x3, [x4, #-16]! // Set initial x2, x3 + STP x2, x3, [x4, #-16]! // Set initial x4, x5 + STP x2, x3, [x4, #-16]! // Set initial x6, x7 + STP x2, x3, [x4, #-16]! // Set initial x8, x9 + STP x2, x3, [x4, #-16]! // Set initial x10, x11 + STP x2, x3, [x4, #-16]! // Set initial x12, x13 + STP x2, x3, [x4, #-16]! // Set initial x14, x15 + STP x2, x3, [x4, #-16]! // Set initial x16, x17 + STP x2, x3, [x4, #-16]! // Set initial x18, x19 + STP x2, x3, [x4, #-16]! // Set initial x20, x21 + STP x2, x3, [x4, #-16]! // Set initial x22, x23 + STP x2, x3, [x4, #-16]! // Set initial x24, x25 + STP x2, x3, [x4, #-16]! // Set initial x26, x27 + STP x2, x3, [x4, #-16]! // Set initial x28 +.ifdef EL1 + MOV x2, #0x5 // Build initial SPSR (EL1) +.else +.ifdef EL2 + MOV x2, #0x9 // Build initial SPSR (EL2) +.else + MOV x2, #0xD // Build initial SPSR (EL3) +.endif +.endif + MOV x3, x1 // Build initial ELR + STP x2, x3, [x4, #-16]! // Set initial SPSR & ELR + + /* Setup stack pointer. */ + /* thread_ptr -> tx_thread_stack_ptr = x2; */ + + STR x4, [x0, #8] // Save stack pointer in thread's + RET // Return to caller + +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_system_return.S b/ports/cortex_a5x/ac6/src/tx_thread_system_return.S new file mode 100644 index 00000000..5106a801 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_system_return.S @@ -0,0 +1,165 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + +/* .set ENABLE_ARM_FP,1 */ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the ThreadX system. Only a */ +/* minimal context is saved since the compiler assumes temp registers */ +/* are going to get slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling loop */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_system_return(VOID) +{ */ + .global _tx_thread_system_return + .type _tx_thread_system_return, @function +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; + MRS x0, DAIF // Pickup DAIF + MSR DAIFSet, 0x3 // Lockout interrupts + STP x29, x30, [sp, #-16]! // Save x29 (frame pointer), x30 (link register) + STP x19, x20, [sp, #-16]! // Save x19, x20 + STP x21, x22, [sp, #-16]! // Save x21, x22 + STP x23, x24, [sp, #-16]! // Save x23, x24 + STP x25, x26, [sp, #-16]! // Save x25, x26 + STP x27, x28, [sp, #-16]! // Save x27, x28 + LDR x5, =_tx_thread_current_ptr // Pickup address of current ptr + LDR x6, [x5, #0] // Pickup current thread pointer + +.ifdef ENABLE_ARM_FP + LDR w7, [x6, #248] // Pickup FP enable flag + CMP w7, #0 // Is FP enabled? + BEQ _skip_fp_save // No, skip FP save + STP q8, q9, [sp, #-32]! // Save q8, q9 + STP q10, q11, [sp, #-32]! // Save q10, q11 + STP q12, q13, [sp, #-32]! // Save q12, q13 + STP q14, q15, [sp, #-32]! // Save q14, q15 + MRS x2, FPSR // Pickup FPSR + MRS x3, FPCR // Pickup FPCR + STP x2, x3, [sp, #-16]! // Save FPSR, FPCR +_skip_fp_save: +.endif + + MOV x1, #0 // Clear x1 + STP x0, x1, [sp, #-16]! // Save DAIF and clear value for ELR_EK1 + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread exit function to indicate the thread is no longer executing. */ + + MOV x19, x5 // Save x5 + MOV x20, x6 // Save x6 + BL _tx_execution_thread_exit // Call the thread exit function + MOV x5, x19 // Restore x5 + MOV x6, x20 // Restore x6 +.endif + + LDR x2, =_tx_timer_time_slice // Pickup address of time slice + LDR w1, [x2, #0] // Pickup current time slice + + /* Save current stack and switch to system stack. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV x4, sp // + STR x4, [x6, #8] // Save thread stack pointer + LDR x3, =_tx_thread_system_stack_ptr // Pickup address of system stack + LDR x4, [x3, #0] // Pickup system stack pointer + MOV sp, x4 // Setup system stack pointer + + /* Determine if the time-slice is active. */ + /* if (_tx_timer_time_slice) + { */ + + MOV x4, #0 // Build clear value + CMP w1, #0 // Is a time-slice active? + BEQ __tx_thread_dont_save_ts // No, don't save the time-slice + + /* Save the current remaining time-slice. */ + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; */ + + STR w4, [x2, #0] // Clear time-slice + STR w1, [x6, #36] // Store current time-slice + + /* } */ +__tx_thread_dont_save_ts: + + /* Clear the current thread pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + STR x4, [x5, #0] // Clear current thread pointer + + B _tx_thread_schedule // Jump to scheduler! + +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_timer_interrupt.S b/ports/cortex_a5x/ac6/src/tx_timer_interrupt.S new file mode 100644 index 00000000..1559352e --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_timer_interrupt.S @@ -0,0 +1,240 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_timer.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_timer_interrupt(VOID) +{ */ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, @function +_tx_timer_interrupt: + + /* Upon entry to this routine, it is assumed that context save has already + been called, and therefore the compiler scratch registers are available + for use. */ + + /* Increment the system clock. */ + /* _tx_timer_system_clock++; */ + + LDR x1, =_tx_timer_system_clock // Pickup address of system clock + LDR w0, [x1, #0] // Pickup system clock + ADD w0, w0, #1 // Increment system clock + STR w0, [x1, #0] // Store new system clock + + /* Test for time-slice expiration. */ + /* if (_tx_timer_time_slice) + { */ + + LDR x3, =_tx_timer_time_slice // Pickup address of time-slice + LDR w2, [x3, #0] // Pickup time-slice + CMP w2, #0 // Is it non-active? + BEQ __tx_timer_no_time_slice // Yes, skip time-slice processing + + /* Decrement the time_slice. */ + /* _tx_timer_time_slice--; */ + + SUB w2, w2, #1 // Decrement the time-slice + STR w2, [x3, #0] // Store new time-slice value + + /* Check for expiration. */ + /* if (__tx_timer_time_slice == 0) */ + + CMP w2, #0 // Has it expired? + BNE __tx_timer_no_time_slice // No, skip expiration processing + + /* Set the time-slice expired flag. */ + /* _tx_timer_expired_time_slice = TX_TRUE; */ + + LDR x3, =_tx_timer_expired_time_slice // Pickup address of expired flag + MOV w0, #1 // Build expired value + STR w0, [x3, #0] // Set time-slice expiration flag + + /* } */ + +__tx_timer_no_time_slice: + + /* Test for timer expiration. */ + /* if (*_tx_timer_current_ptr) + { */ + + LDR x1, =_tx_timer_current_ptr // Pickup current timer pointer addr + LDR x0, [x1, #0] // Pickup current timer + LDR x2, [x0, #0] // Pickup timer list entry + CMP x2, #0 // Is there anything in the list? + BEQ __tx_timer_no_timer // No, just increment the timer + + /* Set expiration flag. */ + /* _tx_timer_expired = TX_TRUE; */ + + LDR x3, =_tx_timer_expired // Pickup expiration flag address + MOV w2, #1 // Build expired value + STR w2, [x3, #0] // Set expired flag + B __tx_timer_done // Finished timer processing + + /* } + else + { */ +__tx_timer_no_timer: + + /* No timer expired, increment the timer pointer. */ + /* _tx_timer_current_ptr++; */ + + ADD x0, x0, #8 // Move to next timer + + /* Check for wrap-around. */ + /* if (_tx_timer_current_ptr == _tx_timer_list_end) */ + + LDR x3, =_tx_timer_list_end // Pickup addr of timer list end + LDR x2, [x3, #0] // Pickup list end + CMP x0, x2 // Are we at list end? + BNE __tx_timer_skip_wrap // No, skip wrap-around logic + + /* Wrap to beginning of list. */ + /* _tx_timer_current_ptr = _tx_timer_list_start; */ + + LDR x3, =_tx_timer_list_start // Pickup addr of timer list start + LDR x0, [x3, #0] // Set current pointer to list start + +__tx_timer_skip_wrap: + + STR x0, [x1, #0] // Store new current timer pointer + /* } */ + +__tx_timer_done: + + + /* See if anything has expired. */ + /* if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) + { */ + + LDR x3, =_tx_timer_expired_time_slice // Pickup addr of expired flag + LDR w2, [x3, #0] // Pickup time-slice expired flag + CMP w2, #0 // Did a time-slice expire? + BNE __tx_something_expired // If non-zero, time-slice expired + LDR x1, =_tx_timer_expired // Pickup addr of other expired flag + LDR w0, [x1, #0] // Pickup timer expired flag + CMP w0, #0 // Did a timer expire? + BEQ __tx_timer_nothing_expired // No, nothing expired + +__tx_something_expired: + + + STP x29, x30, [sp, #-16]! // Save x29 (frame pointer), x30 (link register) + + /* Did a timer expire? */ + /* if (_tx_timer_expired) + { */ + + LDR x1, =_tx_timer_expired // Pickup addr of expired flag + LDR w0, [x1, #0] // Pickup timer expired flag + CMP w0, #0 // Check for timer expiration + BEQ __tx_timer_dont_activate // If not set, skip timer activation + + /* Process timer expiration. */ + /* _tx_timer_expiration_process(); */ + + BL _tx_timer_expiration_process // Call the timer expiration handling routine + + /* } */ +__tx_timer_dont_activate: + + /* Did time slice expire? */ + /* if (_tx_timer_expired_time_slice) + { */ + + LDR x3, =_tx_timer_expired_time_slice // Pickup addr of time-slice expired + LDR w2, [x3, #0] // Pickup the actual flag + CMP w2, #0 // See if the flag is set + BEQ __tx_timer_not_ts_expiration // No, skip time-slice processing + + /* Time slice interrupted thread. */ + /* _tx_thread_time_slice(); */ + + BL _tx_thread_time_slice // Call time-slice processing + + /* } */ + +__tx_timer_not_ts_expiration: + + LDP x29, x30, [sp], #16 // Recover x29, x30 + /* } */ + +__tx_timer_nothing_expired: + + RET // Return to caller + +/* } */ + + diff --git a/ports/cortex_a7/ac5/example_build/build_threadx.bat b/ports/cortex_a7/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..bca9317b --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a7/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a7/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..a3429108 --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a7.no_neon --fpu=softvfp -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a7/ac5/example_build/sample_threadx.c b/ports/cortex_a7/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..f137555a --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,414 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size + +VFPEnable EQU 0x40000000 ; VFP enable value + +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A7 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=Reset_Vector ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + EXPORT Reset_Vector +Reset_Vector + + IF {TARGET_FPU_VFP} = {TRUE} + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #VFPEnable ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 + ENDIF + + B __main +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a7/ac5/inc/tx_port.h b/ports/cortex_a7/ac5/inc/tx_port.h new file mode 100644 index 00000000..9ba22c77 --- /dev/null +++ b/ports/cortex_a7/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A7/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A7/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a7/ac5/readme_threadx.txt b/ports/cortex_a7/ac5/readme_threadx.txt new file mode 100644 index 00000000..4423047b --- /dev/null +++ b/ports/cortex_a7/ac5/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A7 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +Compiler. At this point you may run the build_threadx.bat batch file. This will +build the ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A7 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A7 Specifies Cortex-A7 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A7 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A7 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A7 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A7 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A7 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a7/ac5/src/tx_thread_context_restore.s b/ports/cortex_a7/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..0d03b49c --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_context_save.s b/ports/cortex_a7/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..93f1fc52 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..fc1c0dfc --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..45b0d4cb --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..ce1d8ae2 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..84c344a7 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..717606de --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..70c49171 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..5dcb28e6 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..3af929a5 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..c1083df4 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_schedule.s b/ports/cortex_a7/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..76ea630f --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_stack_build.s b/ports/cortex_a7/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..965582ab --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,165 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A7 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF + +;} + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_system_return.s b/ports/cortex_a7/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..95eed654 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..6237775e --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_timer_interrupt.s b/ports/cortex_a7/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..eb23279f --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a7/gnu/example_build/build_threadx.bat b/ports/cortex_a7/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..856fcc92 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a7/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a7/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..561bab52 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a7 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a7/gnu/example_build/crt0.S b/ports/cortex_a7/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a7/gnu/example_build/libc.a b/ports/cortex_a7/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 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

Q>dP6leU^u3WJIStz4({jFOv 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 z%0D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܌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 z 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

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 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�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�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l 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 E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_a7/gnu/example_build/libgcc.a b/ports/cortex_a7/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A7. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A7/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a7/gnu/readme_threadx.txt b/ports/cortex_a7/gnu/readme_threadx.txt new file mode 100644 index 00000000..f56a131e --- /dev/null +++ b/ports/cortex_a7/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A7 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A7 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a7 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a7 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A7 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A7 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a7/gnu/src/tx_thread_context_restore.S b/ports/cortex_a7/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..1a90baaf --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_context_save.S b/ports/cortex_a7/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..0535151c --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..b7ce5f4e --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..16ff6eb6 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..f4dbedda --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..ac18c99a --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..453a6b43 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..64721b51 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..8bae905a --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..c62e38e1 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..4e2fd962 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_schedule.S b/ports/cortex_a7/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..f0e20b7e --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a7/gnu/src/tx_thread_stack_build.S b/ports/cortex_a7/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..6c89ae45 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A7 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_system_return.S b/ports/cortex_a7/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..5c2047b4 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..b01f9190 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a7/gnu/src/tx_timer_interrupt.S b/ports/cortex_a7/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..bf58c2ee --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a7/iar/example_build/azure_rtos.eww b/ports/cortex_a7/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a7/iar/example_build/cstartup.s b/ports/cortex_a7/iar/example_build/cstartup.s new file mode 100644 index 00000000..647de2e8 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/cstartup.s @@ -0,0 +1,156 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #0x40000000 ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.c b/ports/cortex_a7/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c2cc9886 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.dep b/ports/cortex_a7/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..1a307303 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.dep @@ -0,0 +1,219 @@ + + + 4 + 3543161750 + + Debug + + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\tx_port.h + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\cstartup.s79 + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\lib\m7Sx_tlv.a + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\List\cstartup.lst + $TOOLKIT_DIR$\inc\ycheck.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\cstartup.s + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\demo.r79 + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $TOOLKIT_DIR$\inc\DLib_Product.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\DEMO.C + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + + + [ROOT_NODE] + + + ILINK + 16 26 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 31 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 26 + + + + + ILINK + 14 31 10 41 3 58 52 21 44 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 10 + + + __cstat + 25 + + + BICOMP + 20 + + + + + ICCARM + 18 57 40 38 30 28 51 55 4 42 13 27 34 12 53 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 31 23 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 3 7 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 19 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 3 7 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 29 + + + BICOMP + 37 + + + + + ICCARM + 47 5 0 24 22 46 17 45 2 39 11 6 8 43 + + + BICOMP + 47 5 0 24 22 46 45 2 39 11 6 8 43 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 36 + + + + + ICCARM + 47 5 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 1 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.ewd b/ports/cortex_a7/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..af953994 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.ewp b/ports/cortex_a7/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..b287d3a6 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.ewt b/ports/cortex_a7/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..7bc99f50 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.icf b/ports/cortex_a7/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..31789f29 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 329 + 30 + 30 + 30 + + + <ws> + + + + 14 + 26 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000900259600000200000010860000140000000C81000006000000048600000200000017810000020000000E8100000100000011860000140000004681000003000000E880000002000000 + + + 09000D8400000F84000008840000FFFFFFFF54840000328100001C8100000984000053840000 + 0600048400004C000000068400004E0000000E8400005000000030840000520000000B8100001F0000000D81000021000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000066040000000A000065050000 + 000000004F040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a7\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a7\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 0000000032000000910100004B040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF9101000032000000950100004B0400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000004B040000000A00004F040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000066040000000A000065050000000000004F040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..00e828be --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..7e660a93 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..ddc3572b --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A7" + +"--fpu=VFPv4Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..6bf922a5 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a7/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..4dee51e4 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1632 @@ + + + + + + 20 + 1186 + + + 20 + 889 + 237 + 59 + + + + 124 + 27 + 27 + 27 + + + + + Disassembly + _I0 + + + 500 + 20 + + + 1 + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 140 + 150 + 100 + 100 + + + + + + + + TabID-7073-29966 + Debug Log + Debug-Log + + + + TabID-6551-29976 + Build + Build + + + + 1 + + + + + TabID-17822-29969 + Workspace + Workspace + + + sample_threadx + + + + + 0 + + + + + TabID-28570-29973 + Disassembly + Disassembly + + + + 0 + + + + + TabID-3937-30025 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 0 + 0 + 0 + 0 + 214 + 7621 + 7621 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + + + + -2 + -2 + 486 + 198 + -2 + -2 + 200 + 200 + 160643 + 265604 + 160643 + 648074 + + + + + + + + + + + -2 + -2 + 486 + 198 + -2 + -2 + 200 + 200 + 160643 + 265604 + 160643 + 648074 + + + + + + + + + -2 + 196 + 486 + 420 + 196 + -2 + 200 + 200 + 160643 + 265604 + 179920 + 648074 + + + + + + + + + + + -2 + -2 + 198 + 1247 + -2 + -2 + 1249 + 200 + 1003213 + 265604 + 160643 + 265604 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 150 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 2A0000000900259600000200000010860000140000000C81000006000000048600000200000017810000020000000E8100000300000011860000140000004681000003000000E880000002000000 + + + 1500FFFFFFFF83860000588600002AE10000008200001C8200000182000067860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 250057860000180000002CE1000073000000599200002400000023920000000000005F86000064000000008D00001E00000023E100006D00000007860000280000001D92000011000000198200004500000004860000250000009A860000160000004A81000077000000168200004300000000840000780000002BE1000072000000259200001900000044920000220000001A8600003200000025E100006F0000002F820000460000001F9200001F0000008E8600003B00000022E100006C00000006860000270000002D92000021000000698600003800000018820000440000005586000006000000498100007600000023960000890000000E86000017000000A18600003C000000C386000003000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + EE0700004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFFEA0700004C000000EE0700009A0400000100000002000010040000000100000065F9FFFF01020000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000020062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..03ff9930 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 2693685061 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..ddc3572b --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A7" + +"--fpu=VFPv4Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.crun b/ports/cortex_a7/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.dbgdt b/ports/cortex_a7/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.dnx b/ports/cortex_a7/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a7/iar/example_build/tx.dep b/ports/cortex_a7/iar/example_build/tx.dep new file mode 100644 index 00000000..90ec9672 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.dep @@ -0,0 +1,10516 @@ + + + 4 + 3156940391 + + Debug + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Tx_ti.c + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\txe_thread_info_get.c + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Txe_tt.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Tx_sd.c + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Txe_qc.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + + + [ROOT_NODE] + + + IARCHIVE + 649 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 424 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 573 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 33 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 1131 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 1147 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 618 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 37 35 41 34 42 33 43 39 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 849 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 429 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 552 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 686 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 1058 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 685 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 626 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 851 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 892 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 460 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 586 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 529 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 441 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 1138 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 765 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 880 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 719 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 545 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 567 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 787 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 677 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 525 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 501 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 796 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 537 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 845 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 937 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 871 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 39 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 937 + + + __cstat + 1073 + + + BICOMP + 860 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 596 642 470 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 675 + + + __cstat + 1114 + + + BICOMP + 555 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 + + + BICOMP + 816 596 154 327 962 67 670 433 368 438 642 918 863 473 450 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 771 + + + __cstat + 1085 + + + BICOMP + 738 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 584 + + + __cstat + 976 + + + BICOMP + 983 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 1112 + + + __cstat + 993 + + + BICOMP + 595 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 844 + + + __cstat + 1014 + + + BICOMP + 798 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 + + + BICOMP + 596 918 87 327 642 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 590 + + + __cstat + 1081 + + + BICOMP + 901 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 749 + + + __cstat + 933 + + + BICOMP + 832 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 327 670 48 45 473 67 154 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 871 + + + __cstat + 986 + + + BICOMP + 385 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 65 + + + BICOMP + 962 327 816 596 154 863 433 67 65 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 607 + + + __cstat + 1098 + + + BICOMP + 560 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 135 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 903 + + + __cstat + 1059 + + + BICOMP + 761 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 65 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 782 + + + __cstat + 1000 + + + BICOMP + 576 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 441 + + + __cstat + 1113 + + + BICOMP + 682 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 962 816 596 65 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 429 + + + __cstat + 409 + + + BICOMP + 874 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 65 + + + BICOMP + 863 433 816 45 962 596 67 65 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 912 + + + __cstat + 945 + + + BICOMP + 634 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 962 816 596 102 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 892 + + + __cstat + 1051 + + + BICOMP + 691 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 135 + + + BICOMP + 473 327 438 154 450 67 135 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 578 + + + __cstat + 990 + + + BICOMP + 498 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 327 642 45 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 490 + + + __cstat + 1128 + + + BICOMP + 466 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 135 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 1161 + + + __cstat + 1008 + + + BICOMP + 723 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 327 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 1157 + + + __cstat + 955 + + + BICOMP + 535 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 585 + + + __cstat + 1111 + + + BICOMP + 748 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 567 + + + __cstat + 908 + + + BICOMP + 502 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 135 + + + BICOMP + 473 327 438 154 450 67 135 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 715 + + + __cstat + 940 + + + BICOMP + 769 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 154 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 820 + + + __cstat + 944 + + + BICOMP + 600 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 512 + + + __cstat + 1095 + + + BICOMP + 604 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 962 816 596 102 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 593 + + + __cstat + 888 + + + BICOMP + 711 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 102 + + + BICOMP + 962 327 816 596 154 863 433 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 1110 + + + __cstat + 1045 + + + BICOMP + 648 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 386 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 1153 + + + __cstat + 1102 + + + BICOMP + 533 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 470 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 822 + + + __cstat + 1103 + + + BICOMP + 979 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 327 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 862 + + + __cstat + 904 + + + BICOMP + 714 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 327 45 473 67 154 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 660 + + + __cstat + 1037 + + + BICOMP + 1158 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 486 + + + __cstat + 978 + + + BICOMP + 550 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 426 + + + __cstat + 1038 + + + BICOMP + 476 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 824 + + + __cstat + 985 + + + BICOMP + 960 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 48 + + + BICOMP + 670 327 45 473 67 48 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 636 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 873 + + + __cstat + 1002 + + + BICOMP + 768 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 327 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 807 + + + __cstat + 1071 + + + BICOMP + 754 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 684 + + + __cstat + 973 + + + BICOMP + 459 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 102 + + + BICOMP + 327 863 433 816 45 962 596 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 949 + + + __cstat + 975 + + + BICOMP + 856 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 368 + + + BICOMP + 816 368 863 433 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 406 + + + __cstat + 924 + + + BICOMP + 968 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 102 + + + BICOMP + 327 863 433 816 45 962 596 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 545 + + + __cstat + 1036 + + + BICOMP + 701 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 65 + + + BICOMP + 863 433 65 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 546 + + + __cstat + 1101 + + + BICOMP + 801 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 327 438 45 450 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 683 + + + __cstat + 1041 + + + BICOMP + 793 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 45 + + + BICOMP + 596 45 642 87 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 823 + + + __cstat + 1043 + + + BICOMP + 514 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 473 48 670 67 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 1132 + + + __cstat + 932 + + + BICOMP + 492 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 1146 + + + __cstat + 922 + + + BICOMP + 989 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 536 + + + __cstat + 1119 + + + BICOMP + 494 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 919 + + + __cstat + 996 + + + BICOMP + 647 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 854 + + + __cstat + 1087 + + + BICOMP + 700 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 386 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 391 + + + __cstat + 1019 + + + BICOMP + 676 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 327 433 102 816 45 962 596 67 154 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 436 + + + __cstat + 965 + + + BICOMP + 741 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 65 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 612 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 484 + + + __cstat + 966 + + + BICOMP + 708 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 473 48 670 67 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 442 + + + __cstat + 1015 + + + BICOMP + 488 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 842 + + + __cstat + 1030 + + + BICOMP + 509 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 608 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 475 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 796 + + + __cstat + 1066 + + + BICOMP + 927 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 135 + + + BICOMP + 473 450 135 45 438 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 783 + + + __cstat + 1020 + + + BICOMP + 521 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 818 + + + __cstat + 1118 + + + BICOMP + 443 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 135 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 561 + + + __cstat + 1029 + + + BICOMP + 980 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 792 + + + __cstat + 951 + + + BICOMP + 747 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 327 450 154 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 705 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 762 + + + __cstat + 1072 + + + BICOMP + 456 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 386 + + + BICOMP + 596 327 642 154 918 67 386 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 587 + + + __cstat + 1053 + + + BICOMP + 505 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 596 918 87 642 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 917 + + + __cstat + 1144 + + + BICOMP + 666 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 478 + + + __cstat + 929 + + + BICOMP + 909 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 969 + + + __cstat + 1076 + + + BICOMP + 485 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 386 + + + BICOMP + 596 327 642 154 918 67 386 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 1133 + + + __cstat + 1096 + + + BICOMP + 563 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 470 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 610 + + + __cstat + 1100 + + + BICOMP + 694 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 386 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 728 + + + __cstat + 1021 + + + BICOMP + 803 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 568 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 765 + + + __cstat + 1026 + + + BICOMP + 772 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 962 816 596 65 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 1145 + + + __cstat + 1075 + + + BICOMP + 889 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 470 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 740 + + + __cstat + 1069 + + + BICOMP + 953 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 621 + + + __cstat + 1001 + + + BICOMP + 900 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 596 918 87 642 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 673 + + + __cstat + 1024 + + + BICOMP + 811 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 719 + + + __cstat + 402 + + + BICOMP + 819 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 65 + + + BICOMP + 863 433 816 45 962 596 67 65 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 750 + + + __cstat + 1091 + + + BICOMP + 722 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 627 + + + __cstat + 947 + + + BICOMP + 571 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 596 642 386 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 790 + + + __cstat + 1047 + + + BICOMP + 495 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 135 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 551 + + + __cstat + 977 + + + BICOMP + 534 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 615 + + + __cstat + 1057 + + + BICOMP + 668 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 702 + + + __cstat + 1084 + + + BICOMP + 1046 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 368 + + + BICOMP + 816 368 863 433 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 626 + + + __cstat + 958 + + + BICOMP + 687 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 470 + + + BICOMP + 470 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 525 + + + __cstat + 1064 + + + BICOMP + 739 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 135 + + + BICOMP + 473 450 45 438 67 135 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 964 + + + __cstat + 997 + + + BICOMP + 468 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 65 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 501 + + + __cstat + 1027 + + + BICOMP + 848 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 65 + + + BICOMP + 962 327 816 596 154 863 433 67 65 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 592 + + + __cstat + 1089 + + + BICOMP + 541 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 327 438 45 450 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 773 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 981 + + + __cstat + 1025 + + + BICOMP + 630 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 154 + + + BICOMP + 596 154 327 642 45 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 678 + + + __cstat + 1107 + + + BICOMP + 1010 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 836 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 624 + + + __cstat + 956 + + + BICOMP + 515 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 102 + + + BICOMP + 863 433 327 816 45 962 596 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 1109 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 38 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 905 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 589 + + + __cstat + 1094 + + + BICOMP + 469 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 48 + + + BICOMP + 473 154 327 670 67 48 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 481 + + + __cstat + 971 + + + BICOMP + 407 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 565 + + + __cstat + 943 + + + BICOMP + 646 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 473 48 670 67 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 496 + + + __cstat + 1061 + + + BICOMP + 656 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 596 918 154 642 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 644 + + + __cstat + 998 + + + BICOMP + 746 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 327 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 566 + + + __cstat + 1121 + + + BICOMP + 458 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 962 816 596 102 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 787 + + + __cstat + 1079 + + + BICOMP + 569 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 470 + + + BICOMP + 327 596 918 45 642 67 470 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 757 + + + __cstat + 1005 + + + BICOMP + 696 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 573 + + + __cstat + 939 + + + BICOMP + 1040 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 470 + + + BICOMP + 327 596 918 45 642 67 470 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 724 + + + __cstat + 1151 + + + BICOMP + 403 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 448 + + + __cstat + 1116 + + + BICOMP + 633 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 526 + + + __cstat + 1042 + + + BICOMP + 594 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 470 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 697 + + + __cstat + 887 + + + BICOMP + 923 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 596 642 386 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 712 + + + __cstat + 896 + + + BICOMP + 987 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 596 918 154 327 642 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 425 + + + __cstat + 890 + + + BICOMP + 672 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 327 450 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 845 + + + __cstat + 404 + + + BICOMP + 781 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 65 + + + BICOMP + 863 433 65 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 726 + + + __cstat + 1028 + + + BICOMP + 544 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 751 + + + __cstat + 926 + + + BICOMP + 655 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 154 + + + BICOMP + 596 154 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 1123 + + + __cstat + 999 + + + BICOMP + 452 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 930 + + + __cstat + 897 + + + BICOMP + 518 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 671 + + + __cstat + 914 + + + BICOMP + 528 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 48 + + + BICOMP + 670 45 473 67 48 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 590 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 484 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 921 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 38 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 842 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 406 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 824 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 725 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 969 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 163 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 782 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 486 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 1132 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 855 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 684 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 862 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 827 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 627 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 442 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 697 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 762 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 589 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 585 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 1154 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 823 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 565 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 736 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 671 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 749 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 1157 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 391 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 911 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 593 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 34 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 532 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 608 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 760 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 425 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 510 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 568 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 836 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 912 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 522 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 512 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 822 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 675 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 606 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 660 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 546 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 478 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 820 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 718 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 804 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 1146 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 539 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 624 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 724 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 702 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 37 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 475 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 536 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 905 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 592 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 566 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 949 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 37 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 917 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 496 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 919 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 705 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 678 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 612 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 852 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 792 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 636 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 673 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 783 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 807 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 1142 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 561 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 551 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 728 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 587 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 578 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 1161 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 712 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 644 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 873 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 637 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 621 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 683 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 813 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 764 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 844 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 857 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 981 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 751 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 771 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 523 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 1150 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 1145 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 490 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 526 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 651 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 1153 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 988 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 1112 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 436 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 841 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 876 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 370 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 818 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 615 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 584 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 794 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 964 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 790 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 607 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 1133 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 740 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 903 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 750 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 481 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 715 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 426 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 681 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 663 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 931 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 1134 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 726 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 547 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 611 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 809 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 1035 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 532 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 606 + + + __cstat + 884 + + + BICOMP + 713 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 522 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 548 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 677 + + + __cstat + 493 + + + BICOMP + 1135 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 65 + + + BICOMP + 863 433 65 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 663 + + + __cstat + 934 + + + BICOMP + 530 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 760 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 851 + + + __cstat + 449 + + + BICOMP + 553 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 962 816 596 65 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 637 + + + __cstat + 1031 + + + BICOMP + 640 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 764 + + + __cstat + 1060 + + + BICOMP + 879 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 804 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 524 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 838 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 1142 + + + __cstat + 891 + + + BICOMP + 970 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 327 450 154 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 510 + + + __cstat + 948 + + + BICOMP + 447 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 327 918 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 857 + + + __cstat + 1050 + + + BICOMP + 992 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 327 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 831 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 539 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 609 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 580 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 852 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 813 + + + __cstat + 1018 + + + BICOMP + 847 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 794 + + + __cstat + 1065 + + + BICOMP + 538 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 135 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 718 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 855 + + + __cstat + 995 + + + BICOMP + 727 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 48 + + + BICOMP + 670 45 473 67 48 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 988 + + + __cstat + 1016 + + + BICOMP + 457 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 470 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 1110 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 1125 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 785 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 967 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 1159 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 610 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 854 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 577 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 363 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 1123 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 635 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 837 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 448 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 885 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 465 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 777 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 861 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 930 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 487 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 788 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 543 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 574 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 833 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 625 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 735 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 499 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 430 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 707 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 643 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 757 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 721 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 537 + + + __cstat + 938 + + + BICOMP + 843 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 470 + + + BICOMP + 327 470 596 918 45 642 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 885 + + + __cstat + 1106 + + + BICOMP + 516 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 1131 + + + __cstat + 1004 + + + BICOMP + 1136 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 386 + + + BICOMP + 473 154 438 67 450 368 386 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 911 + + + __cstat + 946 + + + BICOMP + 774 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 386 + + + BICOMP + 596 918 45 642 67 386 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 1154 + + + __cstat + 895 + + + BICOMP + 742 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 327 642 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 921 + + + __cstat + 1080 + + + BICOMP + 628 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 45 386 + + + BICOMP + 386 596 918 154 642 67 45 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 1138 + + + __cstat + 517 + + + BICOMP + 491 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 473 438 135 450 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 849 + + + __cstat + 928 + + + BICOMP + 894 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 473 438 135 450 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 529 + + + __cstat + 991 + + + BICOMP + 679 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 473 438 135 450 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 685 + + + __cstat + 1099 + + + BICOMP + 591 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 470 + + + BICOMP + 470 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 163 + + + __cstat + 1067 + + + BICOMP + 835 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 596 642 386 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 686 + + + __cstat + 910 + + + BICOMP + 853 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 135 + + + BICOMP + 473 450 135 45 438 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 880 + + + __cstat + 1012 + + + BICOMP + 1048 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 135 + + + BICOMP + 473 438 154 327 450 67 135 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 586 + + + __cstat + 886 + + + BICOMP + 617 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 470 + + + BICOMP + 327 596 918 45 642 67 470 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 721 + + + __cstat + 1032 + + + BICOMP + 817 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 424 + + + __cstat + 882 + + + BICOMP + 489 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 596 642 470 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 552 + + + __cstat + 972 + + + BICOMP + 583 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 135 + + + BICOMP + 473 450 45 438 67 135 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 618 + + + __cstat + 982 + + + BICOMP + 654 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 368 154 87 102 48 470 386 65 135 + + + BICOMP + 102 670 65 45 154 470 327 473 67 368 87 48 386 135 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 370 + + + __cstat + 872 + + + BICOMP + 859 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 135 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 725 + + + __cstat + 957 + + + BICOMP + 508 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 827 + + + __cstat + 952 + + + BICOMP + 454 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 + + + BICOMP + 816 596 962 368 863 433 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 1147 + + + __cstat + 1022 + + + BICOMP + 1033 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 596 642 470 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 460 + + + __cstat + 1122 + + + BICOMP + 1124 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 470 + + + BICOMP + 596 642 154 918 67 470 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 465 + + + __cstat + 1120 + + + BICOMP + 639 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 580 + + + __cstat + 959 + + + BICOMP + 507 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 788 + + + __cstat + 1148 + + + BICOMP + 775 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 625 + + + __cstat + 1090 + + + BICOMP + 540 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 386 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 643 + + + __cstat + 984 + + + BICOMP + 631 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 609 + + + __cstat + 1063 + + + BICOMP + 431 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 707 + + + __cstat + 877 + + + BICOMP + 556 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 833 + + + __cstat + 1117 + + + BICOMP + 1141 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 651 + + + __cstat + 942 + + + BICOMP + 704 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 809 + + + __cstat + 941 + + + BICOMP + 935 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 635 + + + __cstat + 1056 + + + BICOMP + 652 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 386 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 547 + + + __cstat + 916 + + + BICOMP + 1127 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 785 + + + __cstat + 1078 + + + BICOMP + 387 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 577 + + + __cstat + 1152 + + + BICOMP + 497 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 841 + + + __cstat + 1052 + + + BICOMP + 850 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 65 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 681 + + + __cstat + 1092 + + + BICOMP + 732 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 931 + + + __cstat + 1097 + + + BICOMP + 834 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 1125 + + + __cstat + 1044 + + + BICOMP + 1143 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 523 + + + __cstat + 878 + + + BICOMP + 554 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 65 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 1150 + + + __cstat + 881 + + + BICOMP + 756 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 470 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 430 + + + __cstat + 1007 + + + BICOMP + 815 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 102 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 487 + + + __cstat + 1115 + + + BICOMP + 840 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 1058 + + + __cstat + 1011 + + + BICOMP + 812 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 135 + + + BICOMP + 473 450 135 45 327 438 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 831 + + + __cstat + 1034 + + + BICOMP + 766 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 363 + + + __cstat + 1088 + + + BICOMP + 716 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 1159 + + + __cstat + 1068 + + + BICOMP + 588 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 861 + + + __cstat + 1003 + + + BICOMP + 1006 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 102 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 67 327 791 693 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 611 + + + __cstat + 1077 + + + BICOMP + 767 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 735 + + + __cstat + 1108 + + + BICOMP + 599 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 967 + + + __cstat + 1086 + + + BICOMP + 601 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 838 + + + __cstat + 1105 + + + BICOMP + 689 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 837 + + + __cstat + 950 + + + BICOMP + 632 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 1035 + + + __cstat + 780 + + + BICOMP + 688 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 548 + + + __cstat + 907 + + + BICOMP + 828 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 543 + + + __cstat + 1054 + + + BICOMP + 720 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 499 + + + __cstat + 883 + + + BICOMP + 384 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 87 154 48 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 876 + + + __cstat + 869 + + + BICOMP + 899 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 65 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 574 + + + __cstat + 1093 + + + BICOMP + 645 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 102 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 67 327 564 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 777 + + + __cstat + 1082 + + + BICOMP + 778 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 386 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 524 + + + __cstat + 1070 + + + BICOMP + 500 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 736 + + + __cstat + 954 + + + BICOMP + 1049 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 473 87 450 368 438 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 1134 + + + __cstat + 1009 + + + BICOMP + 755 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 67 327 1039 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 67 327 602 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 67 327 605 693 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 67 327 791 693 605 1039 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 67 327 830 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 67 327 693 791 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 67 327 791 693 605 564 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 67 327 693 527 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 67 327 791 693 605 527 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 67 327 791 693 605 564 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 871 501 719 845 429 765 441 851 677 545 892 567 525 796 552 529 1138 849 686 880 1058 460 787 685 537 586 937 424 1147 626 573 1131 618 736 827 969 921 725 1154 911 627 697 163 442 762 842 589 855 585 1157 862 671 823 565 484 486 749 782 824 391 593 406 590 1132 684 512 912 566 820 660 624 905 522 949 1146 546 718 836 804 532 822 536 675 773 568 539 608 760 606 724 592 425 510 478 702 475 807 678 857 636 917 1142 561 792 981 612 751 783 683 551 712 852 673 771 728 587 578 1161 644 873 844 637 496 705 621 813 764 919 750 481 740 615 426 584 651 715 681 1112 663 931 1134 964 436 841 876 523 903 370 490 818 794 790 607 1150 1133 1145 526 1153 988 610 854 1110 635 777 625 499 577 930 837 1159 465 788 735 543 448 574 861 430 885 707 363 487 785 643 833 967 757 721 1125 1123 609 547 831 726 611 548 524 809 838 1035 580 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 67 327 693 605 791 1140 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 67 327 791 693 605 830 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 67 327 527 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 67 327 605 693 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 67 327 791 693 605 527 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 67 327 602 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 67 327 791 693 605 830 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 67 327 791 693 605 1140 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 67 327 602 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 67 327 1140 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 67 327 791 693 605 1140 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 67 327 527 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 67 327 791 693 605 1039 602 527 830 564 1140 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 67 327 830 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 67 327 564 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 67 327 693 527 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 67 327 693 791 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 67 327 791 693 605 602 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 67 327 830 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 67 327 605 693 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 67 327 1140 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 67 327 1039 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 67 327 791 693 605 564 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a7/iar/example_build/tx.ewd b/ports/cortex_a7/iar/example_build/tx.ewd new file mode 100644 index 00000000..4173bf74 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a7/iar/example_build/tx.ewp b/ports/cortex_a7/iar/example_build/tx.ewp new file mode 100644 index 00000000..ef9fb474 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.ewp @@ -0,0 +1,2763 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a7/iar/example_build/tx.ewt b/ports/cortex_a7/iar/example_build/tx.ewt new file mode 100644 index 00000000..d903833d --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.ewt @@ -0,0 +1,3424 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a7/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a7/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..c8eabf0c --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a7/iar/inc/tx_port.h b/ports/cortex_a7/iar/inc/tx_port.h new file mode 100644 index 00000000..73ea8e18 --- /dev/null +++ b/ports/cortex_a7/iar/inc/tx_port.h @@ -0,0 +1,393 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A7/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A7/IAR Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + diff --git a/ports/cortex_a7/iar/readme_threadx.txt b/ports/cortex_a7/iar/readme_threadx.txt new file mode 100644 index 00000000..0b12c22c --- /dev/null +++ b/ports/cortex_a7/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A7 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A7 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A7 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A7 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A7 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A7 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A7 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A7 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A7 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a7/iar/src/tx_iar.c b/ports/cortex_a7/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a7/iar/src/tx_thread_context_restore.s b/ports/cortex_a7/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..559c05bf --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_context_save.s b/ports/cortex_a7/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..0751e98a --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..03fb04b5 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,270 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..339e227b --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..87088021 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..671cb6f9 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a7/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..61d091d0 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..27911f58 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..80028df8 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..72b794b6 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..ceed092b --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_schedule.s b/ports/cortex_a7/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..fb11bd10 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_schedule.s @@ -0,0 +1,239 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_stack_build.s b/ports/cortex_a7/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..2ed9f538 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A7 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_system_return.s b/ports/cortex_a7/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..09d927db --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_system_return.s @@ -0,0 +1,162 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..e73b7385 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a7/iar/src/tx_timer_interrupt.s b/ports/cortex_a7/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..1603243f --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_a8/ac5/example_build/build_threadx.bat b/ports/cortex_a8/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..6cfc7e66 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a8/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a8/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..34540967 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a8.no_neon -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a8/ac5/example_build/sample_threadx.c b/ports/cortex_a8/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..580d5042 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A8 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a8/ac5/inc/tx_port.h b/ports/cortex_a8/ac5/inc/tx_port.h new file mode 100644 index 00000000..4fb4e180 --- /dev/null +++ b/ports/cortex_a8/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A8/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A8/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a8/ac5/readme_threadx.txt b/ports/cortex_a8/ac5/readme_threadx.txt new file mode 100644 index 00000000..ac883521 --- /dev/null +++ b/ports/cortex_a8/ac5/readme_threadx.txt @@ -0,0 +1,547 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A8 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A8 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A8 Specifies Cortex-A8 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A8 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A8 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A8 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A8 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A8 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A8 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a8/ac5/src/tx_thread_context_restore.s b/ports/cortex_a8/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..905651b4 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_context_save.s b/ports/cortex_a8/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..ff1d228f --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..f41ee539 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore + +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..e31b7ef3 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..a1204696 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..f2fbf4f9 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..c743a36d --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..02439931 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..9d328f1c --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..1999adc1 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..5e1071aa --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_schedule.s b/ports/cortex_a8/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..0e888c7e --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_stack_build.s b/ports/cortex_a8/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..7f7975f2 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A8 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_system_return.s b/ports/cortex_a8/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..3812aa90 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..342e8ba7 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_timer_interrupt.s b/ports/cortex_a8/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..b71d49b7 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a8/gnu/example_build/build_threadx.bat b/ports/cortex_a8/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..a37a3eab --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a8/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a8/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..aa8c8006 --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a8 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a8/gnu/example_build/crt0.S b/ports/cortex_a8/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a8/gnu/example_build/libc.a b/ports/cortex_a8/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 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

Q>dP6leU^u3WJIStz4({jFOv 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 z%0D}GII883;Y-UubND6ta(3!d3_tv544*yxGy3wJ;ZV6S!BsHgdc;7m_va0-T2rGv zXAQ425p!{EB0fF*QqLbJ$~vQ{Zi(lYkpJ*Y!BSlL7oZQ>Q1mAvM*I=-v_F>>c~sb@ z-HA3+L`1`ANzlJn=&+nStfCs%?5|#DY>MV=ii$slPDU(vgg0#Vi*p?Bt$y)3u<`FD z^YDg7znB(}rPrT3Y~@9$?Y(b_xNUywUFK|(jCOg$t0oxVPWX;Az9#sPQKfv#8(zI+ zk@EUy4@XNyjDJq*6t+ft7CYQu^HQj;VeyKW`UeKX|6}i4z^o|Fw7XBAVGhg)qc9N_ zH(^~ml%DmHz06>jDg4u3@+-_<#izUp*z(#){>lk$sELI5 zxL(#jxUtup&}~CvH_lC773SbCPp%JhN5{bhcu7nf+?bwFj|^0pJfWcz7gwd^gbEl3 zmdn2;xrE94Sh(1Y<0hcL{8akd@(Jj&ub3`7c0w&GDuTZvxt1-b!i2WgjxgGo32n`2 zVNFyp0sY)WTQdPndH-k9F;?CjUv+bQ0_0a^&F4oZcB8H2xOgou!8;p5+Iz zO_-PzU&6TtF5!Ep$=w&aaHzfVOO~H3ymHw@;cgw zMc*mGg{3s?dqF8I3YU~EOk?5K8R^uFDaWQ~1;wRzl^qKqb>`Gm#pT=qG{|2RY%HCY z4lY9c(z4XTR9WJ~XQqO$Ue=hJo@#2oYwt+u^AjJ&4x)|0^hLpv(jZlOCKInH4W^dP zn!RM=!I!8Vmz&EaqzWxY4GoV*Z9J1(}R-I9f^}3O*5oqdTjb=oGx)r za|tXGr+<_xS)5JB znENAIZ(fLI#$KxdEIl7t8niD;rFSG=t8F&f2j98$ktL`|u&EJ$y?)|po}(g_hW+QJ z>E}-^nL52BolY;FQJ*d;NiCedEmd+R%9AQwdoz7#IZV7&SY2tw&l{7VPeQaUL8J|g|6DK83Y6|W|=odfwM(_)7%eG&mnrHs= z)ZkD4mb>o2RVzV@1iwQ!{QjknBtD7a;hMqp^`hV_{tqj7`jXTYOJ@cbFDeU?uw>oX z6nq7BOa-G$Pd`6+hB#FaSq21k88M@cz7O(M|Kq{ zouHf3k+p6@<^C2w`wfahOKVG88tahc@lmzDp&bj98rzNOUc0!ep{=2-siD2@q666c zHd^YJwHPXUL05NYLtRx}O?SgUd*fEM);7v=t=5J{*o19r#kL%00gsY)GX)O54Qmn3y4ej++$8$#*T|>u|%^lbi2J5pLv)1-i)pc~NYiW>t z7%t2IWC^M<2W{4PwRBh2ZK}ZvFs@`Xi_owgl3n#?7x8s8Hg@CfTHjFDx!#jvz=yTs zS~oP1T{wnn!e*Y8bj_Jry4J`GRMVO z{0>_5Uf-6v=P+LOW$@lu*IbKLZLJ-+95lvEi+y`$|<$4Q-ur1;Q13C*ywRp9hUO7 z$wEFcDJTW6x~QS1%UcIq%nc0YdOWlpFP$v(GiJ24$zemVg{%J}^XlyPW!^@#8(IxJ z2AFbqy5co52Ocd@tnKLP>Og5KmY%w}YT0S0u2^>V!j-30E$8*EsrOnq4y>!`>bfYr z|LPlB(KKN*m@X&n6m3*(7G2iYAXQbjEDWqVePP9ElnnAF)WwEvwN5XH)+}Z(K6FB2>WwysTz5iznHZV)DGIv9qJw?pkd-F*;a# zhuModTuF(|OS!0#*8s~R8*94PS2fnOv|^g z1lU2Z$1)mg1V3Z(vaN6(u5nWb8+=3ihVF)XSq++HeZ3K9$6c`=rAFp*v)0zK!&SA; zo>?On?hkAzhAg@3gs|svC!u?*m3(xex^=u2+vReaqM1f%>8@uLWtHgqmbM0CU_W!A zE7zG~Gjnb-ZyJ()<8O0o?+!j1O0m$htaPSV+SSlnTHjE+0qxXP)7Id6bZ)3^hgY}j zSA&koIvQSXlUs!eVmb#W4ZP zmAzhcB?c;AjRp*1nU)}~o8P8WOnTcYP@=_URvRzm& zww;?_^>O$hXfr{Wa|kJNuK&BSu9Vl5j^pSUO2umtIkz;d&j_sT#5zOU=`{X}j?C}} z!|P@8+vCU#--!{paVC5WJE%Bc^54XZp)$*Jiz74rbE+ZEZpA=)x=G3ZKzgbxXVxz8 z!i*(SAZK^ukCy&veRy4qtN^5ZY?gd{mV8>4yevzu%92~NWSJzXAJ4ZvEBupL@;zBH zKls@>(jmBBk7kAUX35{mlAq6#U(S+W%aVVUCI2Z)&T+aF>vK?+%r&vrF`QZ;>nI0b#_2dEC#u=EoHaWVFxhlSr4J%f>3Ok&OwwhwOwyUR4R0DzzE-lU~C-;(_1c% z1Y{@nGc*;%CX8TgI&M@S3Jk+oODCUI_0w^Jc^pY2iaWi`9t6(Q$w&(mbarfAN^K2ob)5)rZb{3K&hskJhT||HWA|9Mvqs#E^>VLcX-%Fh6dA-C*xJQYI_aYJbkHs@$ zT#d|0MEKuJM0p=lxtECgzDYzoB=DeQ`O6i#*oEo#5RbyM z01teYlWR_i^A*<<5$^^f+JQECdHx59Xs?HfIPX(L#QQN3=Np4M^89Hc%1N8NOkaR! zCF^?waNIP=`M?r-ijUIVxn3ip-*T)OL*K<^f^|Q%H!)_$gv7CwF@{A^1yM9XWF>f_;ylHLisvde zD{fP~M)5Yqdlmml@kzz+D88WBr}(;J!Z+s^TLvg!vC3-{YZb+o0m3g;S!@|VzD?zO z6~&eT{GU=;Y#BhNGMx1nTLwU}WdO`W+t6QZ834tW0g&o{`invySf}y@ie#HG{PT)p z%K)<2G64QW{qynslKd6LmI1=WmH|*~836g5WIVBD0OWI$@26k7&Bv1I@hTLwU} zWdPi&>BW`-ct8-%upW zm**eJ_X}{m;(3Z~ivOtinBt!lr{TfHbXO=|M?`sUQu$LV->LFvRlZ;4FRA=BmH$QM zXB7WK{ePhH3o7qYIlz00=bxzfQ9dtlemq{i82;q>33;x{gJpjALXEHd|UiIx*Yj$1V zH1NdJkg;a>m0{pnTb_SD`0E7-C%=8{bJxApS*|t^aDopw)d#?-9*E{VE|WPuK9lvl zx6Szu-l*m}qbp)yBFCQhBS?M;LSkRVUqoyE4Z`Dw*35SyXwByWKx;l5Zwi>6pNMcn zYlhAFnGga)YyKp18NlYeo&gq;amvJquOU$aHs|kQ;*i$7jM5~Q4m3GWtjHRh^YP)# z+0vRv@_i#V=VN5xsm=Ls;gB}x<*n$_nqwiY`8#~kg|y}>W}{Mm-drba=r-qRi=Q^< z<&_`Onx~<)Vj-=$2xX6jwB{!1M*_WGEKo>mzMtpFrZtm}9*bzrUqhV!ZO%_N9f`E&*nLJw|Ux^xf zv^h@#F>KD8x_gD4Yzb>sK3;eTL#>!7EajE3Vt(OlMviFBFS0QroAVnPIifXhWaNm} zj2Am@F+J~`!n+wcvN=DFkt3V)>litrHLqc4L~EYUYZB3#|Cf;?TJs)OA)+Y;d|Sh=hA|hLu-Bj(ZuGwJOCnEb1vgWv}T&D z+?UPyKckhz=KOEjToJALlS~)Unr~*I2DUjLli84CbABRoi)hUIOKYah zdETqm=KNw7@*SczA8{52IsR7E66WQP!%68llz@48utD<}JZ$;R@fA16$M2wb9^2ku zHvV5xC>72g{~!|jd8?V#S>w5CK!vsAgovAWo`m4FfJBM7OQbxqn=KR?sGm;BJCy(L zTUMle@0N+lTe47}Dk)u@*bqyQmbDiL3!fQ7$E!JiWWj=wldt!$h+Q6R!^Jubez;6< z-MBPluvW=8ZSi7a6R7N^Z?7r zF!T_IITF%}s+3101fQB#!zzdf362qZU|$wck!0{h zXuqAhkTLk-RTc6?IESiE)8NqCgzu@d9S?iB1YvG|v>VU#%#UdE ztHrTRgG28@d>>`qth4QW9z5Lq-b8-3o$)C+%&!~AZhkO!BswUYpAGBC$}f&_fGr=A zg!x^Wl^@r*B;jYB&2K9_-15<`y)7S9i(!72e`M=89@E6fZ6y(p`SEv`B0$`KLEksW z3P5|_`*Dmu)oFu9<6AA%e4(@PkUZ>D3@k&uN5WW9evEI1Lnd%7h(c+2lJ~^=u&6}V z)%Il^de@@Al<+{EJ+GB5y8iD5Ux?Q-a)!TC8G5*-VSU(>BKLOKp+_@|?c?0+6yhUbf^A@-HG5hBG)q^m6>h;o`DRF`P{F1JHf3-UI4o(dR@j3!KDwz_g<1 zWg*W~d7+}{W#Qkf@;1e56mL_!SMi?|pH!47H`2eLa-ZVsilUcAxaehp^4S6?dRd_8 zWq}{qm^at!0~_8lSp`u8WeVEITtf zJ)NF)!Hkl!Dc&g@rU~H1h=Z;(XuN5fA3z-Qv*)6RJ*MKr9@Bpo{~Tw-PKTd8 zW-#ON-D8~%TLuq%%rMIRjdwl*e|NldHDveukIf@{yz@E4<41PuY&;@vhtP4`;2uaA z*2-vLpz+QvCH#dYIeL0@Kd6%F3#>=JYp3#2#8)Llmcl*$$uj2S+KmDsdzkL2nVrkP`J{s18zug3j zb-0Qn&H$pV@H|{jYkn`#lCX&jOL9p2C&WdKUX5X=2V;#77DB7P@p1`vH9*<>rlx!D z_Ig{tjJOZscTXKGvjecVO0=ik4@aNlljJ;sMxtc z;`Bgn_j1`+yW>6F z86XNjB`Z8B3kW{dXDxUK1t=fNHV)Ps$?(`b{5lxB{L9bB;o5k~TcLcY#PzCu34Qih zKm8o8$5StlOBzdqF@&M~C*;ENG48nga|>!vZ(M_dvrzY^UWSFo!)YPWOFz{&0%a{m z{q61!o)?t?mNR$%1np3L!w%H@Q?N{bLtjz)O7xXww2u0M2TT6T%Wv*`0&$9au6$`Z ztbxJ;U}%ZaD@QwdJwB{ejxcez_Eq+5?c0-K70_CN-t({Q<$JaDX5@i(j#Z}1a__V;}FC3?V)L4S%@8-@(qj_nqgYn0V)urP1i zZJ4)0+HF{6gK4+Q6??Ut?`5{z0^3HgJ{yDeN4I^RM}7SVw@CZYiZ-uf4zFLiX`k2J z_IWUBAGSqMjk;I%?3#xD=k@gL+M)f%_A}_^85^I zbka@8O4ovG#eQbfuy6Aj#p@=|DD-jrjN)~Rcbe-}jQ$)wpO)?NdV6-^jfKAS9O`?v zJZtc7gMLC{~^A3ll-Qk;ie6(4B_;EZJ@jSzM3mAWuSfBP`jry*WNAJYL zZ$#QdILhEBKZbHd;h#ac?>+r8Ez`2Bzmfa#MSZqDje9vNJJQLsmDXXwx)AHA%nSFm zsfW~&Rz9CL&sCJkOFu2vIHx)Hwcm@j=%qz=SW9)T1$P1R#$NZcb^q@#KmQfl$qnQE zbqo9wh@X#myw=#Y=T+XPj@w*v>bRf3H2d(Ajo+S=_nczhOAB`Xr0=xeB`^8aJ-f=w z@93+j#O^StLq2v0ISSAJ3S5ls_%-9V`mgYF&tFh}-7AU8>-wgk9mufbJ7Lc$mQ9Ce zetA#em7~Az#EuDw7e_y3dtg@zS}QjF8SjSdKAnU9;&1L5&3-M~zSk8WqK8R)kuHBu(J`T&Ze)@@*`Hu9{d(a=w-i@7*4rh3N63;&NiAwg#dD8Fw z$|qh9dhy&u7~jvu>FbbYwf1Xs4`FBl5^d!!)2E+6x8kk{J>U1S%LDuO1F1vsZhhiq z>CffJdnc}E@>=A7UfAEIKbJr8GR7dgev9(3PxBs)$ynhD^yfW&Ovmyfo%Cm>5Bso$ zoriKi;q>7r`fg`mL%Z;Lu+46jz6Yz`2m1xX4#EFXBS+^2_#PN5hSkx$ypu4@3~-n* zhw%@r#d?PuTeL7P=30b3*gwQC#}yqKt8oBpv3a-vhhRWHaUjm5Ycn>-HA7pZ>`7Se z<)pbdG73xaD78DQp+_t8QpIEP{1q5SO&;%;jW*|>lH-+Of_p51>8H-rgK2J+ljs{I znw8k@E!9GZkkTTEkk$f-P!<*LRQq=hS`c0P%dliDc@5&EZgK8^e>nKP015E57^Uo4qgY3S6>|3x08 zc77Y}6AP)GQ&HN8+W7~Dh1AaJcq~TL&K)R!MD3*Qu87+CYnC>oc2-jgsh$7JGh|Xb z`2kg^o#<;`MD6@C(?u3*&tk%e+Ia@sU=V8Oy(pDXJEdhqYUdryIHY#|BQpxAo$@hv zzo?z(BR5hzf6c;&)Xw{uYc{p>|9Ikv+PMkheo#BhnPo`ryqC=}0JZZT7A2&1%6I99 zo~2*WxV&HTN`=(Ujg&%a=j$wANbTf}7klKhJWtWIk=QBRi~S2}Rlacxk7nK>wR0V%?>-@C0JU=^3pzNp zlPe+LThvaj)f8&y!K`{j?feYuZpoYR!Y?w^iitv@@mevzkj5VzYA4sjJJilgm^Pwz zeuj}FYUhJ&$cWncI71_9=W2#V)XwEBRYdKSg-;Q+la@gpYG*FRh}uaroDQ|Kk)aW_ zlXoV_@|yuc(bKWQHLQa}?ffPy;ZQq^n43fG3@GnS?Yw~1aj2anPYbnE9sm)wa~e+{ zQ9CP{Y#$bDsRb2kr;s8eYNxDli>RGKeccDO^LU=sp>_(%F`{|dcC>>O(6R)#y&PE2ewsGXNk-WRp=Iz-qXYUiyia769=Z=U}^sGYo5Ew%H1 zSm}3&+8Jv^31Or5Nt7EFYjbcaNV`yLf7lV<#W%jgalQOcArfY9_y^-t%(31y8ShKK zavUxD_&1Rg>aQ4o9wXdDqM#aQ9X|uv`ZvkL`Nlcp>zM6LA7hly4^VSNXJ?xchq#8BrB5tb+Sz>iuI z6Xkm*3I?!^7&ZFqdH$aZkCiogo<%&@l)X>N4jL;=h>n*W`y}nE@p9%qNxyo$l-39z z8UJyn?~?*9Kk`3Wz}G}r!-Bsqhn1#Azo38`9oftx|59>3OD%>@;${>+hPIwxirHsbLu)o5a^c;(~h{aiHipQee%06)J(b6H7`qCrTn8GeK zg*7c{3X2G=_Nt?$%PcjgU0o!7VyQ2k;v+{(r!X;t8(;KHaaWnR=NyCdUa{2mLdh(4 zV{x%mcB6_(Q;SWu7Odb!CiPnA>>tIb9v29IUpJLt1vsj=m3Y)tqOxcrBRy(Tt~6D8 z)Kp2W4$ovKLUhJkUL@VzNWqOyd8Sg2no6B#Dy4B(OlBeYErjQt@-&2Fzt3WwHRZo~ zjE#mo|GX)0^7t=2UVZF{gBW}aHI7qh6&AIgO0%)C8Q#R#y&F(*81l zO-b9YX0kLI`W)t(@_AA@OiPcFL$7Qm+C5@$FF@ap8P3A{m%(inMQ?$?eXH+Rrh`q1 z7@%(_f(v9M+$a0gM&&_)22_IeQe2$bj3EBRZVXzS)8gkV|uW# zG5Dr;=OS3^EbWCE+K1D>4~8d_G&@?dc>5h^E=~n4jX~#~!SF|diy9xBR+cIWroJK3 zuc$!$#NP!Q7s0Blja<_h48Jpsd358JvQL*yT|E8r$8gT6uqYcGl6c@huSgVKR)$2k zr<$(%SgJmiDtj!|wDec0&1u*?U6{IS-5sgvOM*u(+Y%Hc=H4C5O{`y(DrpKv#wz@l zVAGbx!F3;fV8ItG!qQ8P+P{uqe7|0dTgaD6E<*Irf z(Xr+xHEu+8_L~L88{j<-XIYLPOJNRwtxD>Jw@Vt7pS<4|QH8Hgvyb~QgW6pKOZd^M12j%H6aGNWpl)obU*9~K z6;w3~Yq2hnB6&?dvJO!ECt~yckru#5zI*>Kfx3n}NdIf}Q1&r-exqHoO z4`&^VLzn-nSwMZ8EuYdBdrP;NoIM~Dr}p_*^%hN?Mn+EGf`QWR^)+3xg2^?tOf#jO zT{NHDpx78bssGmPmcFG01@C~_QW$8G0la;Ak?Hh%3}CIZhh%}_0#gBOp7LROT=5HPIBKslU-s$(n7Eeo%#Zol{AzJ*(=diDfhAOO^bv7(}b-}Yv`8dwA<+~EcHVyMQ5BVi|pw5PE zh3sC^=aF9l{8+yJRu^b;?^5JfZUvyt?;btob*6h9@#f-sSjTw${iCAw|Kr5|S$Pj5 z0{T>^jW>PL&{iQ-BHq(B5zv;87<2p|JlgX%!-HRGc~7wYSbw&O?aMgy(o-F$Z0AP|w=YtBm9VeaVq^JJ zZEJ#XEQT+w8BSQ<+}lWJIEH|EdRqI(h7eWGu-s0oT=Sid;ZWKUrR8)pWHaVFTRWP{ zuvdi4yyl|JwD`9g#iixOdx)UwK1DndJU1f3`DJ)q5|-Y8v5ELZgLa@lw*aI+`yu_~ zxJ{UTF0lyLgIJ7yNW}fjmD!Ygh=}(h5&3kYAM*UYz!=W)l;YEh&niBr_`Kqe6<<`` zsra(uD~e)~4f*a-`Ax;&E7I~N&r9+wF|L?U%vUT>9HTf^ahzgOu~>1k;xxsy;!MRk zigOjq73V81P}~fp1`S5a2}!2d~=W#td#7gX+3d|fete#Lx5!wM``Syui)mX$w1S@{FJRKu@T zyiM_5#jh!{-!fmZ$OsgRj6ku-2o#Hqz&u=I#uM{Qz>`!Ki;R%PA|tR){Y75|`EHdz zuP7E7;V%{$fntLMC>9xkhx5Jwih&fMSY!l>MMhw?hKof;$d{-r78xNwsj{s6fh-mo zfnt#nC>9xkhvGisc|=vUDP%JV6=V`cDWQ1I; zvRGt9xkVv!Lj_bE^;G6KaSBTy_d z0_%An0>vUDaI4BA4ep5Yj{^L*nJk5xQDaSaja z&QrXei1YMn`2Q%rs`wj4?B_1|en?R)LgGBLRIX4g;`0pokKuC@e~2P7IQ$~dQF*P( z)hf&L8u7QQ{D6i(sIt5_@Mn?ZA)cq9kt2n0dB~tEzvdh_Yql&88N$l12RIGuZjED=cJ|qF&cmcV?;BJ!t8(02m0{qqjwHC>BB(ch#U5x9OgD+Zb_?Gdcu{7yb z8_p`zSPPTyWZrvFo}ja5*BF#1hO#s#%~}c{WkfxM3rfy;Zg0=7k^-zvDR_2FMZu0f zzxs5n*}bvPTE~o|zD?lfdcF9e4z#36i<#t-N_wy7V2qf8G35F>mNTUp^)HRG#90oU zn{C6iwq4>#mqt4Hy^4JL=cOtcHE_wO@rbXQqyC^bqSGAe`=j&nPRKhEcT4U;Ahq(4 zAqgKLJQzOFTR1v};1Q#pxajpZ?i}3E`J+S|a1f)A7;7>diAV{PAtQ}qBxYHl(Q-_* zgA2W5a5EiZn4^p^ItS;(t#Y&gl#OyOl$hCk$TGz;q6f-N^*n6KVGF2~&7Y&3xCi0lxb2OChd2vA{}zPAXyzrJ6C8$7K|FUNyyG(v zGoBOQiDPgzA3*@PnrAYEL!WqVXpOTP>4W4c2+4f|Ap=l0HC4O}899{ACm;snCn9mI z$jf_%(xl}g#l4`3qEI%2+cCTdj+%^+{CGeuv$4h*PvGQA+3dy1N!dJzp_!CTlYcyq z+eF8v8Yz+YWhAgte%>la8aicjCsL8J`6HHjy2;tg`+q#o3?s$!hB4=vMoQ%UJBv5V zNcnlMu<>UbsUS~mJRWDHF?qslnq#D~c}tn+@kSb#$34(vCm1Q|6-+@kwBII_&BIxi z`SfC&LU1XYNhXXan@f>sFv{kykdsh0rDa3P=Cv%)DpQ1b-WQlrNZAxya{EQuJO{an zHBROeQa1mAQj?wooRF(gnP3-B+%W@(2hs3l7sUQ4o0`s8<1|7dZvnFmDVv-|4n*1f z2e#Z7OuDgo^1=)$n^Reakg~azZ5>iJzssZb3lue<04nW!b z4bS(CNmr3~G0*pHBUR>2V97$trcg^m%4YmDCREBM6FAm5DWbhec!=*ov`oro6uBM| zMr-8raXf}8M#UH5|B#R4&;NH6z~n1O8g&E1Stmct3aS1c9*IZs$ICo?EB<0$;@?~u z59`SoS$qX063XV!ScBvEeSm$v@DjugIhygpc2`UkKI}W8`Gr?9?Ma%ppzv7c5n1D0 z$h4@Ggc9NZG96c^7Hq`Gqo4iYS{Sm^QM;$>%gEo2EvU zgxzgI(O? zYa^`0S534|JbuKlndw@V;ER$eGu#$tdf#4!zE5)2Lf_{W+6ZgCBTm7X&!572JSX%xON$E2d5#mjbG(Q)$)5CCinD2>UoG zaQ@mO$Dp$Q*F{+69kG*Hl7sGlMzUmfWFDC;?{o`zr{uQW) z!tlsEZZ<+?NTb(-BkDao-j6(J^mrSIj)Qjq4;m!{7Q~OGsVt1O)SF?mHe>s1(;rRW9egY7x5n8r-|y;lFKF`7`rS|4VV7mo%GQ%* zJrJQRiwQQ=U9h9=x2=uROiRiG?}9zh&ezI`tJ1Bn2P1x|0bRpi3+=U%vc?^*)$r>+ zI9}!{bKsj<_p^UBX^lL0Xh2$f_JQv}E!E*Z)AA$~JGN%a@dLJ?MYW+?(88Cs3=3Kb ze_uAVxJ&dPcC@06q>U}DNH+GgBKfbk(R9B%O;aan9bQi2ppwnt>a4|^XEprB;K%5E z{V?uPDr1Nx?p`M^dRTEPjv0TjcxfjM4n5|_If`}ma2`DDF~d$l#(cY4XT!*A;!w@H zhxi7?S5el3x&m8|Y|d61grsFQ6U4KJw_r z4?j1*$Bl*J{I0~YO~Wj1Mt(^i zsIy^PA-m-(Mt+DYmnFzU;X?$5s|H!#Nf;E<6zNo!~yP?dT@sN3Iat)jEdp!D}7mDflt& zO#B!>1zf9sl<99BnAldx>bw9}~wS9g51nTMmq&Z!V{d^v%HW;FVdAlsEF{23tI zm+}%t;m<&3yV0N5f_RPMZHg=}{e?dRd{SlM&p>`bSHppHuu2 z5$E};;VGIgS?)<0ljkCnEe9#hHp{C@v!+{z}C*^}kZ_HpS0s_rOL}SyjA5+mHCZ_>2FZ^0hJ$AS)Q}_vsj@1 z4eb}Ubak|cgp)z-k@C z!uFPy%W!f&J;c&1nu@1Ht45CR0P%>G;b;zi0S^$3U%KMCIdP7<<9sFfiD7*6`pJp- z&yn)yvdMk3qTTr9#F>XzhhNN-7tPzc4B4~SM7~+Vv>;DI$FVZU2^vl>@2!2T(2HM} zxnR%c&mEUq@O1_90j$cDsr~^^d^w*xVAIhubFEq5zxn8BTD!Li=_ssoLv4Fa8>~l{ z);H8{Xu`LGu6NbKboM-z&jGypLT8WJPw@x~-P5?i@u>Ai;m2OXc$B9qnp@J`1vU=^ zg?XoO?A|==>8lw*oei4@*&Z{9&mHzp>ugx|e3tz2YD8lB_$;#JTY_Vo28Z5X@S~d6 zIvd9Mr#)sE4UqIV&su{pw_V8lw(UZHd){^&Ge6dwZX1Lh=1~3_#@|JX;)%Z^G_E`a z)Pr&8w%~_0?i2xkA3?lvRsh;~7&pl00W}k8^hESLC-D=C?}a zdLk~CrpTZ%D zgug)40f>apB8sIBCi2$ep0HAW-kVIOB*UQ-2@gSzBoZFY)FF{@J{m0|5~dgy5(y7w z8A2lAM3x~W5(+;lBodOp5SufRl`R^Z=QCzVBow2FnMA@XaT*~KZe_ZVNVu5kBHNEL zk&lRkOIVsgY(M592O$zl%Z5b4Im|dD67t0t5eZqA*nSZSSD>0C5^^z}LnP!mvWbNM z#ZyH@!Y?4seh>+7W0oP2@SDtQ0NanV*zzHfP|W>>L_+zl5fTYM%a|dNP^e5Hk??U= z=m3a>cd?uykub(`4nQP4mNB21DE*`&kFWZONcb$%g+#(TC`CjVM8cPtJR%Za!^|ThA;*`AT@#~(6sL?oof(;*T*&x;<}ek6m|Arf-Jna9q{6p}o#CypfGv zE$hKzvW%6c)(w#MGKm#tiH(S7&It)T+?=dqT~%vMH%{_)?cm+iupZl-HIN*Ga#=FW zTieDvg9g>!un`0oUe~I&4Px5>Cu!-fMEE+^bz279 z0e_q3_n!kIWxWpwS^O@~w>`gQ(eb;q`zEmO2foZ14{v^Pa}_NxjP4lxn0~N$(-6m| z!J+UF&UZZQA;+8cnDIUbfp0nMY}g6#aJ;=AgTqjO!gI{Yub8X{%e4eQn+As-^>))8 z4|})>VQzk}9B$GxKYV%)^UMBzJq9o5G{UX3?Y9OVZhm`^UlM-IkN&oN{N`@UfJ1LS z^5b_&>ulIMc)0l$;6k!~%#WXUY<^pDY}4S-yAb&$d7#dQaUG4D-&o|w@6gQeApC58 zH{qCRY#l#={Jv@{sbLJiLyrOC7UKhXf8W__B4ky_A zdwXuy7jpOPjPG7C%DnQC3*^eVGFu>WfwY7xTaB)1C-Ra&>5)>hq=u&y4s}6Pa>kii zV@y6z2L1Mqz9Zk>fm0YC$mb97M8$cEyl?4$u41#|HpOccZ&SQiQFuT|_oT|-QG7wM zPf>V4h{q4OJdf~zfW;~c4+ygGfPlgS0tycZC_Esb@PL5#YC7QoL4HbQ`FsdjctAkm z0Re>v1QZ?+Pv1QZ?+Po7HAE6bio$-GImY5g?m#=dC89mlNYoh~Y0HGSGlkchO{u({ zUO6`JUH|_$Z?8*c*m!=y054^DxQn`DY^dXMoZ0_b}2^UqCOOBf{)Rwuq9 z!qJR9`EcAzp8p|M%U?PCM#7;YtQmeeg|Q;6@N(je zpA%;c>_&_7dVj*v+q7u2rmN}V1Dr!*)lln(`i6m0x3pu5+S;0`ZD~)HmZn-;YEw;h zb*Y-Jwvu)jX)kH0sclKghVm(!Q*__Tr!n~wP};IC&L5e)-oH9_Rj@sNWzH4DF3;VT z5L>5`zgL3Bz8$gb(?k-E!@miRi_E{?@CYTvS~*P1Ngt|eZD>D$FDC=6LX5n56YxV< zLw!;{oP^~IKk9TftcO8(DY%CNDM(#MdtJ?XiumxA@m)dEv#gRnBZ$@L&jfoINeU2| zAwMue8arXi)&d_ROs%@QI=ax3@BT!cJg~q0$@&CzN_1dvn08LSuX^>EV7o7-ZW%L! zhcPW!0KYN#F+JlY@S}=_vYnOi$?7_W(M`pV@dt~?IiXF1Ly!6Kxo({en+Fej%rK6n zd1qQ@4>|Y8P$6>phAYK-unlZI$j`B982Jv|%~U&BXAe1taP!-P{8%sMN3{9X;@GCa zp-0xkOdhDS?aaBqo8Rw|AIB@q53j{AKY80g4jnS!wY1Kjs{Y^ENBqK*Y_*H$2xYJ)|V5%KElUOGtUI@}+f^DLR$U=D?{kBED)Yl&mri6gk* zIQJL-uy^)ohIwg*oxS^)vOjtc&Jo#o^u6+zv0+f|<2KFE?Q`;B9ouvM$T15zg|Vhx#=}oC_g=>ln@S$1QW6Mw z(BWqypgXH$M%G0md7Z~Fy$7Xf754!&vjJ!3kvS&`rypl5S&=+7DRaBzWQ?X8YPuVy zBqyKRQQvSj^uBcsT^A)!S$1Y}dOAJpf*B=cQ=<8Z4E>{Q!+8ehJQ;#ij4y?^I_0pJ zsUHI)QW#dg|H+Ztwr8Ar>IuoosQ8rqs`n|pVh5y6e1A+*Py8IST&_))eaubnt{9mD82Zejev;-wMCroo}N6Tgdjpw5QPgKUo(L>&O{ zLhEeUN$_yT**&PobMWK)cNl)Q9?NiS)8J6P>GLUXoej&Lr*Ir=+l6TJtHrTR!#vWc zIO}GeZD)>4-12Qgeth?{e0;py{IcgM)yQum!mYFC%ATiecgn}-o6RqKp7Jr|m$aDy zZGKyE?3V8ar+oXGr`(17BAWvyKjwLtlQ#}U*TAu(b@se`S0Rf|>wj?0(B>&A#2d;y zg=<}@dmL<@!rdIF*g^np`5Z4fbp79rc?#P;a_-sLZtOXc+k5R!X6pWQjZtdmcZk@* zpdX(VoTs?&M)p_d)#uDC%&U-F|AFt+4klC=qt3*Sa|hmk`!n|Eb>LV!t$3Uw?{WH{ zrdXkPwqms+PtJH3DQ;Hey+Hq)74IbCz5N-*`_%tyieFcJPVv7LpCBR~@7*Df?LkW$ zs@`P!@nu6E+jH$2T*la*Hsv|Cr%ic|p*gnaxE_~cpW}LDH6ku!_wV<87-M@p=g`6I z7~hQP_vo13wMXx#w}QEg`9u1;K8)kvL*w<$(m0;C6zD&Ozy8PTpF;?S<_aHU}D&{2v#l!H;F!G^}iuByOTy}L105{vi8!*!oWn^AQbScF~2 zXfI)oXK-u6WsKEP3i0f3q`p}~%-`EHQkNktPx&`BWH(o8{|D?Js1lZ)Sz5DxeOF8E zhV@|g4%ziLM&InDwqwWaG5T6OmF-v*kA!fncNC5(V>~79Aw>%eqnnB!(+?Jp?_Zk+ zhw^D)C}VVf_aDj_y&m=8yOr-zjuGsbHG7PH1a9b;5pJC=Q}!5rrZWcK*BG4@XWgu` z?VLSEpX-c)InuJ_%O0b1%+G6Soh@JX7`?(NABG`ee%WJmZnu!MnE`EnTX8(x@n7zg zZ(n2d4&*n}W}^8~yi1R5mUp9qLm8w07vddh6FGVCBNR>*x<4S^P{!!AS2L6`I_<@< zk6Y(d$$AO8{_n;Zo!2sQ?%CNM>^YHpJI3gvG`r2f{&WdujBXz1_S-+-M%m+Y-UIK) z@%g`^Ui&>hZ)@mkY8cwL_ZhQh&m8KvckYP@moYxyv()Tsw)Fbfi-F|mR{9T91n0)2#LqYF?C5+vW4<{FjaX!rbmdc&@)xCw} zEy0o;zUzN7+%rrpY%IdaKGB~>%MN{^bT;OPQ|Ti#)@&dY4i2gw6Pgxt1Pk(MJ`w+&@jQ{aTaMH!2$>wI;SA1=FJwl!@peEaN9qKo z7{|XteQUtDr`FrhSPNF*y3m!wju^y5Ln zq8EbBEtJwT%7XSE;xokFdWd2)p>@2}^G6oXA36DY|C-p+Io4@Nnz#7zdUJ9Bh8X73s&@OiU8VI(vTf*g>XV%x_=wBkm96 z&I4>aXU~tGLVg9vi}~$qenh(y6QxAv&lWX%e)POkK31LQWjV9wN8GC`34iNsetciK z?f0TnzJ1M)xOS@5W`aC;$lqOx0C5vBNp;)BCb=J>xCEUV%{vG2hB80eh)VW?x)#uWqG`c#jbg?`e(q3Xz=%?Lzy~=zja9mzl))=woaj;)#lU zzES2_mRPCyUgKmXQE!%y<8?Btve)eYk_?nwCM7c}gYxmx-YeL=cmC!V-{UiykYnfvM9ynC-@iKb@z z!NKxJM=UIB_if)CtPxn)qC4lx!j@m7l~4&dGike4jd=mQF4M~0H9=j zno_QX3n4+pa|k*>wu6WI2sq~DYJI9RDi{Di|P-o-K zgKUo(#1(|R`>eBJd=$I&cp3HJ7=-oUn8Vg1ThCLD8+s?gt+V-M&to2N^eAi(n_n%C zZ5rm0#GssYv(C2jdGK({_mHDUK~cl}vh_Tb$ZwL(3~0}lJ&$?HDPO*mU-mqPra_ba zd%D1n1%uTGXEfn(LA%Ax%0>nLuh8W5`=8uTS=d5)$YYZtl-wEAVj9rE@ zkC~53l_L`lL8-&w^(erPb#?RGhKo=RKkMvyt!&Zte>dhaR_|iY@1Fggna5ygFOJU& z&STtb!FHQsg5{sG+t(?(*O;>VICmx{`p%SRy?IGtP9h6K8ro!?2rNjo!l03?S>e25 zGP2^lVl@$kY$am;!F&6?#Pj+j%Yz&6P9mNypHaL|{lBL8b;aitpClswe$5NeW-XmV z)E|`%eO>%CHY#qFnF6{l{uIm$%AxDQ+<%Bte6xrwA zDZH`OyK&bXzULI9Px3sJx!@D3m%8%6xMQxmXjtZAc{{<#&0H#<$XqJVmGkZd;}x_t zY6xd07#w-i@hW)Uq@pQF$|_ z4jF<}m3?yPQ;!c=We3PA>tAo;c1Mo8=(6Vydq69nFY*4eO=;K4DZb=9cH(-2sXea$y6#bch2 zZR>1)+4GIbcwn$z%#Uc>r549F4Gz8as5t9poo(my;Ng}pjr^d%p1veaLSpyt2bEKXAvQwjTH6yvU-{ z7K!$xFh&WTjh8*&pq;6q%r|aFr7DrhVDpXFa1rK*XN}s~@sdMZ9t!Wqe1mNtIrr@E z%zT6GOvh)%+o3m^E4i6J_IKyC=}bS&YcxYILWKyt`GZqG@Ya9++i+7&k_UZQxd;>|=ne`JmVyi@%@ulTUy_Y|KXA|9U^Lt1mv z*@X{yjdsaNaxh)Rab-i_52wdWOf%*rN$4u3_3prY;P$@!$~*h~Ug#Qjf(u671?L4= z8rc4$~E2xG(gK-lj+bhPr+mWnH&x!pPj&9O^n3TH|k%Qy{NV&TZd4OGX^bD~l5Zl>B=UikMjF&SNd3g<#CM`!+ zv7)#ar^!UKi%xtR3K<-gLP&l*{tW!hE;_N_Nx2U?8E_wd+(oAsn6-WV1`|#- zQX=oujHpt6-ZDoT`Yt-(K`QQ|BX{g{TaVj#o*DM6oPES*+Os~y=ALDw{5+0EVzZ4@ zkk>}(I3tb8>t-%!8PcWl%u3#aH5_v4k{_Uc}O^mpU&YxJ^ z#&1bJUfvDNr%BJ@jf!85(70^-)Nuk15BdVj(}WEY*wS@q*$%p_Li6&{SZ;kG&P!oU?1g?F)K z?4~;Th0~b!Bu!gTcr5dXcF_^@s;6jZy6_%m744$)akkui4V_c?VP+NWq9Z0_qg`}J z1I8{orjYXsALNOmU36|^Ru!?YB>+Vgg}-Fvr5d@iu!dr^i;ftfjds!Do$2nPBjXTf z7oABg^+mC#k#|t^Voo8AD!RMq-7oAC{xa^{HH}j8n(Wz#-XcryshPIDgbYff>+}TCvGRphd zMJILxBJ9sDI^0Lo*+u7@JpUlO=uE^ZG|Y_i0Jm%o(sx4$Uq5hwyRbSB|@f z!J|c3JMKP)n6IYijr##Z3MJ%hZ~Sqr^n^fm*YUj+rT6`YIy!}r53eu=*1q0Y4Xu(* zOw6(Db1|?j(Lz7f(DZ0bR`TM(fotIIsWX-rMIFbX^G7DG_b-pF9$A378)RGnxYKbJ ze~t?bG6)Uv+H)ZOmYQq?Ux_Jm)Vt6JJR zH*__KT_Wr?Q^R)Bol~kd*0a$Xy0Pa?752Wd+rD%(Hg0eRpQPtEx8EHP@mTtsSf_O2f|uQjv^L z&t}6Rv;R)J>;lx!H|UHVjxsj;G4(ZPW1+IP{;}I1VH2K<8fviN5UHJLZP|CI1GTg} zw^Vi4x72g1T=YNOORX)~Ey!#QRI&8b#Z}8rJ9Wjfvlp&Bt!g>jxTZd;tWa~Rq~r~o zu->J+y9F6XDg`;$MfEio;jG~J}tOf&b5K1U|eQ=-*4>b zYJ)XfZ07{)Qte=;R<+e^((8`<-`j|muaa=61Bk}%EjA!(K#yRhH%dWte$kd>= zb)D%0(l#yZ0SyiHUTaG`E+4-3L_0x++a!_y8t#3C6^zloPIVi)x=^4h*xqeu>VQt7 zYD4>m?uL4~sqLmqc8eslDHSB1v~~8(8ZLyCZm2t1*-e!WOvi$ZX@*&!PNitdcFEtA z$TW-D9*Vn0)wHf}fe~YgVQV4Ydds#+1M=Aa&9)`M(6 z)Y!)7w>AzO7!NO?z4Ra)c)3mn8St2jALC;*A#R{}X@uG|jL3M|>k#Na4?j2FixBu$ zw9bZQ>p^-@k0c7udhAONG6~~9~nqgxu*hdn8BZ^wFjG_yE9JE#{y zw+J2Eu{e}WyYl;ibqx2SS3_})SIl>s9m+Pg=$N*q78~o~B^(XEj4qKnj+w}UIu6!3 zh7Za^(rIArldKa3PGUM>TJc0hK3C|!Q1M*FX2ora*C^hmc(39=DL$!4(hKu@L9tKq zbw#m>i*VW32T0C5f4zCJ+N*9R#3 z`T%8LA7Hh{lYM<4%f3E9+1Cds`}zRo!xQi|jW7H9K$d-dfU>U-Q1U-Q1jRX1eSosB4^Z~?0m{BUK-t#^DEs;V zWnUkl?CS%ReSLtkuMbf6^#R85vShocLDah^?Co*VeH$Y&G%8_Z02=(@t=X3b8Ds~&OLX%(kK z$A+AY^T7^{BwTA20!_eY7+PHR_2JQ;(@K8k_n5U!)C2A*e*yNVm9ywA-%Va4?Op6i ze*C3;@1|Eu(Y;d1ox8;rwZ?k`X~0L^C2OSmN&AqdJqBrQx(UdG=kuY5^pem|LN}SK zY2O?qzk1DYl#}16edH(Wr%p3mM>%J;snfHtd*RAI&yv3nnQeqtD$h?tr`mfnc#_~( znsQ25zdBPjl@Yj#QrB+A2Rc)C{n^6NmLNI~1W|_qIzE#xdgNY8)F$3&a)FEzm4hp~ z9|QfrM~J0}{tlk;+==|BP7?am^8wJF@>Kxs>6r}aLV|d1s6^%4IY^#@|J>yW89<4u zsp7{YilapR921Y{384hZBN;SOq6YtrlNu#zFoHQBH5uXg@c_dX=EQ6*RDUsKSaix{=^GL!MTO4KT*JB?b_plGw7_bmoSO4RK<;~+{@>QF?9DlHo-QRg$`Ri+5>ycNthRHBM@ zXU$Id1x4F^eD>yLPkaJ@x8f(Cy(f4F`=jFYI_O*YtHCv;67?@Qj+Cg>sKuJ}9LVNs zc97?Is*V{r6ea2th||9kRnr+Isu2=-Uu2e{67^B$HGmTJ6n3*Om~>mww zg-X;Nj2S9XNAnD!5>+%(`=LZN=bM}NRpt^ZQGdlV44_1v&6v-abQO7*Fy^<7RGIgL z4=Gfll8_iFQRB^ws!CKQaFnPN(cV;v3YQ^Mi5f+wx?!|N9*PoGqee>9Fe{vG$V${( zaaK{Hp2>@HT&O_%7+b=sN#lh_GSrHR!V>m%E9Mt+#~LV6S%6qkLE(QBBPHsEjC_iQ zrVF<-a->A%Y#mBelXgzwXBatBq8`S`krK6wkr!#?`GxBk8Yxj1`w$}~>dzQ?sYb3W z{3WXpDN(OudV<|t7wV{VtmPQZXFDB77*IE~?ZD^Z04;V4nR zh-jijl?OniL>tHj*UFhi ziQ3HE93|?ZEVrXXeTeBDCF%~I&QYSmpz%JHsPT`W+4e_?`fZ-DBeslVc{J-hmS+$p zDldUtC0B{cd(|pY7qO5BrbL~Hyzz(_Scw{c0GVTJ5>C$Jah#OW5hWP;_@hyEe~eG9 zE8S$ofLgT+JU&s6R*wG)lKKZr+%-4}d)pB-#O|*`KK=wr$yDW%(nKFG(JQ?pk7Wfz zP3vq#dH-u#bprMlG_9lkrc~_w!n$BY;(;xyaOG3g)wd>jwbZfs=Z_r6eHyn1SH`c% zxqR5RT&8suoEu%NuORw2QrLpSyGW1rFBH5}VRTH$giqB{wBmG>4+BZYf6>7^w z0~jepLoFio+1(yASfaPH8aQcb`4e5KRe5KqHuq9y@>E7q6{QUI+eTSw^r)eNPW5~T zpf|TFH>Wp235dQyts=_N-2gor51O&HO|~*r6r`$LR6TH1;SB9>hJY?-E@_4?{H-bd z!aKJ=t+G{-TWz~h%o~lhQHo|My)%@UXbw@3i?tx5eP@FhJ+mqoLxn8VmdbsrLALsOs~K*q&7>@3@*a$mH{@DK1w_MX72`&A z9IDw-!8Yp6oe$wvq2@T$Q{!RaFeB_ED1-AMdNBKFC>G^_T z+@n;+h(jDF>#nn6woZ1Sc+`>DG|Y$bKI(Yb!+BZpeuMWO-;mbXc-cDH=TVP2C_L-I zHn8`bS899!7@vURctLBX1|nE`EnTXF1`Z!YrV zcWagpNy7X-fn%oO^`k36;81k3zg4}ONfn*TAj8YEUUOV8qs(ahTvb)yVFnOhYdy$aHj|9kAHEeJd)n>ec$|9Raw2s4%T?wlD#|wy z(f{sI|7X>Ir~2R28wR28weG7bD zMVDN>+KZr>?XNMG6)68fM8DQTW4nSJ~zMl&Eq$Z zGv}N+^PS&sKm}h06?_>~@MTcJmq7(z1{Hi6RPbd`!Iwb=Uj`L?8C39PP{Ef$1z!dg zd>K^mWzd&#qp+U^Uj`L?8C39PP{Ef$1z!dgd>K^mWl+JFL0fT;QI6otpx0?$@MZAd z(7fQw;D4fd!I!}cz6>h(GN|Copn@-h3cd^~_%i6rm?*HkKWX}=rbF@a;e9?#(-bMv z&DNCmn;5@H)3bH>T1|_2A0VFZX6nGoa{_#s=DB}{@$!7ZKSRy)1z$UjO%V#6>QQHP zW?BB{FucqcHM)w=C|nuAp<~2Wz3V#0y;-`Kp#zvI?)hHpp?cP$r-P_=!b}S}NZ89- z@st;xjt^D;r-(6_Dc@2WGyM|cfSIlV0cLsz9%}|OtwII|Gv!s)nCX1P_s95VAhTZZ8 z7mX#p#;6E0JstC5!xbh@a^mvGOcx>-G1DaKXED>0SopLeR1jD~LZF)nGnIAY2s7o} z(_*HRSch3E->3wSjj)($JL6`nxG{;F7?+8eUW6(LW?Ij<2s4!>U5l9th-NWUn$745 zGd%(F1T&SMjWAPrL#=xGjUpq=^j|3}2WEO2uU~|j-pYzanCVP%5oUT5Q%0ESAK9l7W_mYM_5m~9&U!|e z=}Rmj2WC2iDW6amVp(DwPaezbV%WmuQA}(x)1R|5EM{8G#1=DM!Ne9b#RoWUF^#pA zC9h^;ib0&!c+R320oGu_9;7Bl?}n_w~1k8`+M%#?Sgi<#a<-oZ?- zpfCqBZKN~@GvxwK7nrGFp$=yHRU{M4R2~2pGYwdr#Z1#=yTMGKL$?TK`tR%?iVy5#MYcW%q?OV)rF0Zo1Odn=qi&f|;(QGzT-~_o0iK-p%w5X37l;E@t`& z^LL|o8e4*H>J4W49TsRY)0wPKUocbNs|GWbkEVl!nI7+7g_8V2|F4))({YmHuN@v^ z7msOV^&?>OWO5!YhWC>}Z<#&!@iZMQtT$|}tt)Na)|yK~pN>wF3H+D30?GuHnUI@BCI=8n;53dFBjFhWDBXgQRuRym zav3nB3+^0-kmTP7hwOI%v2Vbp+%%=?QydWN-xq{D2)Lu!YmftX>XC7WZx-%f}7Sl-Z zjN|V%O+myxkH&H>)HtT0yAwZLreZP~ z1d;w`RoU-ss~OAidLP1gDW*p|BhT=Ly5WZcYjm#(Tghw7pK@+(*dC4~>-t0g6HDOY z*k{E4s4rn0!vNcH;o2g9`T_1ta}<__>m_U6gH-)FXJH|TUbH5F_P;Wul3x2A%vA^cIzKdtHWnqpyG%Kg2jf~_I_(dcg0N3b0UIB~^ z`Q;3|^sWxCT1Z& z8H-2K25pLCzeodwu+pn7)BX?d6d939sj^-Cp0^OxZ$pd$2>$}V1_&46t^z>#2P6SN zxEqrh0}wvX7^_ryKJsXQ@HdFb1rVxSF{-gR0O8lcT7d9=a^qK`NLr>1Y1B>wgrCI3 zDgp?{fzbfr-=r?0R7tFd0HGKg?HVAw4gw7%7*Bi^84OpLxWM7^2MB+PTm%STWSt|W zN_jIy0HNr|L;#^!Ka2oEF>x6wRbI+V5dnnXWo;v+%30(hfbe#9K_);*H5~y6Phnjm zfDnwUR5^kfEkL-Et?ogol6sH=5K7NR0HI)u5kUAw3W@+iQ5ou$QsrDUj{xD3loJ7j z_)6#u5I)VGumIutV0!@&p2Y$pfbc?gM-G7STP!>R2&Xe&1P~@zhX^1PD~=IB_-)2T z0HN$;>H|P1Rzo9z@J7}%2SB)=h@aJrS1qfT%O9ldriGj(8jVJGB&zRW4WE1mRfbcY4Z3_@iqbLgyZewB#5Wc{U zv;g51jI{vaa>iPKu!`kcfbe@P$O43-HfaIE|6yVa5Vn%F0O2}Hwg4gTOcx-$n4%qk za0eUV0EDs&(E$jHD7~{%*wG)6)bWklo zxQSvcKqxAy-2jB5zwQ8pOV~&Y5QbzeK)8^?EkO8n##(^zTkHS}5I)XW3lI)xUJDQk zW^4gMekMBrp?uw0fKc`!I7*eXDa!!}-@&3Bfbe?O!~qC@K0O4hfca$n` zAm1H8_!T7R4M2D~D{KM6r&xYp07BlY1|Z~0&OuYEd=m|XW!lx4>-Z`9-{}{D&~Ziq zHOl5KP^2sqMaorUX;#@Un}r(r7mi&>QYKlKkHLvbhFLML1@<@nGbqTfIKiiJVt=l1 zDe8DK`|)37iJQR$%FlBrszG_ayl4w4;T*1MA?*jv?_Z}%2_^(E@9CEs4y@a-S#y>cdZTjfAnZuB8-<~S+L@HHlI@D{m8w{)(Z)YXpuIvD-;jaOBN6*U1_6$tzcEwrZ<*=^#dYO(mX(8z_4+BQKm&;YOijE>1n0KYykee4Fl(G z(U%P$u;7bb11(-jP1EMhG#Xtpw~qjBwyr4OIqtgxvkY? z^O(Sh8^uV+88#cg&6SR2m^>82bX;OE&Uoh`!1x(=A6}e%YZ_OHe##>?@~WLY@QPw(t$5TwrlY$MKd0K>^^j-! znW&qQmyO@n0z56F0PRfuvhmx;oci&@#mLLXZ*PITlo1AM06S$Mtl!7g-{C z+4${4i2R9ZB+^kHf46B0BJLXM${7aKlzS)q7*owA>ibBCq9bS0W#hLUNcTXL%F1JU zHMdfcoTS}@K;pM-3#-a@v8`q-!|UyVuIPMvv@_)z-cUFE?}gu1n986R*^ZSC&uf3Z z!!w?9P~{Z<`%A+{S3w0FO#GL1B>szTjvTK;QN*e1auRr^U4S3cmuAJ!0MGVtPR;mt zX2ompC&H8Mlvls~^_<1b-}IDKO|oUO?Wr@`F<{uw0dV~W&@mWC>{s&llE?Ff{YakA zmtas2xHJZ^;L@NcGd<{ZO$C<*&u1OO-=nGE(%?5}ey65_OC$Vd&F|J!aA|};s(Hbs z!9TBg07N4H_nHbWjd;POK?Rov6ug39(~P|^7W6`fDebvm8se1aF9PtbdH_@kPN&L_fU^&eDlX;9Jm1Qm@M zP|^7W6`fB|(fI@wolnr$@DO6XMCTJ!bUr~v=Mz+PK0)VUOfjA4e1eM3C#dLrf{M;3 zsOWrxiq0pf=zM~T&L^noe1blw<%!NG_}4Wb#{gzIqVowVI-j7T^9j00$BWJ0(W5G;JisSZ&etdL6!7({JeT`!)T64u4tG6z?14AI19>?^!&8 zgimW;o*#%`rg?c@ftTkI{u#>WEamVF8wVEeQAc!EI{$M`mmP&d(6y`+pP)y3ctMY7 z+ix)Il-3uWlfD*@p%welwBwA;;^FOWdq+Z#^nW$>-6h^UaHc7bRK*?Jzh|1JIM(Ev zDdf0J{GPWB)EA&}Frw|5rau#IB4UFUTtl2`N+l)$$SrtCW}j*LQ6$!9n$qrF4&*pc zB?SM4Bo1;+M8=+J`cZP@SF&6n$FT`yi$4W6_Fg2UcY$3Ds@ax8Dx=uFf5SWa}N=|W15&NP+P^BJl} zg^7ER-=1kI>Wk5trq@tPbf&4i=b|%B1tZHm({v?@>G@1kQR}kE@yA%V9*|?cc?CI^ zo{f;>#jIX*rs(*aCZ|X*qkzV8gNGRF{n>f5DzHv4u&QAlfrc8zIs`j%B)M&orgl zT40gmN7#|}Ow$#thDDCIG1el-*RWiBrs=CJ$Rfv2F|kFCi^$qDO+U-L7CHVnV=Zzl zbKYj$;coTZ*8X(u0Pw;^W|eK-S5n>9)l| z9NmUK<2sa!qmnm{b4=<1U>LzoKu;3`<=2S>bOm#oX(pd))9tfnjp2S*PsVPLBfI+ORzwN!Im; z4l1ub9j_fRL##|kj{P_x;#9w$lEtfqa|0=w7iLvMgPaQA+|pEo-7zY-^IHnC*nXZx z%5rFfmTez6i&W!=(C-u65L9qOP{9pB1vdm0+z?c7Lr}pDL1q06RB%I3!3{wLHv|>j z5Om-yQj9nB!@yajsviV5M1Kfw2r9TCsNja6f*XPgZU`#4A*kSnpn@BM3T_B0xFKk7 z&muh%5AeR|w^lC91oEa#nU*e_nNClgol4E%KmC77Iz5wCUZ+loONBScM9|dIY#9<>7A)ctg1TX9Yld}qoCl#6_A_rxj3F%$O=btJ@9{#FG;NA%H zzsJZc@h`%h0zQucG;v)ZK1jy}b>RGXaId5kX~Cf2>niXTkf0!F1&J2~e8l^MV?JLj z{-mfxf9;^pFyxep{9mE=AO+rg!S$0>F}=*=sp}}MX)}@5w_hj!+qlu0{$r2ld zQ)~t!Uuj)fY_b9}k{{3_j_LXVLqPqwkJKGw#?Se^JNItGq=)k!ejD(XV>;D34>%)_&puNJcx4YH zpBKiNxa@DR4Nm>K`v#-BSjq?kHS)5*!J3`=b@vVSG6YZ~);N0kyG>IQ&ZAG=v0$>? zi3Au^%_be8-+aEo&O*9;zQHajKtH1}euE9ikNwPkNAohi!8ivPjWFX({S0rY8-6Ih z!B|i0+|m!uHy6ha9s7yjTxxre1WCU|FU1K}`i-W(pqOF|I+piZk9#Uni0r8Z9nbWj zX-#Ko%KMq&3pHJ)=?YEH*R)F04Vv=4V7`kry_6JV?_-)?p~EFT!g>GEUJ0)~(@FjD z&rpsPhQqSvCCyXP(Kf6e=Wb>B+a}?DL%3+}Hd;n20@^2cc&WC%>#zqa<}DX{BHR5P z?HKx3hTgR=(iTaq{qrx-mOri(_GZo7_r)~qnBbAZxnD}3-A@0XutzI|4H20WA`Ruz z|NH3N^$F!t3#941kEe$98uoKX@54np+ z;%+SR7LP1Vpx*C*2le(E^Ve5A)?1;asN1@TXUT#w%ndSadq9?C33 zKa77K!vkf1%Kz)IBQPPvlu+v9AIP-F4ztWj=MX;}vSf02Nl7@QWO8XZv?RQ^K0P)3 zKuLPj;-%POD220Lbg!JLsJWi!l?z{fjiQ%-ryRFO2FAyGz&Li{f?=_WVezZ|jP)nJF6w;Apr6KjV1Q(Phs; zQ+RevL^zg3`-qP#&p~cOm@DqwZDc9l*o> zGmdHLbkT;qh?M&QV;OXah zpc{r)1(za>V;q0?Yih#pL^_UXg8#9r29G1Zw1wqUw>m z7L8knz+(_H3P1KAuMhhKMMdrv1e8XcmFEPB*OWu%P|RuF@`)R8Own=7`rz3n>xO37 zo@5HfZ-^4OwP*W{G?gIqIKr$8G<4WepF4?J$Vn2=Q9oF7b42OV0gWp z_6wXv&z5_dE6Gca_*qoXM-GTN!?ARRu4)6>DnVBVVGzJBB=IKs)%#f&yOTncFuHfC z1VWEs5-!RrftXL4`7#p?XCjt5LMI!fk{y}!PQpy?s3bCGQOGJSV9S`y4q zafJzif;Tof3jXCnoM)s(baRUwvWqo7EEfpzJf0t1y*sKD?9b4CgbqCJ^?Hr8D% z*qXk3C)lnP79f1UE`tD_NkpjcZyl#;K!~4iZ3JkZf zevtwL7w!6THr97oUZlWq3G11|^xYno_k?QSvP3J(i%j1g#hOJ53>T7%6c}QInXzZn zcMl?2rUC=YaugWI=BdD-lWs+Gj`}kG`H?6HxB&t22l4Mp$djGWffxUQ%j3b!-Nu)q zMxwwV+Naj^-Abg5R1{*#ce!jl`8D5(Eli4Lt2KRh3Pd^z3`NXqP2XL>uCfXY-(^Qy z(|58X-zqRHWvo?TsA9R+^xdT_$SN>A!^BpB;ZIC#P2X)IYZVyIV`8hoz&q15eK&)m z9R-FuHo{S0c$M*v0>dxJcQ$=@DjVx4FuVt1M1esb09JuvG>f;U?=XMMPk}*{sH_4* zEyY*`hF2*jw*o^<4DLA!3}U3vn!XbSWUIg+`yQ+U!>8CIR)OI`cCR&kcRypT0)w2b zW)&C~vSK+E7(UIuvCH1*Ylv(VHyL_puI zy5-b}h%O?3AKuuLkqN$i_up!GdoJX}J!E7eCf&F@3@>8yBfXnCqC9 z?o|Ak9&-$Fxzfq3L#H8Ox?M&H{Kh-a@x$v;^_Fi(<4iiv3!Pw(w!KE9@@xm!5aE@2 zW#b|fu{Ji#2tgX-&BjG0;$6#jQ68z0SMB71*IS2|y1QP_bab4Cy7fy#UJ7B9hn2HP zUMu{j4)A(6LEaR4v@>x{;9YqYPW?EqF!jsUk9Y!+DJ_e{$m6`*mA3}+I45EKhT&)A z-3UMPn6dO*$a~Z@QpYj=Hth!y_cg5by8U9xy%Vt*E6qBYw;$=o83xp(LvS>v80}+? zHlMvYlK?2uMiuwwa9NjCWxLo`Ge+U{Zo#-;Nso4>T*Djch93$XBNJKhrS7;i+WCS! zqzsGRV%sJ;eB_1aVCYX^NmyJ8|A|YG8ppbDPHPJxZKDmKpI{!K zCo>=DbWKm!l+P-L^VvbVR?`id?$q=Xn%=DGZcX_m$9#`!`n0CcYucgd?==?pg)$y`K0{&&qi;Xt$VzdKPY_x%jjW$rR(FQ6u z+CX2#!-Mq^8*QLsqYYGSw1J9^Hc+wA1}Zk%K*dHIsMu%&6+Xaf}+ZJ=VK z4ODEjfr^bbP_fYlDmL0c#YP*b*k}V48*QLsqYYGSw1J9^Hc+wA1}Zk%K*dHIXe;(h zvc95g0V=u{prUI5D!LY+qH6&vx)z|KYXK^{7NDYQ0V=u{prUI5D!LY+VxtXIY_x%9 z+h{u)F9Fs=Y_tWKsc3L5i5nR;4_F%G-8y^I2X(-KWCq}j{Ec4{0X>3#40`S-2JHL(6aQ6c!aFjpMw9P z^s{@zvbMeR*W9xg?HXDPf7~0n4{bYck~wn>XM&9f&$QdUk^AuuJuW@sddN6uKiWLB zJiQa!4$j$odHPmFU6({z$MZa~G|n?ypwpq7j$_zE>BnR*;2`Y%Yu0C*4Thif`ww8I z^p8Lu@*Uu(YnyOVf8<{PnJ*)JjCXy9u?Yt&ocq0s_HX9QGyZd4*iTWY2LE%S{ zs!MowJ)YzSp1lRR9eDN_hXH~A)XOY^0XZa?v@GRj|2c8{8R>89iQPT*X z#l2wQ*>6i-1fIPZUc$4FFgDY^ToKv|i*<=LjEdmdjmTiQ!bHm9@`qH!dI8VM(Pt4ndo-^`AK=;R*#8kc zTShK|X9bXm;MsfFgkIQ}E0VD~C-EK92%g=}dgg#JnQ-6 zN2G)`UQ7^}p5fWgL;m3f&vG6r@a&Cjx`k&?VJ{gAa{nU2eC*4~=YoZ2Co-RfXMe@g zyMbqEwKj0z*&%GCg=fFd>=vHow9&CIcM}s^c=jWdW#L)cpK##WA2Zg%vnNqzglAW><19RTHS5rYsGLLbR0Q^^KSQY*J?Yp!cm{)VQSP09x??%KL~_;DTJ-`E5%E-WUc$bzZi_dFk` ziA|o8{^I597ni0ttpE9jigamMyCfV|e_6QgfgOv&<39E=g&JcJAd9Q-&F@X)czG8L z8*#ONS+FbI8I!b(V>r{vK3qxMih=QGj1apxHU}YUflLy}GMMPz7C{i3>g!u^U|{9u>QV+^uTZvT<`=r9$in&IIc>b9!Ck#qLYNyehKs;>V6vXW?);60ah8`{Cu&2`^s5 zNXHpA8!yh4j%%$Z55+LuRZf8M&dW;o0$#*?BN}JYW#h%8pl~x0jbuBxp3C;K9ocyC zYP_V0n;2)j*?93BfSAlrd89^OHT)(Iyxyw-_~y`~o$2Rnym$fRrI3d5y2Fdp0BhN& z#+kC35a4u!SL@V|^A1zLY`plrke4#TK#jZ|@VoLFAdmPR>xV3nyllMqgNS^{G!p43 zkH6bA1raw3cwL!cKux*XcySZbq3Fn&blG_ECy_26y!e~If!iRYC%kwK#{K)EQf>X5 zAn}^|kU121F~^2=3Lhp;s2nxl)SS`q#FtY}yb4$U4+dT=7%#+g-b(xzw_W5ImyH*5 z?Z7z3FER`$`HC!lbrxR(-pr9%o}LKf1)l*f%l@O*`ewdkHdR*DynpM)7R=muifCpO z6rk&>S`k&*y0H;`Qoz6yeWm%Ib~5 z_!C?glln2>iBqRQ1Mqw<^=S73c-8<;jea8D$9@AHz^PR~4B*tN9}ZWX`ejTMWZY_6 zfEO$m3KN_&J)^>G1b)+#??zEg86VTJzIM5iidZ{4={*CI7R)+PMh}uR_+r;MQs2)_!~2-tzKWI|AUf)Ugdyupa~bnb`3#;I|&|Ut+<& z*DP2z^>5P}NA?U}o!*svUE{w4IB!4Wybh8(HWSz#XYD#J9yte-$rHFBmC|r8)QZn6 zWT>}}!;@EC!@VoT?|Ixl<%{a5hI@IQm4A<~bL9T^+SCJdf+VMEC@b{Fg;NA-`agE?!feS`bl`PgS zbrHDtCU^<=UI!sL;NB^Wis0TWk->0*h6KPpi}DG}WJQ^w6!abps#l#&Ve9*tr|8#l%L3#gzQ6f1iP z!9sFj@peD)6$-U*?*i7X2e|iR$SZKK^lSw89z{v3RfS@SdKMSKy{t>`v~m9v`3d*> z%o%Cpa*o;w?%m9SE!_J$a`po5eJ2Zu;NHpX#~g6)-7NfW)xgmSev(^l+<#_sBe++# z+eL8iTGlUudj&J<1Kj&pmL9>qqF0#%?)@msi{RcG)-%$^eT`fM_s(anE!_J9vOUAS z+|+k?!M)sRAaL(iHr>L#b9prlpc_kyo~B{r$!pmchAm7U!Mqmkl~?qc!S$R06pu=Z zQl5o-k6~g9_g=}Kvv98fffnvfGuFbr=dfH0_uj_~YqfE2U}6jRKF7os?tL#=3-`)C zPYd_*&UCeLH&e8ujk}!v;lRCI+#X4{=QDcF7og?qow`t=3wm0dv^?%l*rIaqM-f1`moPV8LF zb^K4FAivBnLJ%Ei6h<3&n&7dk#?;q(zU;{IFC0^|IbxQNscKnoVpfc80j%W9Ti34` z=eM9w{5h2BL(3<1Hrb*t+YBE^aRDl^1Tou)?eTUBS+xeDuh z>l@(%ba{9mErzN$Hgy5Mif*xnUFDY18kPrJwf3L`r-#kCV|{xn$`chhv#hZIXFfQv zYh_~wi0UBmStzPhMAoa z;QFFzM>d}Nk%Z^XHbRijc;AyHZx1?({Xlu7MqV}iCJ(&cH?h(*i5~5kj_yMI-1fPr+iJ!#yxw+< zmv_*ko#_|D8|sGtz3|iuQ<>=Mseprtm-5*`{1UKpuA{mb;C z0}HxA^E);Dgr+xZx?9uxHGNdmr!{?E(+*94uc=_AkS}X}pt3*)Dmt*Bq5})sjDf@Y zhz>01RhkzaSn#_wf1jq0X(~Ffi0{z+z_W2zrT2NwMyIT8>t>l%B36_!oUTgSDQ4<9s@&lrOhQpYt8e9&LlwpXyi z)F<~5Clo!=a^QsC%Kg+ajiuZ6BD>aqg`OyQ)Olzu{rQfE%J)#$6*{TU962X-YllB) z$H<4$dyb^e>4enwjx@qj>Fphpz(2fh&)!K08{=*7n20dS;Tack;EzU+RjTLwqpjf4 z)IV*9{wdP?skXhuFvAh37tYc^U0-7I0gUn>Vw9QZ%H_~S)rW`}tP*C7HCFj$-VSm} zW4Iwa?+$_b7N_>P;BCL`CLKtC{H&aR`R>`?S+z;m`Qmjh` zRvB8XlA2qg#VV=$8TNoxUW1aa^}|)FXCtigWJ+4CDjQ4OPC*e?$-0E+vxCCo%YAg< zY{-b;h<`WXCmnc#ccec&#-JmSMQ?Fpb7ONZ%_JZ&$!z!D- z@T(Msku(fT0O9T;>GBvY2ZwhkCZ1T$0wS!EdTn6_RvF&)1(7i#@gVy#!YZdSUt~G> zaij?&tg?|@gjH^1{UWUL73RypD#LH764Jvex1!Dut2&o~L#4m1>NzJdg!v+@@+#Id z1FHpxu*g9 zBz~Cu6q|0b%CYPvgGR=Z!(BF>B-|3k7A9${I?Ti>LyJ{XbuhG8WeHh}RepvYX|YNw zu7(z?B!&@MtdcNOXtB!2IIJvIc^4B~tnxJ`wpis>vKFgc%fuF|#0A2n7PZU~ZZFulbpsYDoBta2WOTdeZS>=BDqew!U&vC4-TYq82B znb%^K#H+(h)zt99K%nR1<|KEkgchr$I&bJ;l`|>JQB9=+Zs=f@H?k%UR`~?QIauW` z#yeQ$hZ*l+l~PqR}F7FPK; zG|(R$E<(o!N;S0-(;okeXa`hN>8HCLKLcATBf<){oL|I`*R0&>cDf=~2 zXuSvA;ik}fm{~YhUuXiC8XZ+!VWZoMs~73E!jBY6qZJoV>$xH{LQbL3x@1PU4Zq>_ zVN1#6aCphm$zh@d=fq8)#zW&S!ufGaO4FyN=|edAl5ki_>Hn54Ub=L$sJe2E$;Da; zm>S0+06o_Q!$wD{uCfNjc*b!;3;W5``*w6*@4!G(ITdeAgy-@ew8 z^HPsBLtC^`8a7g^cG=nUmsT!cIDggh6^qYZShwsX`sum3hNv8$~f zi-F{Rw0*3NC|6x_aVTM!EK`V81S1a8>-kL^^KyZ z5986bFdSLAY8eJP0R6fxIKHs1Qc(VW#aq?A-!~vwD;%50b7j5g9-$HWLbuWp0|t}( z#b9z*_LAKf1YU>Y0Lx|IbT0sqDMuLA8iCH>8wZ*$%Gpns#L4wF~g_zSjsrI^)g8YhC?P z_J@&I?c{;idmU@fi|Emg>FBcYTI!dk5YGBxSvr!Jjn|d~EM=b>XX=-Y*IosAtQX~R zK4R*Zjn{61ycFV%GxByI!0A@+ddTCNIOQQrB##>&nTOYp?h}Z7!ZZ>*4=*UqPUAF$~ok*7tUi&O?Sk9??(tq8FaetvIO8%R2ouE$Pe=ofD`lwP$ z|Mhl<$MEwWclgK)&%wlVS%Yp4*#5{@8kV|c)pii8_v@;Uq*^} zgKHbgXCuSw>ze8%a!Umx+PD)*ZHt<6q_cSsXd5kD`saN6`+PKbz@z8Wh|C0ucG* zSbGDATm(*Ox&l2uABkfriYy==n*%-8B?SM+BK5hmK#yspHa1pD0(wk4r4~JoO(!ep zajXX8EOufk3Mq`mIGI)GalqyOSb;Tc4D|Rvkt+*5R`O$sOBi*k;^K*o$ZI%d*w}FS zqsO0t45G(vs98AGwBrXXXPPPXX~s=ArGAc;pP{(I#2$1im~YNX!b!5=npGA+SvmbMy$6HyIyH&o?iI>Sm=rPr6EqZ(rxd=V}0_zu{$NYHd4SKA~ zQ-+N#dfdQz=0J}hWqD7ie9IEESl*M0t4REeT!bFiv7Qln9Eh&6)^ueCb(HKZ6g848 z`um;m2j7DHO!U|$CJ15@zYqRV%rQK+1pkk^2LJpYqDUoId|IwOcQz7*TzQ{6yB#$W z^!PqDeO5pr*fWr%dSQeQ$C9VHtTJpI#TF)4GVd8W?}+3nkl~=mN#>oaW7EkCnb@Mo zKW0ZR(6MF7M#ft7csXM&dVC_U!4jQ#LGn@-WYJ?n_zrq}KNFv=6IUc@*w{gj*D?#r_w=>|H|0h=yBj0HYR#}5*vALPz32510Bq6(c^^_Zqegi zOl;BPkFW*j>)u|J{4!%LdQ2sC2R(i_CFewsKh3_h=<(SU<)FvhKI5Xt)I|uZrR1=< z%}-XaEC)T_L2(Xxd?w=^^!N#7{1~xt<+$p^UiqaY0bS|8GOKajV6F9yxinwj zcBj%FG?din5M$wv!0zFq-g-b7nHufVo~j0A{k5vK#+rgv$M9k$^5PoU;%ltC*b_s3 zK*Mo5uctssvwBGgw63bf>jPkaD2*6nRaIHJeG8pSE02J~0haAGmKqHpV#@=NYQI3L zUFyKPF9OU1#ARcuZFsqG{f+M)%mgAV?L^IEh9T}lni|5iblI3{u5`pCOdjTAI&KCw z&Uoh`!1x*W7chM58E4`+M|6U{d)N*%lI`HSBHN1>rC=~74_I$@0_&GffbqTuajv|4 zbztuWpgEC(wKM(9DXA+jUme(ALLRS?ai)Gv2yo@)s{{KQ*8^;XVnfhg8s>G=tFo{4-I#M+^Qjv@D)PcPOKb& zvx68W;Ka!BIpK~?@@moEAe!o>q|NnafRl5Olsd3%OMq)BYyZHFSmS(jV8=5Z#vY#| zq^E1j=LPx2nhxl|s{W|KO~HPVPe#x$Y5r@P@)MZxatRspxru$~my0atTAF%gH+N=PN?gz9y}ob&SYaw0zzVSw;0Q0|VWm*= zEW^b-dL+QU5Qr#)4x%1vU$Mfac=-7QsIsua|3*-kSmCvJie+Pki?BjkckB~Z_-Bgg9ai}7sFh%a(z6j(Naf@H!wO3w zEl;fQeim%8LaG+^87rjzP+zb@pLK{dO;6)>i?G74GOnMo!e-Vp2UaM^bPlZWS9rZx ztng&k(_)3kqoPLBl;3hWu)^;l+2Ms1QrB3p!f&&yEmpXUy<{~_Ik$?~PFUeu=FN!} z9?QHID_qaS7At(79ci(`iy3RNLQ(I{7c1b)#uI9v4lpLea9cSYat!VKq(Pq?m57!k0K>ax_g( zWg{(C_*-VTSm6)~w^-p7Oq>%dyo0e8E2M>D2P>?gyAl$b)flASy;@F061HhumRy zqG>LqueGJ76yO99zR6Qcrc7^csnaY$zZ!$?^*>f9pC$c+7C!1_z=e6^g|u6Ss}EO> zuPcQYvRV=}2LDwgF1L1E>@jWtF?^eyNLmj~JY4(Amg!|sy{+0(1<+1Z5tXju)<&(8 zD*B}K{~b}k0|PGgt(TXAC)6c-q1IXHbeQy0C*{t{w-9tVfEvzt|Fp?dPWI-G#Z#|} zdpEoD98FiUg(|Tnaz~X^x3

yhUjP#hW#I)!EJ4AK;x{@}h;MibLj?NU1f@|WUm?DRizn_y62lcH_$)G2u0Da1FN zskjk|PoOp7EX66rH!M?}LVUy7ic^Shc$(sX_)>4?WE2zk!}*EhSeFG1VxNNX!iD4_ z#5a65n*laR)Ua+#6uT4n8V_{%IU=QvCwL=RBZc^e3h@okWe^36hU;oog;?V26m%X9 z`~}7F1nUx>&khQUfn^MjQEvP;{QDAqTKJLv@EC)R;K|B@_=a_fQOr}%5SDQVx%IjX zh~a<=i1>z03*kM2n#E^;aZ+M4d;t47Og?BQeL43onDQ?)X%IbPA zyo(CdLGg&h9+VK?t@4dd%woQK**8J)m;@2u@V>J}N-BY#gZcgs2sa@?#5er6n}wU0 z_$%{0aF1{b@eRMFN>GSz_^_(8LVUw-tMcX~hB4ox_enm5_=ey4o^bPrRW?+6;rEmj zh4_X~sC>&3A7j2J6<3icV$FUy4KD%!hKbGOe*BcQVT~82P*EVh^B~n{hLLRDNU|fz zqQ4ix9~#7WBABC^G82-vjesTKSA=a_?Lr{XHwdw!9sLlSlm7+$?ux*Bf)=4ydb{p zZ9#mYLb@Mfj^2*6g7}6S@eSiX!*F*dPhvSkKx_v5&pEN6IZHvS*|ef&Ea zwUZ;siTFZ=lwlOpN-+~OJ2*+i7b>Jbm)JrtP7ifoDl>E4Ru80Nho zxJqiG5MQW}K7wWh#T$}^?Cc9Q+noFr*-Fh`k|g3At_zaVwcGvVT*|5nP89xfKS{(l ztd^1m@#XfTutu_n#kc#(A5mPb=I`>8S2Dg%^Y{A6D;Qs|`G@@EP2|^W{xRQ+vk|-* zrQ43h0}u&-__6{~aDf+};qu3L$E*ea3e-FW@r4R0d0wPnu>9s=v#>yX>EVM*!~^l= zkmM!M{Ak`suVAPO;)~1lYjonVM0_EeWqR?i<9}3>(cW>qd;F2Sy)kGQIXuQY=s1pE zgd-RszmV|nz$PFxtP6^8M8U{w|b!tHuHV^86)5j957qIPg+QzJ})hm$B(E_YWKY%6kFoM(l4K z=M3QqA)Dd*-Z#Mo-hl4uVoWfWzjst1IurXKrR|c1dACFx&XxHGK1gU=hygt>sbMb(`y2*4H)GZ0n;jJB!>AWgkF<^F@RW z8h@y9;e&Lvx*DSDbn%N@HWC4s!^i8YTD(4NENH}`)%8lm=B7q7tf&=JyRlX&$kY#< zjgH*~*mSU|@+|`Y4#2+s3H!=f#eDR0zC*`#M)zG{-VoWiZ^N-jhqPRtWPYZ@#6$2M z@|atTt99Nh3^44e@H2f+=~#xz1FuJUUFnm~%SyKwFF3yWj59LMK!6kM-GX-HqsLl@ zdGqkM4Rz=A*~@ zu95lSzLz51I3-&CoB9F%i^dcqZb7;SB!&8C(vhk;kP3hN7|&aWz@Bj5i5M?)yO8Gu ziPw}v=1}0i?loc0^V)J}wQ`Y1*n@%l4%a2|+0m6At2;J1o{M#Q67rL?_!(Ke23ZU$ ztY!+E>o(VHXz@szxADE+QdhsRp@Ba2de6j%S3)N7;mb*}A7D2r#>eBNxWPuF?hKb5 z=@WQBzu9WBL;{ovZ2Dn$n;+<2Pwa zOK;>qt|`yoCI3TBf2-+hnhwIlk?|un9k1zPP5(pF7c~8orW`ZOcci8%O-nUBL({V~ zy+G4VntnjjD>S`H)30iJpQhi{^jS>-yh*u#(lo>XmilX2tm$c*F41&_rq!ChU(-)% zdb6f?X!=b}pVRb3O<&V=Fju+I{-mZ8G@YjDJWbEhbe*P6nqI2u)tY`m(|^+RVNHLe z>8~~YFHMKXRrzOX`W{U`uIY7}zM|=Cnik+8%6cC~iZOPyrWfh(jU3+y=eyX&iP7w? zap8?vyJ@n9cze``osz#k>~nZd!DZmWw8NY3#ttv4KJ@>*XCu8>>c|o^{Y!WHuLJgV z4~>1@(>ci0HN`OVymIklaR-6^3OG27b!GWH=h^1_AtZ-=-5HEJ1on01+|wLqo8O9-So^x& zoo#+MYa7|u#R zCKsv0{wuFWqz;>Tws{-t7pcSE!}2oJVZ#h{*f2vKHvG0KZ%*PnEH6@rZRYjPP=^g8 zby$Lz`PtVU&ss<7umKIC8g*C}>!`z$#d^PJ3)2*6raG)mT#I^*)QR&^ht)}~I&35g zrRA*-`%ctI?CWxt<(zH4jJ;&lVdX%0!*;T-dnEJbw6A+CMOpj0$1|~2hrOB|Y3=Kt z%2=xod)S<9zLt$})L~ymw*egG94#a`Dw`rYtHTOj>!`!N3u45+t~>y&I_xhww1@b- zgak*QV5fAW4m%#{1RVVpyUVJ>iq&VU4*Mo!bF0G!`%$VvE!<+rI7< zOl;L*sh)~dtCC^=Id7U1Z8()#A)r`fkw9d-ppIqI-~rYuJt zwvh4v2xpt~Ud3hl3C7&97qQWOQ-{?Lj@;_7!Tq=Z{@|Ek=Sm&+6ij>kub_N?mJCuP z@XDEL?HE9#GbDQD*qcx(UtY7h%-m?kbkf^c0sT){AXjsgtDb3Y27K<9Y@qyFeocki>sbByj*k%)_ki0cqKq zr%7eyMO6)3fz-mv?j{e*uUPU>nCr!I5_dgS(6LnjnxlxQ*#IcFvbtfDLavGKZr%uJ z_N{B8cfh>v!7#7eB`#TR-UXnT5QxjhC2t3gLp*`+AWR7&JnBTvW2PZ)i>8J!EnPM) znJZlyX-yvHW4e5B$v+?y-+sm!8QHkxy=(^>$#!skk?oD+w;Vr{2VO6Yoz)+50*v=P zh;xeZ9z#blKjo1cdDZZnJn(vV;bkuKI5KdipR;kvry$Stb9cDpvyex8#5hw{HZJ)~ zr+%DInEHJjev^kX{(#67J=&SL9pK&ezTniaJ6!TetoPn)8VMPc$KP$5f{6PraHBHA zfSPi%^-=$Zbot8~|? zS=0a3G>+#8^Yh3g(gFLqsvrJQ?B|Zf3y9Z!il*E|gFl8}9KR9xjlyq?x4naBiHmgSUo)`CkCuP5edpY&_Sjt5 z++EkUw{XPHeWIh;-nPFmy?x&>uVSx9z12Oi#|xd)kUF0!{HRO1ZWrwJ?&^p`&y#ru zAx$CTo6D6xD9hxJwtYv8xV3|NuuMmtQQGu1b&9bq-gT7m602wOy@L9cRb1QQrB?0J zI<)&^(1-QP+x9-#w0$4#1mjW-6&+Mv=CVDvc7&+=oIN``Uf8#@Bj#P(@nZGPjQEWZx@e?98E z9BIzl$G*Y7nxQ4{*$LfOo}ap6ALZi}v*eA`GwAc>`!Syz%J2(tt~+qt^Rd$k`78Fb z580MiPzKLgW#7CE{~-9;PV!8LU2+|-LKn9%jkbIEp}#SNU-HuJ`yWp4+3O>GQ3}@{ zzc_v|{6^q63cu0#rSY4N-vay|LVC6>t@}$2hqnFdS}1C4F-!Y!U3l$Sm+b3Si_XtC zZ3EJF*73EvyaTqIk39kh<>GYLL5s27>9{0Rdr!h7<@geKLebtmsqjeuD8C#JsWF3~ z18on29Shby7nWJhEL1@!6)qlWvYjwJBU`G(v#Cs)qRh-Dc>GXZ1Yy5osgsoGik}e4 z8)U0`BFfCLDg6!|fJ1D@;Je5x!#|7-xEMrx-cyS4-U+|Y5oSzGe;RM_!OFz+ZAb|d z)2s_Lji=#0GA5>}J7r8vL*e)+oH?u`T-G1fIP9iFP>#}X45rMY-w z7%~{HF!5c8Fq~F6UWlL`Oia@RLR>KH~QrY~kWk%{TE85fzD-i4Ngk%{RG(8O?N zk+gqALNNbXiW`-vpp?kOG$&o*Y!x>qv4&DIO-$1Yl%sHbGHS*?g=i=olM{vG&r+zx z)W3yHJz?r~C|S;|m7a|-^+A-hT2&~P7{US~6Vt3q*ees$PoWTE>Wi5(GBF)eYPN~# z^I5PpG5tH_>>5+obyJwSV&VxJf3cYQYm}7(Q~x@9?rxQDbmCLY7h&pDjklP33AxC` z^b*R9F!fbzLN73NRoN9w~b71O?Ebj@GZ&^Zs&LWVtOc9i>YsBM_Lop$1&Do z>T+nG z3@RMs9hQNqf0oi5Or0C~pm3aRVp{AaIGFk%h!IR(9sm|o{~pV+CZ^?>-+VCj?d&d# zsTZ>q7E}LM#^%P?e^`Gt0-)th7H)j8LyY!L&6!?iyzL0Ta*nx8kdn z5+71hQA)YCSPeDha*=rM3F|$70TcSGPJo*7LMe2Gm-2tZOh5IRcaP*x`Cmjo`TyaQ zeN2Lio@Z&NvQ?k*8T5h#E9={{=D^lK*d?2`NrKTeQ{h-z!00@$*Rce=O@S zl8$M%kk#p4`~U2H34B%6wf>os+~i(E1g;D+Tu4wrNG_A0Qbml4h#CN;K8sdkt95?$wYFMoTNG-mPp#J4)}gO~m}(tbUTdqZzWV>Zwbwr9+>ijG zwZq^2%guMzp3gq}jNe*oYrZn~du$GYsjZTu4BbUsq3crSv#xvEu)7ciLvZP{J8TIj zV#XhYrz6+x&B%RLuv5>lPtHD*S^insmdDCZ6)KkOP@zIT*L*w*6&3E0BgR!!_{+-2 zj2%O$s2Ed`9q;dX)7aXv$BrH~Iy=rkw_)t)Yy~o1>^6+|@4tYi~G& z`Isa9WVv5l?$0mxOUhw%?w?T(lXAbVVcdvuFg*8{mygK841NDw)*k7vzhL?V|D09j z6SCRW^^G-0E&M^n=wpv&xwFwU0vhtqD))Pp`@eTqm7{q1*fIN!c?V4{fbP4CnX;W- zdi-ns9HjTL7FOV+s;d29VOLHK3=VZ`H14&{w1YBQaatwtoogeS+>}85^)S1X0vM?bQ5?5vSIhMchrn) zH%!0bt9nJ_(yUXxybi|Ai)yV4b@)~n*?L%C2=CSz`L}FwOXK{-_46{+uZL%&2BV?S zJOQ@#IYW?h%;=$=9@}mG+aEskAl?CLJhar;IZ?xGPn$N{5z#@#!aQ&g53Y8jN8_)6fMK;|IX@x#C`uUoLI>wz~kEn7@)?0PCjp6zk9Ks2>zx^Zw2 zPDnV?wZ0C>X*#>+@80aC%nR|vASyl8EwYD=O|?8XjH(ruF5r>{)by!tu~D(L3$U05 z<`H+odXN8STLU~CDa>$liQSP4e7kPB-J3e>{QRaRutHt7cv(yRJW)o(n9ES(VZ3P> zMn=vwTq@vv0+*Qm$Jdytf@xFTunYsFr(1(uT9JRTjI*hbQBIB zrmlX;IhjLe9+MfH%}zLL+~_eQoI}ZC*U*;^+#+E!56Kf}RUUJclkX*5r@ZByMN4aH zf$%ONxWI0q`f^;JmpbKgB9+&+v|zKocG>*un%deW^=CWf%wl317dJG;<%Nxl>*I36 zlA1+15zWhL7b6N)MwQfHcjq(eV|AU-rH)ekre|-3q~35x4ntWf9@!!BIf2hn%*W@6 zVJhQ^+=Ot$h|J5dAAZaqCWjkLHFXlHS76IfW`T6nLq5 zb(|H*%l*KsM7STFb(D_BgIcDGc021RO&$?FS8@OBxYT0X_5qvDQs`PxC&mUl&Yg9X zDp6k>GO>SnZVBt7y>+a(b1UZWONg_?ZD4);-J)pY59q&ZI!b3D->&E=eF6C%vX#f$V%xF9 z={$_erf_Z{p87N#7w#AL713dMe~9Dk%fcFBn>I=?9{)+|D9u6Z9!8eOA_}f(70n1E zOgi(LVA9*HsO4XY$<#{P7L!^3+cBBxYr>s2_49qi1XKUqaKK%eFZP|p_Ls8F&tq%f zQJBv9uaBj({nnVw^vy9DVi^7&I$4U5m~ zw1Me$Rsd2y1HXsy3JuAi^KC4^m7B=t8Q3cvk+?G+N!?V@JVRJnx|%uJb8kfjQQp{t)u; zTZK13^#_5dTIBJHJa3pjRq&CbH1RgQ^9ss{+%MnoB5I)KVW~wgB6cd zBo)c@I>oaTzp8k*;&&9ER{WJBorO#Niu)_l(w^}%73V67{vhH-e-J48gFw+A1d9G3 zQ1l0ZqCW@}{Xt+KTsT;-=nn#)QCZfhfc%=uBypK9A9IGt=Qd)Q;yA^ripML?RcuoH zyyBILH!9w(_>kh`ioaBRP4QjD1ST-s@2gm$c!=UO#gi2q6vb69%6&oQn-uR=6#YS@ z|4L<9rvmbODi`5gVY~elhbvB0JVNnA#d(S?imMf`QT(dnHx)N2KBw5O7$i));}s86 zJYVq=#SX`~!`#YO>`z4h_f;IPc#Ps~BJ$5syh`J*SNTT8TQ&Y}mA|g|U5$TK z<;N6X*7$anUse3Q#{XI6zbew_3Hw<{M1S^B?5FV=mCF<-Yy6QaAFX(S#;;ZR3o36= z`6k5&H2zVQA5(l;<6lwvHN|Zj|E|jKEBbhsVZZlOEK{WI1mn-(bp-pGL#wh05ove2L0esC>Q3H>!Mx%J-=JW0jv&`4yF4 zQ~7O`-&Hx_exN^cJw|^9sGQOL!|BqEpPJ?+_{7s-HBWc$r)JmJFL@vDY6v-cr^U|b z-%__PDETsU3a>PJo6y-zL3fb4f?ewJSwA%Kr8|NiP7=p3FH-f(*JM$2E9e7dwItoQ zAX7qB;Gi3Z84TjA7dMKAI7juWKytEIEN?2xI|*}W52pF(fT^h%sj4Bz)E?{v>nhP~ zc_!PQX@^R7J&m>2s_Z_i&X9+#k|h? ze4N}|r6Z=}7t`HCVl~fp9y3*%%gDClj6|f%(jM=Va6~gOfa;qpY7qo^{6vTaIwoSO z)--|`P z^~_SR#|(6j&Pt#`ml8F!k&J-?SuwtF`}>*tgOoV2P$`kBV>K$JQe2tbN~%FOQ|jmq z{+!Q9g?s>d2^+FUm``s(J_V(qL6?%n5XRd5SdJ8boNe`N^xYqCq(tg;wll#VY6_)^M(UmV25XsQq`s;DW7+{m8j#w?v;&QlaZ2__6MWvG23<-tb}AW#0Z7f{ zULH<~8g!|C+&GfE0ntlc!dj;ragFB`9)aW+>^@@2jw>NIpe<_9nUOt-QLLECkN(M~ z3qk5OcIcFABrTC*U;I-!K)PfH>n-Gy+HLsB01kGzWCx@6_!<7)f<~c1m-+zPegk9J z#(%Pn`Pv4K11FR}lv$dN#O5BDC1Up#YS3vxvt);sGa7V8NThCIm3Ofqmh4FF!Mg4? zl3lVx9wbXkQWvtZdri5%sdt$3evS>6>`1Mn^zGxNmQ3o`%=y6iB9*0ju!Zm3DAMp$ z9!K~gI?eP-?UEg)1-oR2>9bw3!?ZU!bq8yC^g$^%B{haax#`Cu*(EznEtM(JQF+{y zn~{2$eR;x2RjFR==Tj5-h*df(^$Kfw_G#IN*^Vc7s=S_+s8w_+#L-hPioIAK<4t8i zj}Ok&pc@IH=UKU#Dca1-vE7>`dITrqe@~8p`yx7E>Xj|6cNNn)CQ-X6MJ19#?qhh} zz>K6STPWl5%ze2WaiT$YEq8CCXZF@fFGW0bJsk) z$vivFGZPwgJR^NB*%5H#Y>y|KXwdQ17hY+eM|N4V<1r?D-a8WG#E%Hi3m2YU!nGp-peCvb;9dlEI?lM+>iYM=~Sh7Pr6P>D~JuOXLQE1SWNam_^ z9?Q=0)=5uhr>j}^G;b4tOLqK-?Vhe;bNUdLtyXbG`YdLi>-CYL#gZMHDc5-Wii{;Y zAUb}nv@9BQ3s_s76qhACPG;NlRK}7Wd`g4{9UJ#cv1G^9Y_36NEZM=gQE1Sabi8sG zawm8)%CPlwysu!`5(S0qKp0)%6i$rGShAxUvMkwA#11rhlzEUYqS)*;iMYZk7Qm z<|}K<;0KK?YJd%p^r`_3i?9gC06ELA3I+~Zg5})ZVQkv18eD^X`}n8_-FO#mn-53M znW)rr-^1f1^|+W7e;k2tLALudp2`2gAOo zHpaQ*`)HhIHVOx!W=ki!*t+pB^(NS#Ccj*Fj++B)p*;AWAY; z>84sVDs***oYe=SbwsFKf?cs3_>AKYJGy%2;fI|#^Ms>LI=p%o;ybAyY>r^(9eGqk_P+!HU z8W|42xMmTBl-ihLQka+Tb~ysR`5RS+96h71G-9lZkkvLa+DnEFFkP5mvuIHbzUa?i zjIB=E6W9;*&1k!*_K|3za6J&!vv8K9ccOK&6s02t2k2$R&V=o?G*qRj3w57Riw-AK zsM9jFaXv=@gvbg}f?8CYqxEGKa5}4(sb3qrOpbKksL-4^1Da>*G)Gmc(Ea&~m(}4! z)R`B$$%&L_a+Jx8n$5hHrs@Sy=b%oHXsdB7&C)zZ!^0|^*g=pJADN*J#9iv7A*VVh zM)OR)^caPnPc=nm9#dYkbm@}D+GR^|rtWeeC(ipjA5a*^ZPNITaChn`wMP=3USR zn|3fFV$seW*pFTDWitWa;V!Y2pboo99xGnogBU0~E<`&nwXrhTbT;Di8~4oyJI<#g zB3|D{)K`Kyjx)Z*h4t|e+dg2^*@pUfEN!r9o%KYXiS-Xf!ul@8wk^Xtdf;U+!wn5K zZ8hY0|9%_*zeTqJ65aseKgkL}+wNW1#$0K(Nu~I9 zOI-pRY(DA>*g3_tLy_+xn+a(15zWJpNn8kDHYJGUD@+gk*j0`@_cdPM`Is+55od#~ z&&n3#@t=gA2#;kH;;pm)oH!RTI7SQ^{HO=OkFPdx+`{J@Jo$n3x6gsj z+2NKM-vP+XYtK%(W$Yle`aB@VpEyGCGm6s`k5fEJ@eIXfidQLKuXwxSw-h%k{zUO* z#a9*op!iqCG=`h~p-B^wpS6hd6`K_4gNyN(E7J6j^6iS>Qrx8YtRlaUFy9{(`SqGI z?R$xR757yJjF{D zA5r{?BCUg2-(M8@<(o3UFcHfXxu`1TUn%}Z@lT2Y7zd_anrDI~5;P{E_0%6+0CFq?m^Z%yMbPVTzL#XDFViI8U)f@fyV&74KGjNbyC* z*A@Swm?$vq_EFqNae`u{;t7hiif1XVR9vsvs(7E`M#X0o+Z4Ac?ui>5_xn)AD#c3` zuT%Vk;$IX4TvS=Ex8h(T=31$u_{)XNdmi~{A$A~Rx4Yp8Tk2{ShZJFErySvgU0=)M zeUM@ZU2=pO`bF7zO@~tgza^P3chCn+BD+0j$O=-HSA_4B1oPT_;1%f;Cb1)aF_BCj zjOUL}eTDp;`Nd3Uryb6ZIVE}glyICQ+faE$r1?aw39cO;iZEL zHr7iAzX`{@bnr{Qdg*wFDcyMKFr|VFDvEjO_%6iAOUEWkL;0{R93u@x)k_DzREAzU zhC@&<9ps4AOUDnDY??M_xMCQ<`YX^-ey^T0$=!2U7~YbdZkes!Ar;M$o9|WrQ=@oNI1rJ4t3*{cr^7 z+PIiVi$@xpno9FqbN604=-?pcrQ>pDj=XgIkpmfd>9~QZk(Z9sm>PNMXyFlwymUOt zX%%_tpecIHO9wxp$Gmj#VLRrfqlKxFmkyqpaW5UKS#``y$A#R9*vc1ESzF9Y$G()e z_tGH_8e(2L&OkN7G0FuX^3p+lm6(?f@l~@cUOHTMEArC82l<$n4if%5^3pK|+2bo; z9LM~TmySIsMqWCqSb5~7<6fplUOJxQ07PCo9%E|crDHJ5MqWCW@+f!frK62wA9?8@ z;qJ%0bX2mgn3s+$(_>ybZemYjUOJv-bulj;S28{3rQ-^w$GmjhKzT=AI_^P+596hS zuTL>A9WS%}-SN`FbJcq3*ub6sJ9+8wX%|+o-|z8so`SX%x(mV)YBTDx!#@xEU(omp zk`3W_CX(EJ-64o(7>}P4j+r>&n3;z@dm-UCocWb-91$ZN_x>IpvD`-Nt9z)_$@=)1 zW!*{~FdWbQE?7)3l?O-z#~ViT0MkH18O^D&1`d-3GACePLI)GhWsp3hQ28mdIhxjy z6=GCbVOdsur7Y<7C$;Kb5#T)X0bCn7^6Xz^E7;6$hRuRZ}kS$dd!mLmd5_KUH2o#HGgVMU)Qu~ z5y|9oI04u#inL2x`uMHF-atTw<#1!~kF(@S!{hF&sAA$eIbjjFHmfKfnw_m6kA`Q*!lv+))$z-iOu@^D2lBwkAZHU!d6f0>#!BD7L;pvGoOttuIh)eSu=@3lv*lpxF8X z#nu-nw!T2I^#zKpFED`#%>Ik5FHmfKfnw_moTlkw>kC?oSNH43}xvmA*ut0K=lYIu4 zk`vmUjjen7nO0nuTlXA-)9hjA<_^1FgqwZ2V+`_)%^v2t*^Pm_@d^+7TXZ8i;I?Zz ziZefb^@9?3t2^exw!rDxzIsaQmfwBwL6MtzxuZDy(^mthSNjJgK~FDxVM#W7SkDhi zd@KO9v4d@+E?k9AXvYv2xmYX1&Ai|7LDt*KIE+;hw-3VhyQpt8Fk3QpYa7@m8u$@9*^000RWSD@ox<6sMhA!<^Ew2n4RW)G^a+g7fOf~azmtM%vwbCrG zcBTnqKUx?qc5p~)GVUWq)~GdUjapMt7TRt*PvVEUfDp*>dt0_)iwJb_pyk;05Evg6 z1fOI4jr=#<|B%Ye09|Ah8=z`9TVTNB&dv9QtRlRe>Mequ`og_BgyWKv#GP(z^b1XQvC(!%q|B=67$rOw%x5$Qi8NDVyb9*Kg%xP9X;UHFZ6-YqfoF*gHm&nJdj|Wl z0-3lUyx-dWn2Bv$2Aj^8aN@nk4GlK!Sjf1&hv9nE$8lhNL|Y%<#aYIjzgXc317x=m z9kz8wY@6}dBOlLu8|?9DKt#OV*4XjDX4vj|*tUIT9h*@f$J7R!wj2@h`tFPE2k$C& zKja2s3j^OqeVLeS>$@Cr@%kQ&^{)rgY<)Ljn`LaDdL!Wx$Tl#IzdIFe{PW1i=Or7M zhk>^obg5Yc{M!Q$E`zK9wE6f>iF{$$5BVMqr6?cs$B)w`*r_Rqgc>y7EzN$E0J*R6 z`hJXi^^u6P!M1B>_huLo?=8!7rbWS*l|kb& zk8~8eTH7;9WqrNGij;A@2JzkfpjZa!Yo}XH>~2sdi+y%~~# z6h(V+&AIFq9e5W&9Lq9E;+y#*n8C=fovw5L?HZKYtydZBf%1d7`DdX4X-^%Yy zr*-6V-))>(xCZhvf*B;&iTh;RoD%M6M0q`s45u?j6*PE7q~XZrU5HfpnRy-CPz7C! z3#s~<$!}qG{?LNUklD{ngH*u9IQ*`4K(z($ePppZpnhrc3RLLR>mQBTlf3o%LuZK; zIKfzovQk@6gPV#!tO6-e@c0|zJ#k*)jg_9tN^P&8r+vK<$zL%wt^?}rXX+1So8gJ*ETd-J#{E1M1yrghWzwXhI#(u^h)79Z>I{n`Goll6))n?ltB5 zCeLEWLLJaQGf$`kdJCmc2lPhvFVq1oWm=97sP{e7g7Gusec$xi_?hv3VA`9UyPzQr96O z@m>7mVV1KD{z3jbF5}IHx>TP>kDS1JDt$lqV4}xLFxS&ZAg^b&JcIP4xR^*&jV(+~ zrR7`m!CJN?eE{o-R%+|TvWIGFHq8|ky+{Z2CmhI1O`Vip$ka#&bQM!09Z;(GdDAs> zW%>tfDAEC?`yDS@sf~J--f^0_Dt!mbMk}>ZN!*KcKxO7E6W?9pXXb2H9n%3lnL82F z0X>Jc#dJXXQ{G+&bU*G+Ob2uds!4eTZdxv_kq+o_>`kE@Li(BE0(IUFbU??Tcg5aN zH~kA{jC4Thoy?0?Y7?8P?pJE_PGWXlsm;SmZNs>ek)N4%RvzhqE@SRU2Xr+vM>?Qy zasW=%(Vmv3XCyDu0j1ui7wLc=&YE*|K)ustZ8Wd6IsF{RKGFddcPB9&&_>o3(*ezA zQ?=5v_?h8bu@}<;-OTD@I-n0SJ*ESC0n=kTpzA2_KnK*j85wp}2h_t#Z4a=+P2S7| z0H>B%?CnGcbO@S|({`ZK_ga+OhN;?*=PC}H z85)~*^Mjv$ApO{V#mH-od}kFECG(xNTHI-vZG34w(`=#p^XeP0jj_dpA_f&tZTq@M zmXGm!uR7ZASMJZ8?)RDQub5s@G2Ty?`?DKHXYq;lPy9@~NWRpbh9ob*C)n-2zw$lI z1|HBE#et}5@V!`Ca_GsGE9%i{wk)l~>|JR|+UH-U??6k^Rs;VT=fb0dbxC6VO+@Zg zKKxhJ>VHke$ld!CEwj2p4oNxOrF5%Ysm?Jzp7oIEWrn^v#KnnqFw)5#igi>Y4pJ~} z;N&Fd%ey*lfwG=>byuf3e_vI~?NlhMt=AtY|D8kMEKTwi{+~+&GRHI0KSu3w5mwWY zV_3b2u85#92?zWfB~AnQFFLb&VGTVFg|2{V=FvmHx{8@!4{ugjVM(To)z+*-%tu~! z2+MqN!8x?tX~7{J&#u=N60O#M_(DSe4vPr!-hjKad_&~Lems8hi$5MeBn-iS=9Bvt z@D+)T{xOYVU;J=`*=auV0=5h`rM~lG5q6WDhuvnrYTU?p7qh{p@nts_?W~6$8+Bax zSrDH_!*BNFJZu?kIuGFWe@-mIZcay9yuRx(P~0!p2i1(QKFf_DNd@pikDn#S}m>$YZdhT`LESDeS!kO6b5+2%VH z`F4f#Sb==}{9uFK52AV2F)1td0wR*nM)-6s3wbXaY<*U?7?0mM z=MnD-+l#kIIW}-;z?Ye7TcQj%myw9Ac!JB0l0vdv7TwFobMh z^ap`uDvSOgWYHf4ivA!_^ap{WKL`~4L7;qg0E+$~aI@AU`h$=~e-J48gFw+A1d9G3 zQ1l0Z2V;t`KSwHx{vc%09|Vg2AW-xNfucVM6#YS<=nn!#e-N0$6k~nzF%&5JgFw+A z1j;uZ;9Sio`h$=~e-J3&i-4j(2o(K6;G3FX^amk}{vfaqrZC$R{XwAU4+2Gh5GeYC zz;`sC=np~`{XwAU4+2Gh5GeYCK+zur&c(%>^^5)>Q1l0ZqCW@}{XwAU4+2Gh5GeYC zK+zurivA!_^ap_nOkmb4`h!5x9|Vg2AaI(di~b;F(H{hg{vc5F2Z5qL2o(K6py&?* zMSl<|`h!5x9|Vg2AW-xNfucVM6#YS<=nn!#e-J48gFw+A1g@rDAW-xNfnQZw^amkt zQd#r|A-Ah6`h$=~e-L;WZZ@n(^ap{WKL`~4K_Gq9GW~rb<|Z#S!u1gmKSVLZd5?5n zUw6rmOH*_G;t#o({Brr?joZEoG-i4T`6w>ooM zxBTsc58j||AVwPcchC{cv~J1Z@JRfW)-8(;0Z-@5YA-+;FS~jx^90C)+e8ulz(_u) ziu#0Gz^k*9$+TvOi+opW)HLgd&wxAdIy0nQh4`(-<{-cgRl85XR z$anTtokb@LZW47CqfQ^~lIKJ{Ql?A3(drAvNyZ>j9{iMV#9AD?vd+a0`9`jIQOspJ zj_O6l$c&0uHN>b=I^W>wC5M$P2foqBe_WOj=`P{5RDII$yPW!@@sS5UX?W)b5lM$# z)+bFXQwj_p84NAh8)eid&Am+NnvV=jso)7VnJD7J7S_E;HlW_fCk<~OF`qQN`>0Qv zL($35C(SPruRdw$_)LA$@Ohs;X}JD{ALk>j->v%4R7C(Pa57tBcC*HGcEK< zGn=&>X!ayy_((pR?A#~K6Rb4iBRLcNo$!&Dp=I$&BO@E~kz-iX$)*cIasev}`AGKV z!}+B78ycZcnrB!t z`zHTLDdZzJ^Js*8}SYF2CqZ3d?bs<_(+QQ>Q25OxDNH_@{v(y;UhKk zuJDnXHR2<~s?gdl^O3XBBj`drm0rhPk9^W(I7$&8*)uLC(&8J&rl!)PSoUC#9q>v^ z(j$Rb_kuhM*S&a)sfTK6Hq8g$m`|FkIgpW0nj@GR@sYCFNW@2uaFH7Mq*=>`B0iFj z;xV5z-(}|GwB4%oIEoP;IfR)bK9Xl<+$YUsRvqIb$8Z2*eB^sfkMWUhl(*+2sg#a& zFMf&I_gaQ0SNgFMpEPm-i1^4hcCOGJf?CK&Qi}!aUYy5g-BPZ5aUiyO1m*a@*TeWX z6!~P`i~nN%5g$2<xt}h(vtk zYVJYglV&4RBR=wZrbc|^VAh<=M`GOz-pR;Eeu-ll@sazosu&;nSJoBdBimS6%qPt( zrpNfm%UE5Ek35X&F+TEerpNfmS(JCcM+WuCu&aC|{Kllu<-kRJWZ;l#nzdo%)E z*Px4J#P+_OO@Ep7-Y-qFS>9{i(@bmsC9R!cS~J2-C&M!?@;>u5_n6`!vdIUbfQ75?&7 z{=(@M$5!}*AF4R&=%Yt>&7G12wSkAevbc9;ab}%+v3HTbHdvF_TN9Z!T+$7xqwr90p`bqK)>L1h@L zX0%k-t-uFJS^FSb5X7$TU>642ZlRCdRTwNuP1;k|DA-l<^PiLU{MbCl?3^ey)3`cx z7-JR=*+s80i<*}$sW*mEAHjpnr~D~2U%=Wf+<$ycb?q{&tb;jR-LPzNouenohhj0vu;PA*V}3kGN$4&gxf@%C8JX{fScKi2+9}@~xIyynXoJm1ZZ{U~q_AUr z;N*VbX)xT6nb@{vu<6`_@6UI|BJ5^od$u_kQ0^D&BieDP#kMVjP3TGC!x}d<*l{Me z8}Hvd)R#dV>%&*Ou)Y>-$LqTm^^HKB4K|J3ZoIxVvHoF~!ul@8wk^XtzK8lU+|Xdt zRzr^0cLnMzK^*&sB4K@B#5T+D_%ZwniBuZ4foc5RqG;pq06E1rvLD3zdah8vRO@8Oe%JU9dU zK#mu~9R`l`kWe!7Y2QwAMJG8vM_B&oPU$?4Y+(9)D*!3;ys&}taw`BSuf&gi9gZLS zdlAqErkkg1D9)7`D?0lC9`e=PXm+Z@hf4a2!vnfR(*pg>>YBQy=fvsI$2iqxPmxM~%^g4vr_fH30KHOT-B|n}`X$nYfp6g)jhQ(l03^ zGv^1_PJfMvdHp64*TZc@ygT&9v>1q!f%C+}$;Mf?Q~n(Xy0gvSc$P!_L5jRqQ$AKv z_;<()R9>Sf{5#?|sCRA-Ah6{5xdf-+{uv1BHJF3jYoi{vG&c!n7m&JLCe~G|00j z6~%uK;zv;iRwc^!@_gP}%XJ6; zEb{uxd=0u@DqQVNYYe7p!J7E}Y zBvx})@nESrZAP{oXDeozI}9lvjb~s^yLW)8z27)y4DyuH<}EM3fFEhSyOAHZwF?1> zynK?uYFk^dQi=>sa83l76Y)PmHy6PWCK#VS|A7rzV%fLN!LkeOCz6|x0xmmsGcXt^ zEtNW{nUsds;J>V|au-?)N^gSb_h!w*$khaapNB5{y?(=NB(uO}&p`LSg-vkTsc}Gm zBx7I`R9t-~7;000kP@Clr9?{XbyZ5G4q!2rl*^teb=EYETaZsi zDR9}TGtobPtlf`&k>ZcDtuAHScq1iJw9@k@7%7z!;%0v%m81@4+C(GuP6?4a$w+-u z?=kHFBMnHkvV{YUlyOS-M-%ifPcA!kF4HO*g#kzje{eV@zjURWq79dSBzFU%ml9rh zx)IlSPT>*A_k!KW!A{AQkZCAOF58UkNsMB}v|RL0HeCo(G(7fCxkl0wDfY!bl>_9L zUgBZ^S#Kfl;J4u?131{()9n#3YLB1c->GO6Tz2aJuF|`#6MNuu3lE__}?=v7~5L^`=-yvw$}fFX>W4sYbfDA`k<7Xl6svjZ2GZChZR>ZL@ke* zS}Ic`ne%Z|ZboVub3S3Ds?;Wq)l(C2ukcD|rLLv)?9;LjvmLL78+kn|QQl<%F<0+J z(Jq-z3f-g4B)M$1)AOv{%oJ_r<=F1c50h8qaM`!;t`9DIDKj6csoC^7%skcO?s}!;(|a&;rKV0ww=(k)9#^6FN++jj zmy7jP%q3__`b=h?u9+*-bC`OxrcO&A&0{jd+azUYq_;Bjahka*{T6qj%HuJ?0Zh~1 zFbKj6B=hVv&rERHJR`-nR`e#$_IR@SrB8b4OIg`D-t)-rm%f~r77dKgdq-k?{L;3( zG^rDC*;^$2%{&|ej&^<_tM%OuRI}GAo)gv*voYrGEQzt`jV_eYG9aM^EhxJq5du^PTmfXg;we)<}AYMA?iq^6ugZty2p4bSm7 zkHBT~d(t!HvInuY$hP(g7C%`>EJ&|n<+EX<&9)Nh!@@GW;IcOXywU~fAF}M}DmJI7_5m*2q^>Zk5p%shGPEn* z^ygT(#@koqOWZU>$FG%^#kQ78UEs1=+%LV=O_#9W^HjdaP2bCedX?{Y)9cw>gUS!P z>6cl4zRGwNE96e_WRzj+=Xk9cwnRZ8I}k=gxqV_>?&I{ShP;hjw)CXQqs)V}Kl{_{ zHHo;wDdYw(TvGi&r;t-}2>PgUU!F(X$Yt|f#bIj0Aok-TTBw_CI)(p*|6xyHTg$V@ z?Zwj@lZJ^s0-izrIeQV0XvDlE@sHzwA@yT9x9q&2AuhOVS=Rp3#i1g^rz@Q-Su}ca)8hKBS31#G zl8?kTgCeY1G9L!Jm`EY>T*{SB8ohkSb@}Zs?gKH-BWIA-d3}@qh{ME1sKYa|tY2cf zDREtq#2HC3|EhD0@TyzpHG&grgyCEcJBDvqah?b(tS^9E+hF)leDA7RxU_LmyJ$wMmClW%}p&Zebo17XEzL` zL*5T_wQ1Szdc#EF#-eziDVt*m0{eQOSFmZdS@Tum1`St~DFysV{uUNz0nY0_#e zn~j01Xby0f#6Y;(BZ|kb+2wj*t$5t(=l{rbPR%=_mNEb3$ zR2!eOGFQ1mOXn4T)Iir7(@W>2d)6Y?e1#5|nVG+MSsl*i>V=Io;;mhHra9juTjQM7 zfQsMel;%0!!0giQ0* zEz;7zrn}Snh2@6d{fD_Z1*HeZ1CPae7vT4fjBXR;wglW8Kip8laBUwva6#&gAImcz zWj=IM#|;UobX80_mJI5{SCw%xlBfjQM|D==ubmg0r$C@F7A30MDUl^oxbf*VvYM(yN zwi`012OuNQxt;Qin5e=t0*5j`aD?J#6sIX3r+AX$8H&pkuTtbkE!M-gf8w_kH!J=` z@nywV75||4S4A3+uzacF7{&RDO^RGfmiaDM6laHQU*&Hp@{<YuZ zmnuG@_!Gr96vf9F$`#<6!18IuGDUgOMf|T+{*B_F6oWidu9xCa#W9Lg6pvFpU2&1( z`HGh-Zcw~a@j=BODgIosL-9|Fd6>Y`f5l;nlNDzuo~Srau|@G3#TymxR(weDMa9<@ z|Du>EFzxnH+(&VOVx{5IifrF9>|-gn}-@#BR++y#5zh0w1+ z$l(RK=7+4;k-4S=YIOZ>l97OUXAz@+HspGN@TC?a5IN(WxhmaO^1`Y z_BN;L(c7HtwYRy>bGPDDc*x1ZE*G}Ac8!p}DC0Xbx8RD6v}-$@s!dqm1L!>0Q3QKn zH@mtg{r#dWPEliL{0i)C^RP|3U)u1#z9aiv%TY#ryp0TQgDDh^ z1K=}oTh50Yz`q)vVl$#0^7l~TzwV$!Y~ z+-^ZB8r;5u@$o|kz`tNSp#$JvtT}W5OeV&kV0x5F(uJoVIsgVu2$IsI^-kW$T0#fF z!zqOhfG=b%xekDbq8Tx`&zeF9 z!2ijLLW5iO<--}=(%CZ&Zuelx(BPJeP=03zzz?zE$N})t5JQrZmK7_%o>F4BR z0n3F3w=L{vjssvnbO8J`+k4!Un~}Vb8X4U3%#0h{p2MnR2Dfv$6ETC^gIQb5;C3M8 z?G0{4Un6F4dlae>l2R@Jk-_agY(8=T+?S)U1B2TJ^iD|1HfD?rZkMo{$l%svr@J?} z^+qFm+~BsH`6H5&x`Z)<+Zn7pGPu2hnInT+QQ3$b0Ee#waU?-JBUerIQV z)(#}$Xik019m61Ew*=yZUZEI z7X0BPD*$buI`fg&>>?leU%SXhz6?Tb3K}CH$?;}ai98l|E@M+{`^IoXgYBP{Eym+N z2|hADXEtjBKv2K*fc)8*RMd=61J)rWVio$Us{za8RGD!VzDT*y6(#4h%D7KV9YM!zmqGt?jR#|K* zA@h33biPm%#g-B%wv<4zr36w(gXtZLVoM2GY$<_B&!mejC1kOs1RkmJVoM3RPGzyB zgiNyw)+;6iK(VC+iY+BjY$<^$oJh<^GKDC%l)y@r#g-B>KT|PXY$<_aO9>QPN}$+M z0>zdR$nPJ_|5rt^rG(rECo$v2mJ%qolt8hi1d1&s@Ey%3wv>>?mJ%qolt8hi1d1&s zP;4oIbMs97VoM2GY$<_aO9>QPN}$+M0>zdRD7KV9v84oxEhSKFDS-)o%ma!oB~WZB zfnrMuoTlkwO9@$QDS={32^3pOpx9CZ#g-B%wv<4zr38vCCGb71Pi!e6i!CKkY$<_a zO9>QPN}$+M0>zdR*g}pHD7KWqYg86nO32?-S!^jGKc}+TQbHD6N}$+M0>zdRD7KV9 zv84oxEhSKFDS={33G8f3IS3a+_GdrELlhf1?=e?}>jdG)=NHP@eFw_FA@X{}c)r_x zsP#?v&+anU*_WNbu8$WmHjpLYI^jonOJDjo2EXZKt`xt-GwA!bzg{qw+GIZ z9jWY<9f@bI>?pxDx(XijDqK!ZXvdT+3cyV!N{kIUY>hJo!qjY5F>w-QK1$ zZb<1zPJ-z#Sp5k9fA24N9}L`p?nq0rlxj6eKftu9?8H*WQn&XK{1PXsObA0-Hp@0H zgot#Td6gQ9n7rrt;OJ9>B`64tk)`(>vg8-g@X}8+ANnBXMV;oo)m6>sT-Iy*Dg?#E+nXPj;I zf0#DjNQq<{_QaoHq*U^D42QqJkxG(tC`~j{@8r#_Ws;HlCb``HZZbG@-pdvn|zs9no06m z#(&^kk;;-^V*kFgL8ReHp-3LOPb6z(X@nqOY{g%#Q&Zg0r5I(>LurAv#w-1 z$0TYOrCJe@;68@e4a~@&$7Q@mabKvXCj6zio}K8Ky>-%jHUmQ`k1n+Oi;IagtbL=@ zRQfm`rh~O?Nt*9r;4g1ZaHx8xlPr6vre@QpF!NN8yGtWWD&E1!(zH7%-N@7XLyfD*%|3)*vaEGb5(j8#VU`-ghrNP zE4{?~oMfJz=9vlpl4qnCSx#ovXL~%^#K@BK6a3|K$Sy{fq8#vf?{EyEPb16MnEwLr z*OD$qmK^OoQI+uBc2u+1O5~k{NZ~K#0+4VShqE*NCw8t-4k77cT;<7Mn$f3`CEMu{ z9Dx6O{Rsa?pf%wysZI#~l5wo&P^ceV z1W!g8wtgs!4B#)>fiSwjNlb{#FtR)ivKU#mvcpXtWezJ25^;r-;07;TQvE<*`jC@pb$Udjca%o;_|ap5B-=OvF0KXtY0P zFX9o6m=`4eNBE!kJ^pcS*?I98GPwDkykCxG!X6{>1oRj5F;UPrNglhPA7ijL$p%XO zhoA(#IrIp!h~ImU1^7P%-Axq?NS=?hf`N=-{-@FLfIddRA5PwFp&KkrwNB2-x0~5|=Sh&=kI)?3Cl^ERE zbhhIj#(F&v(>(&xZka(m1cQB!5J{{ffRmTXrouk-veunS8mX~ctwO#SD@wv%y-8X7p#<`-CtfWYsr-fS7(j|QA;Ip53`sSu#ZetI2a;}iC ztwNpTYv&O$4>%qkP9&b^JGD*4{KwQ5erKrSXhqB09-;CvinA0KD7GkmLGg=9C$h6n~=lE5&V!e^D&J z3B&w*DGpOSN^z#*Tt(6e%zwV(e=2@kakJtJimxg5!3oE5!xRryJ zEB-+7DaGF^zN1J_jI4(q&xk`6sfOkm2r6iXGk3K!$2E1sZOt9X{;Rf-!F?^JwH@t2CP zDZZna&o5=DKdo4%I8Je@;_-@e6`K@4ueeU}CdL0${J!GTivOedJH;Njp|br$6pvNB zSn(RgZHn(G=HnvHa`c)+9H6+r;=zhD6i-!Ls(1krb91%gEgJu<;@Lbukj{HF={VdX zM8>dn&G+*4p?npddynGAzUuOe;RqZ42c`aCZ9oD0Leha*iw>v9azZtAt`z_Du z)gCm1GoA}xcuK2VhJ5+XtSz|yj|?)cTMEGaIwjYcb#AlQbp)B!ZBAxwM;_v39a_|# zKX+bR(0p+luFw60Dc5zd{O>>b;K2M&<%7(1u#vs4!^k!+g0QECHn0r!Nb|dR<^}%)ba?nnI zK7%Z3H*tQ?AhW8?T{*9f^#<WwOf5>4#s3dI#trTC+gc9W!kgoo8z3+ z{)-PjC}Mpj=yz|{xw5srqTt_|ai{cPP* zm~GusRMNTyL>-8`liJ_J{&C-(DX6b?ZAZ!awH*(WW6ypWw#5x?0el*B{~n0NF(30Y z@27mc4=ZUn8_t8yPUv$PLf_C?GlYKXfEhNv8269gemKs|Ctdmv7_!|mzI=1R1qC6% zwFOV2Mv&D;+@JC`R*qQD5cIDiOGMB=f~-o=AIgM0|98j=f_@2$#R>Ynp#}4iInNOE zZzFSFHw3+D!RLM267+ecN#1tzLW2H6N)bWdkD?*yzlhsso+ao)qf)GqNE;e=s`~67*kXMIk}Yz62kN zpiiQGsxky2K~EKyASCElQwj-sQ920;`uA8ahoBF>XId}> zeenG_K_C3U^mB5O3YI}g(9?HwkVDW1kC|F3llO8wLW2H$mJ12`A?#U5&@Z7B5%ljs z+y#RE4%Gk8MbPu19m+vZrElS`M+E(O9Hoe$UlbP;Y5E8bQ&Z^!ST-W)Kf@{`f}Yf2 z5E1l;F>^%F-@}272>Mf)8WHr>OpOToGuUoK&~IWx5kW7`=p%xj&wxQh&@W}#h@fA@ z)QF(xnHj_g`g2)zjG(7EZ4e{qse}~72zpX}!S)1wPwq~Ppr__VDkyN%a%qhS`hD4a zM9}{)#T^jz6VSWjV5pnsyHyYo^fU<#B7%N6JG}#fejKvH!1!-?pnoQS7vxi!KO*RV z$jT#vp6`=EM9@FT%n?BkCL7nOkf3j4YDCZvVA+VEAH|v@f*v0QoFF3TsoWAo1pO*j z6(i{BnL3CO^b?pKBj~SVPhtf9k6B%epkKrE7(u_9=`n(ygnqCig8r+>u&V@p058bb zvcnNU{{q|pumnA(YCoQT--5*{;m*1&ScEnyC<$vco=G>znbb^ruJp>VV5 z)Sw?xXq9ZIqLd-&hfrl92ub=akUqIJe;XIWT5#dQirU7-73Jj>3ma=I=GWC#)a<|y z^6oJ^FgskhY+n7xK=(T!0P&h^N&0#94dB{wK*ZrJHZeEEZV{Up?&_uIG}pJ7ZLZ8^ zw(#JI5|~tfcHHs)xzo!p9X)34{{D*cisMI&_W#={_rH5Vx&K38^Yqnc)Q`^k$@0e4 z6{9PT^7p_Jz&BmcfVF|=U+SN`s$v|teEuuXj;-)BKljgk2+IZg=ag4ej2ky*)adMf zqmWuu4)s#M=_Y^vOq)0GZ@eM4Y|xAA)t(~FPv@%WXHdDZM3AJ-XB+s|BUYU7brZK}K1AJ`2a z#2-=P;2*4M@CoV{(ATsoH5gaB)=jZ>65Pq9vGHDP9axiLjodIByJB&?3|rtPu2rYr zv%Bz2EWWpm?`h*gTP8zSZkO4wnuW$Yc#gO0kh&Fz;=5*%EnbA7;UV_K^m1%w3P1RV z&dWcfhCp3Y^Esdk&c*KTTuH##iNg~)9fVU|=EE6To0GNrlQgxCJ4WBVYqwlkE9_-A zbT!_zaGt7xh|6~CMLOZ8O$vKYt%T~|YAB)04_sRn7 zryO2xVA)2QI-lBaL(l6I(i@21Yj8`J&{=Qb$B3AQ6!NUN74gz$B*KL4=L$Cw!@w4?kh*TWv!HrV>CY%w1HkJ2wlg*zDU&EH4A!0tEE zcY290ZyU#PBv;SCYY_DhN{wjZ@E`nE7?^*2D4F9hxszPkNempMbTw| ze1yu!D9%z`pxC1L1x22xtmihxZz?{j_>|&{iu}mV{M!`YRqTcRVf+w9(Pe-vx(q>Kz@57 z&Q%m$2FRkz02EyYpy)CHH)}r8Wq>TY3_#Ik0E#XH@K9W2Sg+_Z07aJpD7p;5b2MFa z86b-;15k7sfTGI)6kP_O=rRCBmjNic3_#Ik0E#XHP;?o9qRRl}oMAsimjNic3_#Ik z0E#XHP;?o9qRRjjT?U}&G5|%F0Vui*z}vN6(Pe=ALzP9B0kY^a07aJpD7p+l(PaRN zE(1_>8Gxe802EyYpy)CHMVA36x(qXIFI_>X&>7-G&1uPMVaFuyfspdHvA|+&ae#7+dyjuw{R@ z`DXaqR$KNe!>K2-|Irb^m$yIn(f0f)^VK4sv zcS>3@C8@XIJVfrC<(!SsiGaRA$~ghL4D+@!9rx=ZraMk6e1l)Pb(`9{OPu7N*XBCs zhxNgqcl*4yo9RlRD3L*5va6tPa8rk$o!7?toa{Q`>R~J2PQTvLc8O^_HMgd%2l#&G zbEjO?-uA%KK7>sn99_)IhoZR!ITR-ULe;W3)_wy{adH%_^nQB>z1)>d+y;| zS$9zK#g5)r-`wF&d89qqcu`v-`=yQ`b7Keh(QkgV9p5R7TxU<{c3dGk3&S86WUpxB z7`jf+c05C3^k=shOj*;G$lRF5WvV~0WAm7sp?ffM%UtA7wcUs{mDhEo+E&4bz?ydE z53(1bpBKG~sn*|1&1%Qv&B$9H!FZzmQF~(lGOg`B$E@CR#gEM0}TOFO=TbWS16)i7-Dvmx@$;K$uJ1d;oO|L=V^Ky!rJ z9nc(^g!3ity&-Sk)KR_mbbGo}kYIhxBcFJ0P-hM*#(c~(HRinmPf0O{5UA2tI8+zW z)*4D>VR6jZvh5U0)M6tx%6~z+Xm&?2{;%D3&Yua&=Pq3YFw$&-DdAyMl$tT(Q z2}VjKNlAPA8>uAeQ<`X`-pMbpmPtnHo20u7?*JnWNZ!d>4m486cz!s}#UXON!;%?} zW{zTs7b%v!$4Vo`5;|<~cA{7^A1$wUy%WvIhKeNzv8Izv7Xoo`;Dw4M?2GrI6ifJ) zobc+C2eM?SSi+|OZ@#txa_u_E{+HNrq*&4q;v7#DOT4&ZiFb#Vqhg77rx6lK(claf zOOE6?<|vkUp<)RcKJQ*ru5XemI9{k&@?{>4P_g8F%mOb`EMfmb#S)sHdpU|FUXEgk zm!nwX{lK(0IXRx~g^DFNu%9`KC0?jlazER9+?1P<L2XP^MhtxiLA!+Ls%7BYenoXd44z( z8J)m;Dt!kwyonww!Sy5kS&mYqSRyYpR!pRS=EhP}>HS&uU@cpcp2#{P#gaj+>QGJ1 zrl&A-q*!t`4}YbmPD-D`)JU=97aZnDvE(wgJ6$tZrrX$1q*!txtBMp$hO+E&nz<@{ zEz3rVB^^wS6iaw!dNIY4|6tWI#gb**iI`$ZJ!^|8mQ1I-yX3*y-*SOMRvsyqP)E{>6ie=B=2Jq?53g_lPSw$#mi`q}BgK-*EE_47j9|@? zVu^f)i4;rz!cmA6OKMqFOtA#o)Q%TZERmP-T4`B4KhQCf7gH?hV0AIYl3SS`Q!Hs^ zdQ7o|A3wbvD3$~pkzrRAOFSr+$XAR=u|z(m>_oAIj|DlNA23z>@m$4W62+2RI4HZP zSi(t$OGNjc9|CGgx%qo-z~lTTv@_g&4r_!n?q_;@o%9g&#eH7IAiWnRtow5n6X_S2 z`U@3PX)YHA$2Dx&D=kSM&&)5V*gHLt;)^QwP47YRB^3vxpT^O4Usf@bUdXC`rDB=0 z*H-kAYDy(;N06S52Hf8Sd^A2U{zWK~Q;B$DSL_GezmXebcEyx0ia7Hnb1M^C19NtOX69+Zdpp{or?1DRM zFl{8=-=+?ybkgA0S>x+Qnl<>V+|M^sQ<-JX;Hk{=rb?M6ru{DU3L>2$2jc0|{W@bl zQ{?jLk&mCY;RA}K;Zq0UJF4RzP{cc}d*Vr@uKhOWCO4PAg99bP0oI(}%&xsH2; z5oQf-oVUVpk1XPGK^NX8Of#kC48Dc^I?CicdGHU}&RkBIq79)h#i~JXUK5b12l> z!M1AcU<*97(e}YWVJagA4|uQkbE#f)c6s^C?EHuQ!g7E4bo_^|&P;#BbUzJso#JwT zUW4Czy1%%5jNfB=g}=Mb1S4SQNiCm@%3 zm-?3k7w27+zqVja!hEZjTvuZblFq9(16sXwN#i0A3p}aCUjnxOAA4T{UsZLjf6hHO zAr}afQbj~XM2rH8V+bK36i8x11Y3(JC^&1iYHih6YsI0heYUnL zwNAC#I&`pgc&!b_SXTYK%ZPcE52u=YL9@0WaM?P2ZVjQ6Z>uf?rB zf{^{C$NVVaC(B8Q;YV~y^#O^aY+3y(udcrGT;)`ReX6Z1$#ne3ItC?o*d6m4+9Y zy|mjpJmIBBt-@srJ7(*#+be6TYCXf$GL$d6Z!wYJy9gy=rvxV<7F^pCu)~lNYjMe& z8^>NEJn>@X*xC;BS+ud1!@`_DwppDp=niRWnD#W11@M>re#%)HSl**#q&`}Wjd4w9A@QM z)yPetQJOKsYu7VMczhkriG#-*lJreZUU<|#>Zn80qj4u5lb$@GWI{=LG{Q+#mN!(6 zNsm6Nc6sH(+Q#~d%KG!tN1l8_dQv7c<($dmCyw!sq_tQK+;Fdk-5g|3TQui{)i9SN{?k5}U8Etqi%hR5>5oxeBczhpVIlSn3 zqg0kx8th+Tcd*ZmWx0*TAIsb9j>=_F#@4~E=zBSmV0UL{m8-z3sJun65;j{do8RKlmjcOug4X7g&15bfVc=(GLnjNimXp=qlOX!UK%(l-wJ zFg4OYm|w&GS$-3bAGejz_crF)Zq&!W+ZAp4N#GB)$6LAw1#qs^*>abnTz7a&ccI+F zwi3{egD5ZDn)ecJ1wTR}C@J98m~n7ioI87tV%Pf;90`4wJGxnYR<;;T|1fw8HWWIZw&E(Gw2Nq^X_P+3&LN1uyIIr}_#EpF-k7P)SZx6P|^V4pu|5YmhDMxZQ zqVTo)C|?UWhUvf(#lsYjQ9MC$kz%!CgW}bSJg(Gpr{V*OPbfaG_?lv?;!Z{3YoUHW z&I7PWu~<>QA|qY+T0r4z0fnyx6uuVlPA&g{;^T@hDhgi<<#wtppBNzvUkf+@bHw(A zuLTra22l7~z@?fmd@abr*8&P(3;3Ys3ttPe@U?)#*8&P(3n*VYfx_1U3SSE-d@Z2x zwSdCc0t#OXD10rT@U?)#*8&P(3n+XopzyVT!|{OQc!aM76uuTv_*y{WYXN!Au$+7% z2BuXOz7}NRYXQZ)0TjL#Q21Iv;cEefuLTso7Et(FK;dfvzo&YIuLZe9W#MZ<7QPlx z_*y{WYXOC?1r)v(Q21Iv;cEefuLTso7Et(FK;dfvg|7t^z7|mUT0r4z0fnyx6uuTv z_*y{WYXOC?1r)v(Q21Iv;cEefuLTso7Et(FK;dfvg|7t^z7|mUT0r4z0fnyx6uuTv z_*y{WYXOC?1r)v(@NamT;PHy%K}qbVI9yTO`67Lm$|owGt++<A@gkF#L1cI zQ!|-KGt%iP{HOmXW-?Q!mZa0ur%b|sZe8=v-sj5?4kh~n8v;1o{k)w=gJ-prerUiu z+X#Oy;GG4t3{Q!^TF_O*O1Ytx{$on9p94QG@UsKHjfs~+e=lBL(~c97w>|UHj$r!z zJJRq+vpw^aKM99#S0R6#qO&8@^U7 zw_gk19S4oepr4qJ@54tgFL1mKqj{deH3{P`th2U zVg9|?XB*uA4fl0!Df2HEd9NegYr3R$d+AeBE(dAZTsb+M__q`s!Zh1!zK-*_!(YmI zZ`zTMI&$37O*@u??+4w#Wu5)pC_E=WJpVZnhdGuTl{Cz$2si48yqSEZdX~389wX&9 z{T;UzZnN>{uf;#hZ{m-a9)`_yAg9XeSaV_g# zju(RXsL|NXiwAr=2>QJW0p2d~FSqv*=q2Bc7|zCL?jcNpjW8eIkOL(y#gm_bLMtVb zTohrYyd+=2tR$qSVBFE7gWhtQ(NOIN+GG~i`3#sO=D280?kM`n>1Pq z<}e8pfCmYrqbUUpXVae*kL55R#*(+NZ}W_}8NowlpxkrFlrbWl%|^(t<4?lb$jqL? zBr2BJKq0BAg^EtQMDh|z_9Zx-6Qtp6s5ikgw&?OkBDT$*%&Qzl6ZP~ z!Lz2`{N#4l3rS6j+4}RN@m|1iHgxh5{P=Mh!xAq(4i(`oXBxEntlp2K>qpV@ls=CA z_%Bh6q$b7<>ASpbVT!i!C$Qh2H4uja|NC+V{O8f6(JOmw2KnSa_2rznc9Hs7BqTV- z@VX6h>D9v3sW zpjoMV*sdcr1r(3h+_@?Gm_az32c_t zctuJ$n}<1ub7Q>NB%IBsIEeFN&!D)3vpJ92HpKX=Bw#q3vngK?dr9&ooDF9?=U5IW zkVr%W8c~*`mT)$514#Hx!_}EOgY7s{)4{CP%Qv&nFduBEPkaLY57>@>qtQDFXLCCX zj_{dAHUB|1BUS8?;%SC(HqS{e!r5?#e{$D|(Zvj^V;4$KmZZwr z?XzNhbj3!5;cSdpmpYKD$~1R<>Kv+C8tWxfi*PoL)KwlEBr?L;9K!qvsp)5|ULn;b zoK1rAa+MLz<|)dRDkGfDlRVT_DkGfDPbjZY8HE!Z1TRLJwu8KQ3krbL#14eX2xoIh zR7N+58lf zcn||zA)F1{^b%jf|F9ymVuGjT(c{4|`^(-g}O1 zI%t1Scs2G{uXU2MvKD@CaEvX*2FD_#*kC^-*5Ih}%PR^a7570@!NkAp`Bk6Dd@(5a z`SHgEeI^9G9uCe0i>BvM7eDExWxaVu7gkHy>P%B0x~-FWWI$uA@qW^1q| zeo4;7JvQgg%^%J00^FF-2ictbysP|6Vi$89WAG;<@t((-NPZP9=lm=HUJO5^sDxtp zSQ{3`Wa!3|)o$J8$g~qjr`8ZXcAo&#!I{xDgJNYZ-FC0Z>GeeOx8LmxU|ZdES#)?wO&NuiFb%FZoc-3Sjq$Ru3{?2vWBc&VzZ zZD6_f7$s}KgfL~vB(XOML!rRwfoo`0+3IpqIQE1*@U#$I#v{#cHm?>5 z(f;uZ7W+kg{HSR4ZNa{+gI({>(3j?pZZ>ZddVKU)km8w>+tw-OQFz@ z?I0mDkAJr-0%Us&if9k98_RIJ2Y)!Ebt2&3P<-X@4i{u5%JB!a-K;)h^wg||-J72h zX%6X(3ql_@?2Fy3J}X;{rvIzBAm0u5RUQ;c( z7C(nsK6p?_0to```%;6xH#8W(i1uB;*dxjBn29lv_rbX#f8;43{qqdOa06;Uf4<^36rWIhUGaB{e^pH2dBJ)I zDl*PFW%?r~a{U_dZN>K#d%z&f^pxUA#mS1Z6;D!Js#vSILGen(FDTxt_^{%$imxb= z>&SNBS4`jpraVxwSn&wOxr(PMRw+s-an!q75#_H{yh+o={}1Ym-yh&AULPojTbvie%MWf{BJ){8 znfE{DV;b9!ZPZXvUQ-p)Fw$M|Fs4l@DIp7^J3Nd(;r@%Q4G$yV8~>Yl^LTI*V84G1 z_Iq#v;^|x9*QRMlB4fA~@#b6JBp+cYxCT^^r*-HvD8aI}9Llh4Ld)*A^Y24DKToWo z>bFGA`Lynmx9y(-h1PzbNQ$*q?f!Ym(Wq|ox^LUR4Yg?7--bRr z+y4D*XL6AlNAhLn@s|-sl}J9s?uE8}+Gm|@e?FyYrey!*rPLDI_W#Pf878kV$;c>K zw*9xzfY|o&j?}SjpHI7pZ9nZp?83Hx7g`qEzRYZB+n>hnooYH1Pp+n-(6-OM?4E5u z4sEpU|ClvH+kO?bX503!W5dq2&!ywLVcS25Dnr{oT}^ak+y6AX@)a|{fyqBn3T^v8 z=g|ml`$tm>ZTp+pztFb-1l!vK+x`#PUTE9Dmi_F&wol%Tv+dI!=4|_KQwnYSCG4lO z?eB!x4cq<~q5q?0+dmsU65IagIdo^+XXu;IdLK`fMa4vF9p}PY{_|3kSl8M158-?} z+y0@f>umcoS=ib3zs8Alw*C3cb+-K?<~rN{c(&_o`}P zZC{8Y&bH4hGiuxaI8{e%`x`ijh;9Gx%#YaicTnEdwx8s1BDVb%P$RZ|xdAxaK7ScR zZ2NR=(3x$2I9e0i{y(VS+4c`*J!jibv(uf}_Wz7lqqhC|Ebnaly(l`{zWC5`w*7mU z>umd5I09$ef0DV*w%@{BXWJ*Sy<^)xf7V58`)jExV%tw}kP+Mdc;-iJ`%BnX#J100 zi&5MDvCNOy_K#tH#J0bfa%Z;vDiqiq+y0I0u(R#o!1njVw$E$T+V*ecp!bn&KiG;6 z=Z^g^yzS@3?$I^0tG|T&?!^%-^OaMKw;J;6u-=R)^itvvVoz%zIEXyO9A(nY4 zMa3D?z)7Zo8K!}RHZVKVz){jbx;L~s)4nVV@m3;jziGd6JY7i_%L3hEOEd7Q%nzv# zWZ8#lv%G#qRw$f<{h;T(SA+bEf}T|?V+okz`Hj0HpA|dGnE8N)akHpUygjsU4c~ocMp@a4n#Kwk zm-Wn|gMz&qoo3(1r0LL-u2<*YFr|n77(Nh{#oqdiiT|Tuh<7d<_M718<6(K_vc?r< zb&bnv%GXpjcoSS&`G*&8Ci=Y|LCL42-E6sR8+-z`qYMVgarD3+$BQ>M?_~Vh zI@tBzNqXLukp#P&ZG)c<+Y;+jAJOVthJ9NHyWV=(^h>#;o1N!u8~iNjOQQ_+^}?Uk zw~GxP`Z%X{vu)KPAu-97#yM4I(+|Qo>+aa#r=i@#wi3|lBbs+9leru=!%`&D27dtl z*j0{;b7#+G?0Vn8Nq;DJbhG-bY%!YtVc6h#Zn(|&aQH(014qsLlCVIucN|~a+JUe$ z!otYsk#$=jGZU3LV{QvzW#`;+W1F-|V|v4lc_Tx~%yR}Z%ksU~*s$%x%D6+&XDLj| z=ek#*NZgm`>u(x53UMA$XAH-GuFAZ=yR_+Is5qr1*25S@_KUF}4pZd4hVlZ%vlOcp zH!Jd2I?M6LKXIF)*mNO3q4JB0uPL@F{$4SG!^Qdo6h|tGO&956(*=r67brGepxAVQ zV$%g~(|QjoKBXu&UF3^R7brGepxAVQV$%hRO&2IOU7*->fnw7IicJ?NHeI0Dbb(^i z1&U1o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>q?lFz3f#6vamX z();5k&htiWy140&pbV_m^ahpJDRR99%b&~Z1LgYjI>hsz?>m&`egK)zDavwR!9R<< zzcC&D1}j%NlWmta+liTpQzmuOW~(0y+SqJ&o`|*cSpPl;_E%YNJqzot@5lQ2I;?5m z*wlh9VeR}in68C8j>bOMy!(0m_#qRkjQX|Uel=+HHC#)6T8rm32Sc!K9%Jg|d#AQs z1B9vl2ROTUc<{hzZW)ll+W5@Ht#e@4-Fc#}Nk{&Bh{sXTOg(3}U@d>kjVQnUv6psi zIQ+Sm9K`Pk4sF^o0)Jey4*i4tWMK>DbkN4hjCpd}jx@^04!fcSYxZ~8_2?WI$Mgis zagBQt_UK%!ALm;4gJ6I5y}Fi1P*2wEW4(S3_U*d-ag*Dw%jdWY($~Yb{UpZOB<*-u zXCL=AxBd`o(YenYzk3)K8s+)6`Ry0#zkh!XPuDAJZTr%N&;Wpdr zeZ-%!egfD>*#BEH1)DKv&xLcg5p!gZPaXC-N1U_hJYB_e0rQk>+SL4LqX`b=a_cwWusSa4i(5PRnc#G+xH*wV`8 zoXjR1uO{i^aMa=aO`%R)heLrJXZH1gYaYkH$sd4zvHYD{&d-_)mK&*M&K8}RX>9xb zH!!*kRv+hhg#HH$q!5iJ-$kPtK!*)Melp3VeaP!TFdMe2lnydHB4UK$A+c?GX%`Rh zJ+CMUzD-~3WJj}U8}r76(HYq`Zq6ueS%cslyi4qx^>`HG(Sj|GRy=QGoc}#UhKuyUA9)u=z#lmtH7tK*I8<5w2m;>R0WmPXA;i4d0e{5Qir<13EPn(6 zZ%&3@7x3nEO2ZeSN#T$D7s>|4H^c%QxM0+1ze;LXuY8quk5h#}CyfH%KlpC=Vb&%NYLY$xQ8 z6j4pcAGsAHaRG1s$UaOp^$L=&QJQ9?{>f@;3Hc+>@i2w_kxFW5>l-42W+DM^qP`(w z&NsxfRO);~tYzQ2;E!+xs|37}nGN|PT*K`G-aJl4A%BE@iS3qe2(I#Hz?;FW8S+PP z^KKLH<}%0uqb|i9e}ums!hkp5=M2&%NWIrVz?(H}Amon}a30(EhKSuqP7k~VB)`GN zL;lF&tQYb}HuGqN{E?rsM#vvo#{Px;k*UmU!yk!#$FyL4L&VznhHwFIQfx2ekDSVW zw&9P&o;F(Mn7~NS7Rk9cKY1PNg}x!qWa}Y+pK3(-OP3T5nh=Hc(V~8 zz9H69b%Z}MhZ7Ltj~qj75&p%=!i zF?uHfZ*J#wIsV8KRO9#~KVfbs{E=D~SKkl}coT4tjz98ER(Jdn`sqNxn|DbE z7IyrRUvL5(e`FhT9e?Ch)^+@mBsI774G}wAyfMT^)TKy#L%-X`BNtIu zgg+v2c_RFg``D8Rf8+_Oi};4%sx}0?q55D1d_#Pi`4Rre6_h*UkKBR+-Q|xk;LSVi zu;Y)!Def+RgaL1Ot>Q3=Z-}!vDf@~)!k2@bpPhjJaUYWf_DFx6kUiH-MoRDiTJE`p zE=GcUrru3=K*2K@RL`$UftB37UkW^p+C9H6yH~N=)6^NesfLo(S&`hGx7b%t`2P82>Le!3kC$DGT(4!W+3hLyaGIuGGkVj~77Kg*J1 zO(YZz4ww_c&f+ zId+&OzBznva1mZI{go)=pYInTog3FqS_aKJVbBXAF4l)f+R(33*g)q({^>&>X0Z!ISTd}}^EZ+cR%+fPDxA9pR@dzpt*?d%huv=c&+D8lz#dPNdj7ciX+x=2)}0s8hy!Q|M{})pEZ)i zpL2Za_u^5~?{g&ZqkqaM={WLOaiMqcsc1VEy7E|s#$uklU4CR-c@#IC*U*tOkUen5 zv1bFLhl{eSC1Xo3;lTDJj1?t{lM|D^|0HpwtTH|1tQT7%r5Q> zsEn)lZ=Q{%bMcf*zr0}FIJoWz4!Lz)aECuH_~wSHU@F{pFgi}=mHA)^1@C+F5}#c0 z=vV~F8Cx9OwqYJzh0F^MNUUYhoTxyIL5{)n2;DT zv3T74;zUtqT<|I?{@$zlPH^`HRmY<|im}4{@xicp!3sJLIS^5NP-4Yvh^&LGM>6B) zPYqf(%-d8M{MwrbKO*Diy;3}W(pa*Wo<}lwU-POqjV}(~@otSe7s=){jpV>}Z|2XQ!#fi;5`R$Y&%VdC2|01Ix%LIDo;}YSO4{HvN8eX$M zh6LGXUHRr|3POu+_SYuGPFPLdjK8x743>WZ8H#72PD{rjb{f`}83zm>Jit!G&IYXw zbqJC(8OLaK`3eMw*(+gp;FKJcD(FPqofRvW)1yS^{zKMPSJqTi;(9Dw#_PAit1dsc z622(BvKq^wlJGsYzmvof#olr;(kNXtAz=2{(a2hG2pNz_XjSMZlxi#;Oa*43eU23` zjH((8vrDGba)gjt>#be6rjpZ%CAXEr-rKYLsoV~WjYWfzR`mKT>%g0do%V@5LN$n( zv&v0SljS@r(Lg(pSJreIRR<*)g=Xa^xnkMO4MI8LN|51|HAoT)RdB=%^VFRP zI~{Vjc9XP)cFRq>?KwgT*;|HqCG){!Vq#}SJ)u}$Vb=~(mN%|hhTv9>^$1vnL1P+L z)YhMea9Uji(m_vgV#wvi@II@jmXwzd?sKB*LP4#SocOQ%r;urUL#(>MT+>9Ov9cA_h)H(Tt3FT`MWno$4TJXNQzqRK>CHhFT56W!*)=hYyT#sh@ z;}36?9?RiPcNZTj->?dh$BkvVjm00!<4sAnj>_>_Z|kri%e@y#u)DLf%H4|}Q+yk+ zn=N-Z67Vt|ZUw{P8vs8?I1W?^$C1t7`WW~i{B3VHt8W1kqWY>oX2wN*9G{(+W!SfM zu2zF zN?T<>t8Y`5zMG(rhBfvNChxF+H(;N2c>K6cfxd?@&vs)T|87^b>3_gSRocbv#xmUQ z!5_|*IuY>iV4RRctpK#;$Rx7o6tm}`+{4__&6XoZ4yRX#3*j*&lD~yRE#u(0cr2p& zGDV)Z0%>-$`mAg*n*L$%x1#3^XM@Lfu05$BGoSCyW;6NcM`W8r+!uVVKH32LKz^2e zpJy`XnfD>PQO0Q%Zj||X&Tf>W=LqGaY$lL0zlzw6@?t9hDVO8V{+3X_nE9PIvfLYq z_bB^<5;`iu>kocUSpOx+$D4ymSW~_VtXs0q;kE=m+E#Oq?>BfgSyR_oUny}a^;gI% zXqWy<(l|ke;G&req`#8oMEECJgp;xm>FbFocLfpY+f?SsDE>@gS@o%_Z zErx4oJ&^uLc#J9Y-qs~|4F_om%K>>WA(ki}rZ`)X_dVvHrC6=FS@Ckkn-#YyeoOHQ z#TOM{Q*2e_cMj?o?iz3a=7;h~Md7YN-tUjZ%!^n{FdxEQ0}6KyxZfX%nVb2!RsW38$PkO;y^{=t|5Jb$}<$_C}zjIsnYbdiWezfqj;<0eTok&ic<)*^K+Ho zRQ#hNUuM|9e8ob=Llmbg9;5gP#YQ6Th36@LPSd}v_<-VLiq9+lQ4tIqX}1U74XG!o z*hg_Z5&fE>^2ZfV()2RL8bw(!2|c(KxADs|Q{`Diy=TD*dOjH7q<~P^} zk%o~hK%`m1oS!o%x5ozVgGj?bZb5oJq}&$d1Vzm75?A5hXYtpQI|#C3YQ=wu(jd}2 z&LSYvEQMZ2q^YJfybO6lq{*c?;tQ;Q3EoyhBFzZCy7YS!>G8ivUwY32d>wxz()Ai$o=vTEyC*ZqO6IBhs8pEg_NSH_Qu(G`CQTBhr*0 zb10e-BF$)Oo5Lg;^dNY#qbW&{l@u!;%V9{66|Vn}%`+l{tjs~Vmys!BM39xsAzzI@ zA=1dqp28$59?R~XYPudz-bzKMT`PHsB>NIOofD)%R;V{YfA^$asd5HcVN&m(;NQFW zBax;jYgRFZZQ%X14UvW?RIrf^*YYIoU4+r3u@e$$v|=Yjnv>YTJ*>zeE2k3gHIfOk z61z{>3OE|ygknde8OM6x;M_3C%J0}M1Z_%*HAS-q3-$OTxG&=cP)_eGV zkxY=4*mq0|mPljzY=W#fB2B=0Pdq5~W*M@~lMDh88)1U1#GW=<<|JQbdm)i#9qav| zNcvft{40C*{A4^_7-Z!vN75Z^>{V4XM2=gL;Jj7pueiCU$ zL+D%EwlGCon2}TZvqqozV*KyR8IVXFM(-Q|d5{NX@ zS=SM1GAukh#^Ex^3cXZBh%~d9dra&RsXH?@kGaRi%q?hEs*>$GBF&?0=y=VYo06kA zKlZrPouB$|7Is9MT8gDH9uo#xSwhYAu}@3kB`IE+Aky%P6e3L{RiBHFQGPC#lHYje z#eRz75@e->+BU?F#uNq&vT_jR3u3>Ld-HWAT&_la|C-nnapy%snl} zTRDTQJVbOvn#Y-YMl4^Zw=|VxOJ~Neke)0_9mH;*6?<{I{-LaIxUl_%NCa+MKeg>J?`q@j8t((oY* zB8`y|WaUcAD^z|8K~^{jUW_tr2(of33V=w%4ur`FvN9zqBgo2Gkav7r= zeTMDV#ny<3AS>MAjZ4%c$O=zM9s-pI@;cf{B8{xEs*b&mNj&JY9P~Lcw&^9lhW}wt z5M+f{kKd1%H%=O6B32U`9mKOY46^d7q<{Ya-bAGX-Gc0=pQ(lx=tQK-^u=gMHCjIJLH}WrXNPX zFO?cEE(4Lfh$V~{ml2|8vC%U^^qgY!j8Hv8g`Ybtkj8!QQ=C}uEdJk5w5X|Ew|eEW zV*FJ^9joAzS?vd7T7*oB!T#|GkW!VIyLpqiQjzbWQC}+jy=FHa+d27hxJ$Xp=RP+g zf5U}5gC+R|{3eN01>0RbJMd>d6V~E8;3<&IZ#gMYi2tT2PBh(k`q-^Yrh(ccVbF$^ z7glLnyh^4cPQsc>Sbb|M&h!2~s0JPL3(EE?uVAmT34}%fbLI*dI6J2iIJQ8C9#@RV z>avP+*TSF-vQW*6tk@#;IIc=ZD65IY?bu^tz}^WvVn_te?%$EAKJ2F0<-2y5vb=n4 zc{>((y?8!kyZZ+wGw_DhZt#*Uo4vbJd?2g+9vJL-2Dh=)^TaNzYOEm*gWM5e5{LoA z*#2>F5T0da!*aT6LV@zt!T~WR4&= z*}DmY;Hx3W!S_Lqm;K7Nz2Aqg8+|__O-5ZSRjj-*a}5C`Wz#yIm0=+ZNahr&|GN+r0<- zIH&4t)^|~Es1+jRvTg6bM7f9CDM!8L<;Y|v4)nZPNK8TGc-U1U$7;`I?0R!?zD(tg zZnl3`wir$SFl_HUH{51?r<8^X(cW-8ZAUn#sN(3Z{5X?Ej0j=&%D_&&@0Lx6T; zzBNL)a38c@^R3pI!6l`QLED_mg*fQ5pn}LT(_ad&?Gqz!JqH6pv9n zLGd)jYDHd$tar5{&wI*uDn6k2gyQpxVrxb@u{8sCYWn+%{cy;rr%16_QNHjXT^8v9 z)~m+@N@s;;o8bReV(O1;y7D|Df0h4=1*NgyI6lEsEDEime&t#MTUy*cZUQxM9<# zIY4nL5$Up&2uR1Ylvil}D#Z<&e!1f36hFc10{ZxTiM|OVcW&F3f~zmw3&M8&$QB3in}7rWlbpE6h!TB-Jhaxbj@|J2n6THeCjcfsfDw$sDncywt1RZ!LFty@OqjbbG!55&{ z8C1VSX*hc)2Gze)v++!@7Pr>Wpn3rBv&J(4SD>k9f^T4#2GyM$Py3z;W-)7Qk?2n( zzl;i2%99m(R_eZIf|sC!2GthooMbe6#>5pGRQs}>(4cxJJ0BWUw_=FSGr>Aa(~Oq> z$^T$)ryFTt@=fN22Gz@{#Tit`Ad^q|u00b3tmr%woWZ_z;hBI|QZcB?%!Zx`irBr- zpn5wMg`Nr6m)-MB@CP(PgK8dYcJ7&gRKbX60-D`JgKF2F2^O(|&@;i&oQ@7W6MUP; z^eaVjwhTvQ!e5AZCRooS8}Ur=2@WFSnP3{V zMLZJ}Qr^`w!JpYm#52J{s1bvz+yIrlQCfLpia0b<{G1qw}$Y)*WnV=6f zcj%emXPkTInP4eZEsepS93EjXs7|J?h-ZR>m>)5yUdNt9JQF-kbrH`57coELncza^ zM?4c;L%B201h=EW?sz7+kR5iO34X}-_rx;+uT|@rKpcteBhLi!zhZzesIEf4joX01 z7DYbX8V=CSI@L)Lr#0@n0PVNZPr z$FfhH2Gjmr7eAP<`TpA&o_~g@r)s{tK)q;OA{rMOjZ2J1Z|Gc3WVmi!?Bw3rOxtfx z?Z})eKYl*Y%JtBm`kdz%k1sxUAs zhV-jY-F)`}!ow_137Xycy@|cXr>Dh8Qb~$@V2f(DCDk>x->6z??2?Sr7hSXRZ*EjA zGp5FmkWDpQM7_6+sU0q4-b;4W4`?6NI}lb$*EaIpLZFV-jaXc5R!7myxK50TRlMer z-;Kr3_MXs=85L%G@v4CUGt04rt8DRn7~8!vERx5GP)X%`vfz2Y{j{n!8b|_*@hhWp zRXsvYL=!%==o5QtKdr`xM1D);bBWI(yi$r?Zj{P+HIZ$rq6L=a_F>ph`9!pvZ8zI~ zx)Fm&qw^dGzk%9uWZO?~gZ*@qRf2MMH`{*N)J^;8NPNSc1wD3SyWFzvr`x(|KV1%e zRKYb?BKfZg|@ovGstwROZLSLFYy4k! z5@o56f43_FWLwou`{^Csw4XlSP5bHZus(DaI@Fc@bR5o?8Md=Pj-kCRn*L$fPjPxi zHeZfKX_yl24Sp2v1N$lM*4+4hO8Y2Ii*V!l!TW-JcV&L`TxGs}PX!gotsd6b*r)}S zNp0S*P?hy*JDm?40-+SRH*Bc#SqA6rZ0ZB@S|`eSU0}7!n-wotyjgLZ;8NvsK=e8K|G(RATK zLtd(~#F~J7zRD770zg_fS;VVAjT*nWa;2)7^oyX6_dsv$9 z(nZdpye>@L4wEX5B(^xtRr6#c^2y|j^J9K)i01_VKq)nz9*dGNp1y@5FrL!gr!}5Z zRm6Bo`=1(5=_tJ;EBR`#?x0YP0o0F2)hs(Py17I zXgpocyK-ne{UQ4AjHeG%3XP}o{0WVxOW60&c={GwXlpzjgJ!xmo-SZTXFM%u-?}iK z(kLRvQ<>S&czQQG6dF&zN=2dZlzrJf?2gcK{@R)|iQ!zY+#?t~0J~WxrGxL8cz>p>!Dls>nJ(n=>m4NYvXAl+Wu%6PiZa| z@ziZmF=3V-I^!vs8WH1ZhV$o)r?Rxz8Bf2;!p?a53r?gno<7Q4XFT1=T<6xkkw?TC zPakAM&UpGK7Iwzd!4#eGRE#UmczP9co$*x6l@a6V8mf*MPrt_rh!{_Kn~WMy5QjGQgp`C29|clQ}NdCjHl0XLY(omhWBP?Je|V2&UktwyWOGj^aq@KXFPp`-G~@Z zS5Q~Pc)FbV5#wnSdlE68K0m2mHGM@ek1BCJP_n7E}@#TIV4rjvna{o0`jW74xxNCg5FW|26<^BN1 zmoUEE`>@*6CqP{=868fDFZbSu;~i=T(q{IUk^Bmha|d(PAr|T;kHvYBTWH**BeonA z$7dmjC z#=MCfu{dyFfSt)0de2RqVsG$$ko|MeC;w2t2ua-dvBVmsr-@M-4&0Y}zP!Kq3y07@ zg+D`To;Cr+4HQdeK8Vw+X6A2rwL@*8sZEzI3^h(5zVVeEuS#~r`2;`msPc5Tl5 z?O`{b4zgbN;@IY3etyAV$T*_d=naY|6u!n8w|z|HXFijSvr0Fruv?dFbh9nW|88q@ z#SM7J3v}st7cO|=5?Gf0Eh}%J=VaLIs%snTy*jB4Pls@PSX)z8xqc;F7|T-SirU&$ zD_OK*1&w{u0DtO1UuUkr<a}HXo`@B*(y;Yu3~$Z#Yirk4G{7PUdmddh z*GGIbciZ(h`k_9*-Rj+a;p-dih)Zr`f8HxDzoRRA&H7wpG3C^XW9xPGD>*YfO6OI= zO}1D`>6()3Hfyn*854&i#e=haC6CX3J&U#Y-`cW^|t4#$g@^ z$B}Ipe+wTkueVB2&hBR0#WNrpa2}|S2-SkifVK{Hz4Kv2rk&7kEXOU|EbxZO})KgWYUiwq1N~q<PTW>o)VT-_~vBVZW{0%)`IR)@|1di*IUNr{bF$D88wIBlv9#D88wI;+q;c zSJSzKfca-Du2%e{;#Ngjwuy3IQu#j=A5(lm@fV7}ReWEu2X3Wor@!KG#f+i^8AN^= zWjt^y6gO%9t%~A{8s+4BI?C~RAGOuXeGmUE@|}SCs@7JnUhPctUE1cSO)1HwW$W4} z^!x3sTc&LuZ-{2yGVJpHEZFApYBD`@O{<4k^dH0iXtlu)$!tPaa{ya>4j%u#;;`Ry zoik(G`-A$uQR-cv!Yv)?{aP@cgAzcz-}LejlOCR3S_(4Pr(&53n6fq&L~Z;T=x5w| zwl@=Hz!Yl6%ohAP5_5j^W7oI#X>Qt42!GY&3H*UE=h1Ep%CHYV1Lko}^<&qydf*o1 znZErN)4G2hbq=^h3^i{9%?~^$U7!pU8z5#BYJ z{E)8JQJ=#Li$_7J0B_1Z4mA?}N}L{c9rb@8L8$;qylsIB@NE4 z2o>NG?2-!bW#+a|1rU;0xQ==~DmW^DtdrHe?o$D{7MoOnuVFln3Lr+KkP7fR^Fk`X z8JzBr3c&CpjtU@-MnWn;9S0Ip0mOMoNCgmsS6eE;?>VJ@>?q^Sc@CFW(@=p_FB0MX zAu4rLfRAwwx}XAl7Mg?#ATt|M0mOSrNCjx1qL2!}zU&?q;E!m8RDf4lGo%8DrWB(JgO6KBeGJv|1N;c%E0Nbd_Q30N2VMhfxoT8%wjALO(1>lt# zjqpB&sv}f@H0L8i1rTTFk#*E>v;3}9fWJ^}gbL6TYJ>_PHvmTkc!!;HQ~-J&?`$3Q zaI_}tsGB%ljtVf1^&AyIn7N%$0shEVBUFGtP@AIy+(*$-0S=&YM+KPA8F5sAtEkIS z0q$n5qXIND*HHobQFDh>fZI8jjtVesMKmHI`9VN#R99WEu4*B!0MEJ3W{jV4oj3{X0bu zb-ZcxFz)vqQnl0@+Mjb2E|LBMCGSlB-#hke3E}#`%6=`svv%KnEfayz-8h@V1=4SO z{^T(ePP}A(22s0vPB3A#gXFwRR|V%(N%-xcZr*Ldnu~(z^DgRO{WLyTh8vGDY}s@3 z3$F5M&c^GwY)oglQTW4|hOH52hgmz#;b7(T;Yg65kdob=m76Dz-8!*ycWmEQGh#;D zDO*fmcrB-!f^BNl&_a2)*Z z%JI^sdouoP9qf9&@W5?~B-mZrmZJJf;Ka5&w&DAF8~?l1&CSm9+1QWjn+bhsq_Kba z(iZkF+cx|*^o>Ej-E9A|ZNq0q`p0(&JKk*D@B#Rko3_e;R^KM;d zU$$*{A~MO0w;T2G?{-C--inXK)2$H6y9fI?r|N9h5PY{DYK2I-Y}@c*DAyg^a5a2R zlbhO=ZTQ~xbrlZG%Gs|P!9L^7C+HL#7Hrz+m^L>=IVZM{vjps*{w?G*-1o`d5 za_z67)|YW>I@Xt28-E$EOC+nA_uAv@SyfLAjcX& z|IQ-0Mfe{S<6q1K>3s~vU<>7%KG;If#Cwqq()%Rp+918L;ki>;#{}tJO069P={2?D zN27=h(iS+i4^yO2hnKE1nDiJ=24@OlNS$Y-wRBT-kVVbKBecO zmyct2U@#_m1TcsO=?&Dv8BadTtk4!pBe0e7l1E4K#1 zCfRXJN5vqtg&xMd&=y+Fc0ya|DE48hsaGIDgoDr)x{6vtTWAhT&M+klliy^XvxSzR z37R4jesENhZkK{ENbe%nb3uAvXQm6%`x*A8iy*zUFkRyZi_Of2L3(FWacB#zqTVn_ zFZ&YgR*>E^aZD2dg7mUOVUS+NaSc`!=?T#%{#hRRU$ZF}r1wFTIWzcjep#It-1QSQ zj5CQrdV_6RFTZS^7u;=xMDh-*41@Ikgu2=U=?%gly))TZXbbh(u`oz4Sp-2Cr1xf) z41@I2eM%4p>7^&ypiPk8piPk8;8D|O6QnozuIcB@7Dw$LU>Zx9CQoxqae zvgmaz8QMZ$;rPNJy?0Y`L3%4tv>QQsxeV{46{Pn{jM$3@&!3~xMj z2y?BNNO7@WDCVW6v9Pm+ws78Dklu|f>};X*=^eNry(o)IEM|_?^c3xHfeX?*goRy@ z-Zd=jY@th;>w@&sSQ5A(y?HQk(xgfoAjdv2H_bm*<2I&nDq?cyuzy<03ImhIJ^xjD2E=cdu%snj((mR-Soh_6> zo&y)8_XjNOg7osOC~!e~f6TfrNH5tbfeX^hZ&X1fNbd!dqd|JvuZS(Qp4uWodJCB! z3DWxz>qmn0UeD$tL3-a}{mz2)a$R(ba4B8t4Y{1t5(eBo57PdCyB#kj4u7_Y{j*FQr^2R*Gt;il#V*4`nnZky zUtU>-eH@4O?4Jku^NZIMR~8>{!tHkI8(I#a#@ppL7;a1(hd=m+E~U?CelJ1?ur=`T zt4H%QeH1g(f3eISWH* z){0k#inU8Ru~=+v?W(fX0hnE59jb$r>$M<2EL0Q&a)q2lYs%M4H`XkR@B{QtfXg+DbO0yQI7T*bwsc)OXO}=5C)DP8)y{K;^s?2f zjFo<64NicSHPErHBEmp8=D7JstVa>?-u;oI@tA&g1$6&bhCMzAVV7f z15VaHOho^r4{U$q4R8Jp?I+OxUInO|HtT7ny-an1f6b=8{xzFp{{2lYiGmwj`!{3E z=vP7d#@4uZ+K!%H(?rZoQGV%#&0zb}m-cmjrfE}-SIYgLvXAI9`gQh>PkP=DIJSJW z(b4!$#rSfrIj#A8^wo^BQpTAhZS+&wRNM$0Q0_X}8i8_Vn4k|@2g730JD z-^Dv{`W>-bQJ&|211$ z3o=`9UZCw+TUviYJ?J;jvw-uN#@wcxHgO!-$7BEG77T1q|57tHT#A=*Y@MAy&;IkD zKiHmmdB?2Grk3rQ?_&(jE%j)J$DPMS<^=6|n3o{4T>2IFF2cNTX?+OgScYw|9LLD{ zVt=FO|NWSsR`wn9$g<=B?5ex6IVXKlGmkZOd+9B$7hx`=dS2rBe1Fr9^P$V?=&J2n zwEZ;O#$0p$+0Q3L#yjx=enF4E_&+MYUoyZOb!>oV9f{-3Z6t(b@^JhZiDNfmc5}1{ zZ0WdBg=>~kC|B1kV-Yf5^L?yY=1$Kd@3?-&$nF&`c7~92WvAoR&FkYOk=mO@*e0Eu z;}su;)XzB!^D*K+3J9rkVkfMsoImb8xVS zm%xq|Vh?G%5StOKqn_HGPj=q!)4eqJ09=?wNq;f!_rtY_qbeMOlDN5IGj7|P@zTL< z3ljZ<_y#f@QqIr#5DB(JQ#?1$k2CR{7_C7)awju`CKI@J|1S2ySolv=17m?zdThYI zczk#+*BZyu3nAswR2FZas-P{1k9bQ}h>u9V0fq4)Y>8Bb-%<*x3bCyeg{lzy4jv8h zQHP>jUOYx?grO<~`~|I41sbJDRS?Ts=P$jpXR zg|DzfraZma5 z#YF0A&V|j*OKsy}I$Y}(r0}j2r7F-C zqbeNDcIRo~IjJkzkfSQl8GMAQAXK6gwQy7lv85zTL|Ys39CD*0=-v6s0zPguA?g4#tAuHXM1kS z!*e}CRd}Ddj;io^j?YmQ@ahnyDr}?Zs0v&G9z>`LL)ec9Re^r$gJsfkFrvv%)v>Jz zRpE0~7ojR}S$CAGz}sJxs({zuPN@n(B?{~gRpB9a*ijX}%J#dUD)11>y|$idi{wZFM_XJ{#ipvZkQnXrw(acSqotb3!gp|rfbg^ zf}_7^C<;yH?bKf~bY<r$-OwSxo2tqXj!)-<>ui6sll1Z#olIaB^e)oa3*rY%;{!-*HD~~%wZ1c(W9{95;d_0te9h|RE6J8I3<%4Vkps|X?#qN{v&YfH z-N~ok>@jIVCdwwc2$cW_xy%qVvYodxhxhtDV6^Om_4Htg@N^U|&<7&5gg3niYs#@R z4512V86SC$r4({OlokPcNQA-Vs2bUHiwK`Y$s>k<5fWGSUS#qQdyT%{Au90krOdI{ z9K$SRH5n$DGIoTeV~ACZCQ!aQC;XJ?gr z2)}{&^tGEUcQ_L8Kn}NGU>tSO$#LLiI~)gWBW>CZV1$}rp4n2@>RSLQs&D=XGcM}m z`0Tta!@jM9U9SXOiRs+Y%}&$VkfZt*K_Bg3)W_jieGS-;>RSzcMM$%o&8tO1RNwMQ z|M-4m^<{HXu7tj{RR*;BHeo-iZ*`=9_<|nlqix>S!LIie=rblZN-pn9y3gax?RzMf z#Ids*b@1a93%mq4QXZcrPsx&JWy!~8$tPyX;m?&YR(j-Z zsjOjLL*-hKKi5>Qsi>|etf@U$NRvW62KU?g10e4hV)W(HV_yn!J|{4(h5hg$f!H7S zO`K4LxS-=0Gv#rLvxqpcma0s{0cC#TW4Y}r^IJqA&VTXAi1U{BtuFo5m!%*An_JV0@jB27U|KUq<} z#X#owai*WI_*KOR6~zfE@?TY1T+~875XX!4MkyYtc%tH2imMdQQ{1BXT}9#FK#%Zm zfWp54=HMno{ldQi4p&+DH<15R;B@lnMW6kk{TgJK`NAaLAAC@xUkqIjL+PDSxo zkMce6uwlJ?#X?0cJYqT>?h)rJp02o7@d6^w(M^itZyx2})BIkz?K8g*u{W+uBJyV{ zuIKfGeB6@S@OUt-9>U^<{2kt}g}1Y=eD$i3wUh4BfBf``QzoTl>)L;Of)8TcN=pPx zZ1mT$P z?=^svWBkqcX>Qsv5S$sWZp#kVIdj(LH~#p~f1d6wC0FN^mUqBMAfJF7g`Gzle$CFK z(RQ8V3Ne2|&5dt(;0$5D+O&_U4co^l;o2`~+CiO|;$G~-AogM7*02x%9qGewwGRoD z7oN}2%JbQU+u%41L6qh|ZiCVs{?Bt8I-)gX`Av*8%k5L*fFA*c+Sh!5l1hU_X2TeM$E6fW$HqgxLyw^X6{yXpW zmr@EnHoQPB(~DSp#K7bwgC2 z;=NvGHuPSE|aV%Og5e~n@vE${U- zNPF?v^QmTzzEo%gsF+Bt=FHgKyi_ggI*$#9a8{i6`a@aQd2EmuZ0EiH zmz+rFvEfpxa^CCDX0G#IKb-A4j}05xkn>(Iul&w?Jx%Ws@Acy-I`8$Xso8n2=at!+ z_xcSSM8tdj|6|h;@AYp`-qm~kTn;DVy?zDMi1&KA0XXmVH0?*c*ME%FItgSy9Ic7> z`hT#X^IpG>YMl4_G&|ji_xh169`Rl;4(XludNN}o-s?|dY3IHE9_Bjl_2+YXoyUeB zG1qyo@5{Q*d;KzYyF>5wpW$3O@AYe`YH19tXgtC;`l+L-D-y_lJo6(S8%|(PBHrsa zQC-A){Y>UZyw@Mj{D}8@`32sY_xiI@VRyXOe~%q@-s|a_V2`}l^IEmu>q%4EXWr|- zg#p52!>7@2^T$mK?QgZ0>Og7IEI8q(oDeLUFm__`rj=kwlvf6m zswUP{O$?T3+Hp*qP&Kgwe;Lv5vOFK>7ql$jyvCFGoQ7?&DCkm!`!U_3}f{9EiLPJ=KT%EHt8 ze*wi|ukae$o`Czw4SO@xe7o@kqE8L`EXn3G?8I`DG@dH_rtRa8H3!h;+Gb5W7 zv-u1imCK;6twS{|_n(mjyE{9p99ijnYTC_~<1Yt1J;SX41LNm4j)O0gb{r>T-_~K_ zSMl-rmPmr#U4Xo(zMF=bd7wVdht;Jemg1$7;sE@<3 z`e<8>>U$3QCLqmjHm?>5QGJg^`qvqs;jhq_w#tB3-=-{m&p=-R(%3(kJi`9b*2y|N ze%uD35bbJqV;=u*SG4JWhN9_Kh~(XaeH_v{n>8Nx;GtHCl*{HR9FKAjw^NR7o3|yC zx&9#Z6^SVBVdydrj*D}LcEfEO&ii9R$<0e7Np`8m$qUbC|Dhb>y_IDl4xzr*UOHhyyOEz7me58j#fX zy_fwcM1%a5N?#jSsJv5UUejIL`k_Q@{lGCS4=hm>TR&vpUzpD8op_dFwc=*Q%N1`{ z+@{Fi=dAaH;){x}DZ)S|`M*~r2ZH4XD2`M-U2&OWog$aavHTT^H!E&ad{FTzMLO$c z`Bue0DE?hBiHn2zgA^rp0OVs;UaVN5C?8jme}~HVDsnvu^}L`c-wq*jfrjW;oT?}x zc9DOw%1ae%6wg=uh9cKsQP1m&@;MmtUsX=vp2K|k@((;*W%<|z`BjzQR(wyf2W{=h zPbtFSB(lT~K>BQzPf}c}SgW`}@k+%nDBi31u;R0duPDB)_`YHSCoualP_bC?2*tUI zrz%z{UZQxl;;o8bQG8zUmx{kr{F`Dg+T79ZL5ialrzuM80OT)LdAXv*rbqfFm9JC0 zL-7H{Cl!CH*rFK6LzC^6C?2JFzT#HJR>j{b{#`K_H$vLblZwNL(07>1M<^~(JX!Gu zBFcSL@h!#w*8D#!_QXS&LU4M;`m)dCCbuO!;eL@#Yw8^J~+$wfalp z)1lxqt%daIk#1^%x005;^p&licV%nhM_0l}1MKOuu52y9ABKV0^YjCd<+;Pwe>MD1ovh2F)$bf z;bY)Y6orlbIo`0NJ_d4z=Wc|)9OGl4H+MVmF<@EiW z(4v)Nd<=XOcl;ddW8hc_@qTZjOTh@Vs6GbxgJWQPO!8pnMtuy#)vG`}`5h>1ALCfLmva|Xgu^W@D}qz9|P~P|Dlh8 z`zVDz2FQquhdu^qLym_&2Dn-?-qy#!yF5gG{HSD_?SX4uR2m*Cp z9|L@~zQ&I)HZvRg7`T-k3VjSbLq(yF0rn-nTj3CvLt7$VnS7l!LmvZAP;0i2fp^)k z^D(d);+b&?hY*j3Lx^vi3|&}5N*@F9yN!@Y^7lhL^fB-$PDh(?2=Oo+!e#7A=wrZV zz0k)%G5Zku7`T(iE%Y(a!o1MOK!4`7@i7o@6AmHXCLBWiyQZHrlcZ$CLmvb5d>C)z zV;~-eL&#@d=wsmX>}Tj>;83<6`WU#JQWy>)C`CuR;bWjD^nbK`415nAhkujjQ!x(R z`53sGqV*yWPhA)l6RDqaW^8U=>T^6y&d0zss&wHH&SYKZW8e-Jc0L9Y6rGQO2PnF5 z2WGhl zdpU@RkAZ&F772&&2bSN}$3Q*RMtls=S3_PL;Sl83n(#OB^%KkaXR$ZV$G|*R>%_-E zFw9X>WcUnpr4$0 z#K*ul*prBlft#o<;$z?r=10OI9MAknIE2$FcM=XEScL-J^)V1fIE0<-u=6qSN4CGa zJ_c~A9>i-Ehe^UAJjFrpD<1>TVSw;4a3lI1I3EK?p?Ufk_yUrhj{%a~+xIa*x;lLf zTm)^-$G{Efxbrd46LYbPkAXMw`@sJjYWt`7MX1b;uU!A1y>EfDsw~%Empywn>=8#{ zD=OfIfdqw_5l~Rkkc-MqM=pw{4l~1WQJ9%#7!|uApkkS+shOF=$?}qQJSS7LEN`dG zv@APi9#0`SWo8}g_%|!d|MR@-{VsbmH%27u@cm}bv)=E%zI9*EdfpE{2IwO`JeB?p z!kS@xHV=iohyMUPqZs3KaYb;dRI}({aOv{hTDb6FN;Jd8l>SFoXAY)3G(3Y|4Wg?_ z)st|{^SwjLPRj5FSWzH;33tPs^eda78eO%js(xitRb?gF-m2vd4OMlmtH(7pH#LrH ztgByHHKB518t(wu@YXv3menHw zmOA$c@Sj0AF}|oWF0YJR^#76Y5m0$pb-cE6V%&fBC7TXAe0hBSGGU~-`F$-u*C%t}n~sb$sUzAM!ByL~45 zT_UsZ+g>O;Se4!VD2_L?VL+25?)YVz z{}JW+-LlW`E@8c%C3Gr{gh976FbG%62}qKu9FmDB3g$hrlYhu`Dz%H|Ha9H~Y71sD zF&+UL?CcW-vs@%oiD2)Si9eEgS9mNm1-n{bzeiWUbk|YOpbg0a$@@-TM)>a0zog(Y zD502lZo!2rj}*SLWO?Speaa5J^FxU91M@N*h9C3eIxOKKMFS>ZH6qM1(;mX_YA?bp zPD8v|#$v!PZg~YY!K59B2roLg3hS{Lo#%S+ov&GsV%~W+F64KbN|4Vil85r^dkF*< z*NgQLO?~xPHf69Fyapbd>t+J;F`R>+U*D^!544)phgX8OzBVlT^^FASOYY1Blh%v~ zzdn++rhix^Ti<0^Hf31H@u)A)1q~)`18l#(4C*ueLlIkFG4EW5#J`x8L_XHX-xfuH zgtG?rj(5Hm`Ovftrhmn}^S>kC12&giN9IrNvy#N;p-ZkoBzb4954%d_x|)3yi@{jz zFEhBH!L(~^gMR$(;GMZ|xDW=|z2tkwB+l;**QYS|uF%JGtW4mt*)}|vkY^rc5`j#w zF0#qHm>_l8J17v-Bk3-wj*l6&?JJkAJm1_Cla^NZR9KXW?R_EpLR3f{`zj#kv0q0U z`@<$+U*@wP!EzYbaf-r8!#+Xnd5Ub8`Bo^lDSkqc#|G0sulNLkw!g~Pnc!P8p>z0Y6Ok*dC?Bdngjjr?$`dOhY3xCS%_^yk4dw{p&ipn5%Nj|ZsF zPHp|{i=2mn+%e{PcsW&l3rG$Zi!-3)wzXV@zIA8Yolqd0c55Y`t zb=#G}d&``dnyT!n*sZAFrkvaPoS(=YP&RbJ2lGP2@LoiQ+i)9W6xKH*LKW6;BHbyh zIUBN3Sl@)**i%^Vk20#Tz5^*;DXf!HDZYO76xJu8UZ=1=nbruoOj2R}3TsXj)=P2U zWfj(6XO9zw^|z!iqOj)CMTPY>Ozm7@UCpG!hGWg5icD5M`B1AYn@4ez)_aBZr%-A~ zh4luuV-?o&DVbGRZ^oK9g*Evir?4jL;1t$pu@zO8Pz|OY$;0I3YpJzK2V+UXc${>1>hgnon4XY)HzWE)oCc|nC zqHhgnI~7y1j}ooITC~HDeqCyrJ^-qnAo_Mv%Z%(rY|kpJN$Wd>^-pM7h4l!w^uvdx z1t_eapxLv+x*heuyA;-w(IZh<%U6d^VJ!}VjD|XuJBGt$%uKGCV`0p)oP6QfrNa7Y z4ysdF??=-qti=_AQ&_);sZL?NH^8M5&)^Y-H3hU?D*M4Er*Hlj2 zMfFBuO*Yk2SdV6NPGNm7Q@c@EleqO2)}y(SPGNlmi=Q4%Vl2Gh^Zv?HSYOI$r?CDA z>v9Tf(O)}-^$(fq6xMICs@^KBYuJ#duzsC&c?#=C*-cMj&36plDXjU8(r#5)%Ll_w zVSOdrZ;9&hjwq_QFvxI$CoZ{A3=J}^u;*cSQhV^VuwR8UfCG4}8ijQm2j%_Ip-2ld zx8nb?h>#M4g9Gn|9S)>K7u+Tj_fB!84}4tWha(y>-t{HsK6DIeh@9ApU7 z2knb{o$xx;8!nVRljUYG>Fgn(V&}8|5R=)5Uq-*evn30YdD9V|J*N$z{enXBjmPKONw>IdvZgX;Pal~ z8of!ajeqff5J{~%uqI!#q8Yade8JUgC9OXvyv~EI^Mfaojwi~{TFeapkH|@`Xl`AT z-z9Y9yG8zLSLW}nciqhbS94_7?gZEPcDQ(V=Bw=`W4UYOvhIAghq2s+j3u8}aSg|h zw-5{y@$)YSxG9iO%vs(8j)(8!c#UFt=EH?&2hMU6;{3q848@#fSNW=u*OXy7=DWm; zFpJZQ^6}exUJXq!`Hn+`7acsw^+4yj9vlO+9>tvH%q;3Nl^~y4Jh`a87co#A2i8Y4 z_0?n9l)+-K4i|Bsr(r&ZbMW)~_X_IEBaZcvX)^VZ2l4B>AN7qxoCzkan6oUy_22Z5 z_YtPPV$PC|G4rM}ps8;Imi_(>LVdgkVgEo&+WLw)%M!fXr7FP$*2mu#MHBx3NJoEM zOuKg?1MWUsOuj!L-!NkUO}=8zvK;Shd&5~y*)QnTeDoj0{?b|hyspTi=?{(F!C7MW z^g`m(yT-=&z2P`=PjX>baF!f*h8g&E=EHlWrg2|k`dFX|j5GJBmDUHhf68xbg=Ml7 zIM|+oqSVOF1(KKKI`4}4=nWsq^9p$h9_K{S$O2cWy;1RFiZ?3WuE-}WmU~1|UTnfH z<|BWr>7tQE`hM7CEXQwEiK3AOibfXLqVb}Ug)JIcplD=)qLBsOtN9*N6pbw6JJc49 zENs!p0!1SW6pbwKIGjh>zG!5DqLBrPMiwZKyg<>&0!1SW6pbuUG_pX^$O7dJ67WDi z;sQk@3lxnkaK6SbQIxk;h!>44P&Bf@M>JhDvanxKTQst;MI#HOwutSBMiwXmLyXk>w+kp+rI7AP87plD=)qLBrPMiwXH?t>3=T@W#WqL7g>1daQufFDa#v8k2ib@jVf=rk~NPSjr6iq%=-%E z4e2pjJu}l`FL^_uZ93--w<3$-1~b_fo?b0)C@h^?z2^o-Onb&bhEpNDi zX_hzq2>WnEvc_du;jNBLtnzFf(pzK#zi{%Y-?5*Vu|H`yN-td3WjPQovW7-Tl zYv!1Wd)k?_=pi)w9!5Lf@D8@v18;aRS{B|=M%MC%;t}=qq_e5)m)WT04cV8S;|-T# zo02!ovqP3Q6r!w{H>_gijyHT5-P;M?@XH*>J2|OyR8f|dTZ%4t!y~wxeJNSN!P&v= znB@&W!#>_ka%z5_H z@`mCi+VO^~nYCx$a2(eB-NhT;fUyzY@T*)s#~V^DYMH@Qu9c~VD9q&eRf09ka+IKZ zo|(6EFq~)RPcgIO4L32f;|-A)hnTW^lXF4>Io?pb?mFJ^0%mr+;d!jed1k(q2ae+n zf5*&@H!Np29B=pvGdtdpN2bpk?!y&6KO*@bS3DWzu482$Z}=;wd%R(u={xd!( znfd*q@P={%aJ=CF_Qvssm(%QqH{1)o70=A2?6&jF{705^yx}eER5!fgU%3*VXJ(nT z#_@(fVR6SB{(_Y|&&+();_-&#IlPWHGAo9D~My_d&`VPPM$@JjTtI zEKKGt5qQIAxSEzXoIoqspa1{ac|$xrybb2?;UJtdC+@c_p$*G0mcAyE&ow4+tic)1 z@Hs=q@qLTD-;j(uaE9$olx;RHEhG=|zCVeULaYYc9Ra(X26LxN6J*;`d|lqO5-L5T zfGU_BRmeCuLufJ=?W+1^iDnNid6R&eH$k=swYBHht!funYSaUI(lW=(H7{Ex8bM!Y z=jI_5y2Q9{Re5Kkvw{oMLQSE}yQ_287U;aZd6hu|a#GydWLDF;r%azyJAdZ%Me`TT zI&Eg{Ld1&$RyT93v|vPwSUpVZ+eo=tAEyFObdq+Muy-Xa31w0DhccIxRw z+?GsaY^8F`FoQJatnP#JTsxzzk;{?rZEMsa5azdt9Bgf@g9gHmmfPD^@Fx=^*L$O2 z%X2si4D9B~UenxE+j!y1HMPkE+@0{Nh9+)kZa!}%_S|H4egD@ScgcRMAtHpYf##Glr5CR?kGG|T3a?$(YiIjJ7E((x5H-u zcB=)^ZQ4P4)&6QG!FaewLBGTAX07Ixjg9 zxJi^RXjs#{y51Z!OWT@jSJX8vU4@|(FWlU*lPS;bl*iOd)|wTTGYT?`P<@B_&z0hD z7j<#cvid&`PMkjd==^Bxm}BxH%g>KiuZ?5!qo+47ZCrqF3mO_**XEC(KQBMNy84Ls zPZ)RjnBaH{$V6s?4|K3tg5*gHXUv-wq$9lJt!!JndQDwDa7}B1E6ftAuUyl3;hLaQ zj*-gxwl*w^O0llKzP0iEppsdVn3YY-ntglK%BDu&Ue;Q-x*(#Zy}k)isM1wZ_YTY| z+!?RvUm(n71N2q_pY%BSIK=TfhI;|aC-EMSHg3HnEKxMTG={_Q!>hp_^YJ~ODTBpe z34Xod75U!0H@xCjt_N0<>%n)4TwnI9m{%N%7c7&!j+n(_UhxeK6w9+dqN%SQ%ccw# zgN3*u@cAh-&c(bU@6+yB6a4eI-@SxMw&ef(`v1W33C9FadRrrkS{ihZg@ zvjwjpUvGHD{=MWCC+-*YidS5N{e}C638sI>Ht5Ii4qg$j%)JoGHW_VW{N8XJxhJ`> zD|khoI~jPxN#5`fv66q>KltK^XqhI14SA2zRLedQdjpfTU`+_{s+kFQ2H zgr4WleX|qJu^fJK7gLj%|0HyY^S1|6lX++-L*p1g--xq(|5Ww0p5AdI^p4j;uaoE< zgX)dc?mSSgzHh06q}CC0*1k-9qdT3W&O;kJ$z#f&s&>!(w3s)xGX-Pu{In`)^ya56 z)HhBcA&wmqw`y_~Um?puFbk34{kSEHZbE#jH0I+T$jRFgpDvY4-J2{_65Rm+T{#PR zL01lkmGG3Q5v4MO95bf zRALRuUc_3CPOQAIZ;YpB4`h3mr-Tv2j;H)rR_b`l!RUY715ZiUs8@yYqGV((Pk9h) zIz8z^D!Y^wS)TIeZ1hYHP+YMo!~l{y$y|?rH{d4&cyO>!xOa+Cdr>FDi8M2DqHl~X zPf2}ayj=%#z9TU*S?U{O z%TrF|I2Q1f@m+~-usqw&mH1LpZgBP$T9&7L0PVz2iB*&RFItwTJcRxH;lo%H z&LA6!WL9}f78v*>|4|t>kS4~P`lE=X5!$Ly>N-SZNKM=G1{Am7^KIPwlW3TR9^o5_r*ao^)h8w1y5V*8B;<_^ zF`3G77FcU0`bKM(<@RIQU z>DM@RJmn~EgV~ySM()FG$nlii+hWI4euJ4$(aedyF?KxV2xfLXC6COwJz7Vocs$DS z0V(!)$}_kU9#8oi(>xDmz`pjAO-LyrKmUun z;VDO;wE;1l++NS&ay;cYmUBEM9fihS^OVs`Xw~qP@ro$N&jRAplrs);|H9&qrz~aV zj;FkYnG5xe@tHc>C*`+AZ#er;N@)hTig&F`V3ffCJ}v zO6nWq9(c;(XhP2ILxV)$h+Xvn9;?_)&)~2iImVW+T#GuQ;C=l6 zuHh^DNFS-I*mpuDS!tZcu57Mc!TU|)C>DEwbrg$b5FCkHS&TbrMr1}TZY)s*`^Qs3 zSiQ7*W2R!}3Vf6qV$gY{b;WyfdkX0Z?+kdY#%2+wV$0M0FJJCR1Ya8^NoZ69i<+=U z2}$$FtWyMIbh%jW$b(?q^qeIw3UJ0qtoWNN#1-MUMJ zkaqVYQz}dsbCvXS*&D9%rlOwU z@+F~|tL!RYHFBFWEXaHx@*>RQw4!_m;OfS!o(U!&?-RY~;5DpAIaZSICvlHtxjXVv zrVJK?Gr(1L)^0IZnZlJ77h0*0$nhiALVbBt8PL?X0n2{>Mtc40j;lNd_1$e&QtM-# zTfDll82qM}TxA8`-40^`4W@r6p4>fY{PD>5fXM_j`H0C4P?ET+mt5st*kAbC%>+}Q zu?_n1yMwFbKITFgV0R6c+6ccl93SpUF6;`flG~nP1%Bir4R^^n?!W%NNxOmx8feR{ zDXu;VO_|)z7+0*di3HNW9TS~4dC0R+bO^RF*R?M^ehEf&50)HHcm#4OPxv|(!4uvG08cm%FLa7|!igxaJRw=1 zu6V+vg@~^oJ)V%_6~`0Kr!`_BJ4BxFHngTZ;pwc|@PrZWzmzBZ7_*d$AJl)xB6&i2 zY2P_d_yDpPE-;goSGmd>mSvCh(t6JmE<`Evge%ZL#}i(J(Q-T?FENfMJcI36p73c} zmM1)hmgNb*#9Ay*_y*G~Pxu?A74n4NMKhTYJmG&Z&GLj)yLmjJa2Sp!+`w9U;0Z|q z3Qs5_Yk5M>jOTd5+u5k)3E7vO;|b5iMki1BXO^@);f-vgm?xw&NRKDnj66HR6Mmdk zTAq-q-L7~-GLeoa`~!1Zp73&7mM6S{IW14vpDkFPkazKY;R*Tn+VO<+huIZR$WK%q zPbloBv*8`%oCPk4c=Wm;RRS@;R!#%)pI=I5{`u9370U{n3>#Y zZV6+S<%Tn};|VDs^LWDdGqd9fmou~D32|ZedBV>!v*QW*9PaUi=P|S63CW@QJR#e4 zJmDcU9Z&c&SHbaw&oR~UghI}HJmFhR_ISd}*|NtIKFr!Yo{%48cfu2%%xXNI@HS)< zo={Ezjwd{k`5aHUfo3;6;j0)W;R#>na58#xGg!E+M@q~-GX&g@&v#jF@`I^Y%3F*DW;|ULAS;rF!?dyJHr!Z*a62AQmoo1o{-0? z;R$E5lkXHycnx|8o{+OWD^JLK=x`OIkGDMGRE(qYgzuH~`AQ827b0U6oX!7x$iU9# zu#{IDM)xRkwYNhDJ`{xW?mK)=BW~tGjCprlAh#JbkV~k6%wrjQGQucqUBd;s&%T+0 zS9#`km!^cNiiE;>+&qUI`4#}v4Gn9hm{E*d>ECV=#`i*|y@E+mU5%$hqhDEOpck8aUP z5Z~3hMgRPdI|K>ET;LRNBIFvS-f)2#aDnCMP!4_A8$WiHDUz%`NxGs5BXO`~Ds`uzZ+|kVuI+afD*E;xUTT6lW<4e~0`l)ZVE0 zF~u7dZ&$oe@e#!zC_bmyq4--xKK8Lc`zel86yK$Y7vH5o@m&fO-=#qDT?!Q6r9i$9 zWIgvPKBg$XOA*h9ey0CU@lC}n#)k3YXbdR6OMxe9y!bAKE&Lr&_&ea|H2sT;;=2^_ z;=2?mzDt4PyA*gJ4gj{p*S7V7qcPUVOmjeH+ z@uDMyy*~~*<`bu5z^By~-=(l$Qu~jJ;=2^_;=2?mzDt4PyA&wCOM&9M6ezw+fx_Pb z#dj%Ce3t^ncPUVOmjcCiDNuZu0>yVJP<)pH#dj%Ce3t^ncPUVOmjcCiDNuZu0>yVJ zP<)pH#dj%Ce3t@6M+g+(r9kmr3KZX^K=EA)6yK#l@m&fO-=#qDT?!Q6r9kmr3KZX^ zK=EA)6yK#l;qQRryA=329D5vp@m&ghRBiEH3VXZS;=2^K_$~!b#|4h%#CIuBe3t^n zcPUW#JD~7)z+(RHT<*`<7kQ0~aKe@29dr) zNaj3z^^|eHhNtE2&;kyWxeYgOej&aJ+P`(s3EsW=1)P6yf<1NnQN)(3aGE%MJI;sw zgZ$MUG4zC3pBrD(IS*M6R;~Z!YUW$89qsgwrfz@CHdv$c^sZWe(QEz3tuipxpn26w^MT{{cYL& z!XMvytN*(EX7v4|9YKCm$Meu4hSjteZ2t|?g6bPOHY`E=D4Q-%+GW|2>g8Jll;4It z>8TA{|id%v_H_{)Ue4bg6yxRgP3Y zDuJ1DLdZSZ$8NNbR5z;FacD^pXPn8o9X<2lLSGb9JM<=i6qrEtP4y@AqQ7#_Ngdp>2{M(FQKQ6?kv6vSlkfKi_l1^Ulh8YiK-H^Ox zspE`CoGVr;h-zq7+(z>%Tr=WPq^ZhM(NGxaf&T*|{=TfjUVMdoDSm^~W3q3eRQgcH zh>GsKAbnU;e=2(;lhn#&`4-ezWm(cr#u8FAJyz5bBA$F5ZDr0wju){YYXs#U`Qk6& zH!^*A_Foa79&gs;w`^yEY4zt!o0wRcEU$*?BND4D`#c6OePm*lXFpAAQeq9tew(#S zPOQP%$+V72tRdOkSj*9gl@H3Py5wz5CQK*d$@C0HaZC{#q-TmOlTKduX2BD=8ZtQ~ zIhge9#N_0Vr=Zj}B+5Esa!AtLoGb3CFuf=l+0z)sia)>(ot|_dm2G21XWS%dnJoK~ zK9d8a;z`zQJ57~jLbg7w69T! z6;+JRev7N{fOxCb$syAZCM{IUUsQM{MtrhozRO*-r!0kN!}s zWOB܌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 z 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

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 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�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�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l 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 E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_a8/gnu/example_build/libgcc.a b/ports/cortex_a8/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A8/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a8/gnu/readme_threadx.txt b/ports/cortex_a8/gnu/readme_threadx.txt new file mode 100644 index 00000000..bc4d709a --- /dev/null +++ b/ports/cortex_a8/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A8 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A8 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a8 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a8 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a8 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a8 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A8 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A8 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A8 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a8/gnu/src/tx_thread_context_restore.S b/ports/cortex_a8/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..91b1c150 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_context_save.S b/ports/cortex_a8/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..8c55a18b --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..ee677edf --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..3a3eda70 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..71ac82b3 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..f4ae9a78 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ce0949ec --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..ea6f1193 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..63ca62d9 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..b892370b --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..f8cd2efd --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_schedule.S b/ports/cortex_a8/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..a6e0293f --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a8/gnu/src/tx_thread_stack_build.S b/ports/cortex_a8/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..4de92045 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A8 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_system_return.S b/ports/cortex_a8/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..28c756e5 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..96f8d0eb --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a8/gnu/src/tx_timer_interrupt.S b/ports/cortex_a8/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..501b2771 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a8/iar/example_build/azure_rtos.eww b/ports/cortex_a8/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a8/iar/example_build/cstartup.s b/ports/cortex_a8/iar/example_build/cstartup.s new file mode 100644 index 00000000..b95efc0e --- /dev/null +++ b/ports/cortex_a8/iar/example_build/cstartup.s @@ -0,0 +1,161 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + ;; Enable the VFP coprocessor. + + MOV r0, #0x40000000 ; Set EN bit in VFP + FMXR fpexc, r0 ; FPEXC, clear others. + +; +; Disable underflow exceptions by setting flush to zero mode. +; For full IEEE 754 underflow compliance this code should be removed +; and the appropriate exception handler installed. +; + + MOV r0, #0x01000000 ; Set FZ bit in VFP + FMXR fpscr, r0 ; FPSCR, clear others. +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.c b/ports/cortex_a8/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c7c300cb --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.dep b/ports/cortex_a8/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..fcb0bb93 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.dep @@ -0,0 +1,222 @@ + + + 4 + 1829555607 + + Debug + + $PROJ_DIR$\sample_threadx.c + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\tx_initialize_low_level.s + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\inc\yvals.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\tx_initialize_low_level.s79 + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\cstartup.s79 + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $TOOLKIT_DIR$\inc\xencoding_limits.h + $TOOLKIT_DIR$\lib\m7Sx_tl.a + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + [ROOT_NODE] + + + ILINK + 52 36 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 30 + + + BICOMP + 49 + + + __cstat + 58 + + + + + ICCARM + 54 56 24 39 15 12 7 2 22 53 27 16 25 55 57 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 34 5 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 13 33 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 17 + + + BICOMP + 18 + + + + + ICCARM + 8 9 23 1 21 28 31 40 45 51 37 4 50 43 + + + BICOMP + 8 9 23 1 21 28 40 45 51 37 4 50 43 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 13 33 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 14 + + + + + ICCARM + 8 9 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 34 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 19 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 38 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 36 + + + + + ILINK + 6 34 30 3 13 47 44 46 48 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.ewd b/ports/cortex_a8/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..9cfde331 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.ewp b/ports/cortex_a8/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..1734412a --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.ewt b/ports/cortex_a8/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..a8417466 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.icf b/ports/cortex_a8/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..8c984b82 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 288 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000900259600000200000010860000120000000C8100000A000000048600000200000017810000040000000E8100000100000011860000120000004681000003000000E880000003000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 00000000B4040000000A000065050000 + 000000009D040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000006801000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF68010000320000006C010000990400000100000002000010040000000100000027FFFFFF87080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E65008000000100000000000000B4040000000A000065050000000000009D040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..daca6403 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..6103fd44 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..36278b8c --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A8" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..66d13c65 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a8/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..2488c160 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1385 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 137 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 2F0000000900259600000200000010860000120000000C8100000A000000048600000200000017810000040000000E8100000500000011860000120000004681000003000000E880000003000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 1900578600001800000059920000240000002392000000000000008D00001E00000007860000280000001D9200001100000004860000250000009A860000160000000084000078000000259200001900000044920000220000001A860000320000001F9200001F0000008E8600003B00000006860000270000002D920000210000006986000038000000558600000600000023960000890000000E86000017000000A18600003C000000C386000003000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000340100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000340100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + 130800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFF0F0800004C000000130800009A040000010000000200001004000000010000001DF9FFFFB9010000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF340100004C000000380100009A040000010000000200001004000000010000006DFFFFFFDC060000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000340100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000020062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..d4670025 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 1043574536 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..36278b8c --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A8" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.crun b/ports/cortex_a8/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.dbgdt b/ports/cortex_a8/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.dnx b/ports/cortex_a8/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a8/iar/example_build/tx.dep b/ports/cortex_a8/iar/example_build/tx.dep new file mode 100644 index 00000000..d3f1fdc6 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.dep @@ -0,0 +1,9603 @@ + + + 4 + 2050279214 + + Debug + + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Txe_qp.c + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Tx_ike.c + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Txe_efc.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Tx_mc.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Tx_mut.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\Debug\Obj\tx_misra.o + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 606 637 382 41 356 368 404 99 349 35 405 107 708 619 603 111 25 34 647 710 476 627 649 390 553 552 638 13 654 715 742 398 411 67 30 90 26 568 495 475 724 757 5 541 756 6 85 365 40 630 442 486 61 117 119 734 104 447 549 470 402 438 452 562 19 364 490 628 3 435 43 694 443 645 560 730 547 632 711 527 380 639 46 653 123 673 529 44 68 384 674 503 39 589 16 9 525 728 706 396 636 550 77 453 58 759 96 615 741 73 726 669 8 687 599 613 417 596 66 493 52 751 575 717 393 752 487 434 425 497 657 419 537 374 337 395 110 735 426 15 491 429 574 94 354 513 563 400 87 566 604 576 72 761 83 86 383 621 21 64 350 655 602 480 524 543 427 375 105 749 11 109 704 45 519 758 450 733 125 399 746 656 376 2 626 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 133 214 454 727 718 696 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 465 42 573 403 595 496 564 567 611 485 366 721 408 517 593 78 686 642 91 342 646 740 344 378 33 557 505 612 677 583 31 70 394 518 697 979 609 689 49 532 665 676 97 37 54 492 695 572 0 559 474 436 520 556 340 714 122 379 439 587 594 534 339 705 522 578 10 760 79 702 514 89 644 625 502 479 433 359 739 124 458 14 397 600 118 558 571 504 1 523 629 361 707 598 345 750 483 661 103 445 581 658 515 355 472 422 719 703 516 743 412 386 74 521 47 32 569 461 121 535 667 51 501 731 95 48 580 459 736 22 685 539 683 585 610 65 533 643 409 460 388 526 346 508 650 640 468 440 464 387 633 106 60 555 586 507 709 510 372 36 511 745 471 55 456 367 675 591 528 7 431 601 605 607 444 385 451 469 561 414 407 698 723 500 102 424 618 428 92 551 590 352 582 101 4 448 570 663 693 635 672 678 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 133 214 696 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 133 214 454 727 718 700 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 133 214 684 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 133 214 454 727 718 494 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 133 214 441 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 133 214 718 727 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 133 214 454 727 718 737 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 133 214 727 718 454 700 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 611 + + + BICOMP + 349 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 142 + + + BICOMP + 142 699 624 296 536 133 215 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 42 + + + BICOMP + 637 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 142 + + + BICOMP + 214 536 215 699 624 133 142 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 465 + + + BICOMP + 606 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 142 + + + BICOMP + 214 536 215 699 624 133 142 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 721 + + + BICOMP + 107 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 141 + + + BICOMP + 624 506 699 214 680 215 701 467 133 141 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 517 + + + BICOMP + 619 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 141 + + + BICOMP + 699 141 701 467 296 624 680 506 133 215 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 593 + + + BICOMP + 603 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 141 + + + BICOMP + 699 701 467 296 624 680 506 133 141 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 78 + + + BICOMP + 111 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 624 506 699 680 141 701 467 133 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 573 + + + BICOMP + 382 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 142 + + + BICOMP + 699 624 296 536 133 142 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 595 + + + BICOMP + 356 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 142 + + + BICOMP + 699 624 296 536 133 142 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 403 + + + BICOMP + 41 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 142 + + + BICOMP + 142 699 624 296 536 133 215 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 496 + + + BICOMP + 368 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 536 142 699 624 133 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 564 + + + BICOMP + 404 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 536 142 699 624 133 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 485 + + + BICOMP + 35 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 142 + + + BICOMP + 142 699 624 296 536 133 215 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 366 + + + BICOMP + 405 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 141 + + + BICOMP + 624 506 699 214 680 215 701 467 133 141 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 408 + + + BICOMP + 708 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 141 + + + BICOMP + 699 701 467 296 624 680 506 133 141 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 567 + + + BICOMP + 99 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 536 142 699 624 133 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 689 + + + BICOMP + 26 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 296 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 169 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 665 + + + BICOMP + 475 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 169 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 31 + + + BICOMP + 742 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 155 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 583 + + + BICOMP + 715 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 155 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 505 + + + BICOMP + 638 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 697 + + + BICOMP + 30 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 157 215 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 676 + + + BICOMP + 724 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 342 + + + BICOMP + 710 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 141 + + + BICOMP + 624 506 699 680 215 214 701 467 133 141 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 740 + + + BICOMP + 627 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 155 + + + BICOMP + 699 506 489 215 688 554 133 155 214 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 642 + + + BICOMP + 34 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 624 506 699 680 141 701 467 133 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 70 + + + BICOMP + 398 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 157 215 169 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 394 + + + BICOMP + 411 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 157 215 278 233 221 155 169 142 141 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 157 215 278 233 221 155 169 142 141 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 557 + + + BICOMP + 552 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 155 + + + BICOMP + 214 688 554 296 699 489 506 133 155 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 49 + + + BICOMP + 568 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 97 + + + BICOMP + 757 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 33 + + + BICOMP + 553 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 155 + + + BICOMP + 214 155 688 554 296 699 489 506 133 215 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 686 + + + BICOMP + 25 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 624 506 699 680 141 701 467 133 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 37 + + + BICOMP + 5 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 54 + + + BICOMP + 541 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 344 + + + BICOMP + 649 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 155 + + + BICOMP + 214 688 554 296 699 489 506 133 155 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 646 + + + BICOMP + 476 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 141 + + + BICOMP + 699 141 701 467 296 214 624 680 506 133 215 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 677 + + + BICOMP + 654 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 91 + + + BICOMP + 647 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 141 + + + BICOMP + 699 141 701 467 296 624 680 506 133 215 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 532 + + + BICOMP + 495 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 612 + + + BICOMP + 13 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 378 + + + BICOMP + 390 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 155 + + + BICOMP + 155 688 554 296 699 489 506 133 215 214 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 518 + + + BICOMP + 67 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 609 + + + BICOMP + 90 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 169 + + + + + [ROOT_NODE] + + + IARCHIVE + 23 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 661 + + + BICOMP + 123 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 445 + + + BICOMP + 529 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 103 + + + BICOMP + 673 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 629 + + + BICOMP + 711 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 581 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 361 + + + BICOMP + 527 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 707 + + + BICOMP + 380 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 739 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 600 + + + BICOMP + 547 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 479 + + + BICOMP + 443 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 658 + + + BICOMP + 44 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 515 + + + BICOMP + 68 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 355 + + + BICOMP + 384 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 433 + + + BICOMP + 645 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 359 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 502 + + + BICOMP + 694 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 157 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 157 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 1 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 397 + + + BICOMP + 730 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 523 + + + BICOMP + 632 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 345 + + + BICOMP + 46 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 458 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 644 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 14 + + + BICOMP + 560 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 118 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 558 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 571 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 598 + + + BICOMP + 639 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 750 + + + BICOMP + 653 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 157 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 157 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 124 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 504 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 483 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 578 + + + BICOMP + 19 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 233 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 0 + + + BICOMP + 365 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 221 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 79 + + + BICOMP + 628 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 514 + + + BICOMP + 435 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 702 + + + BICOMP + 3 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 89 + + + BICOMP + 43 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 233 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 122 + + + BICOMP + 734 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 587 + + + BICOMP + 549 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 221 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 556 + + + BICOMP + 61 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 10 + + + BICOMP + 364 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 695 + + + BICOMP + 6 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 474 + + + BICOMP + 630 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 379 + + + BICOMP + 104 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 522 + + + BICOMP + 562 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 436 + + + BICOMP + 442 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 492 + + + BICOMP + 756 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 169 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 340 + + + BICOMP + 117 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 559 + + + BICOMP + 40 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 520 + + + BICOMP + 486 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 221 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 439 + + + BICOMP + 447 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 572 + + + BICOMP + 85 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 221 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 534 + + + BICOMP + 402 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 233 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 233 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 705 + + + BICOMP + 452 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 760 + + + BICOMP + 490 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 714 + + + BICOMP + 119 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 594 + + + BICOMP + 470 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 339 + + + BICOMP + 438 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 233 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 233 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 510 + + + BICOMP + 491 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 471 + + + BICOMP + 513 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 169 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 55 + + + BICOMP + 563 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 633 + + + BICOMP + 374 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 141 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 460 + + + BICOMP + 575 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 526 + + + BICOMP + 393 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 533 + + + BICOMP + 493 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 610 + + + BICOMP + 596 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 709 + + + BICOMP + 15 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 155 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 585 + + + BICOMP + 417 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 555 + + + BICOMP + 110 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 141 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 372 + + + BICOMP + 429 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 464 + + + BICOMP + 419 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 141 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 409 + + + BICOMP + 751 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 508 + + + BICOMP + 487 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 142 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 640 + + + BICOMP + 425 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 142 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 650 + + + BICOMP + 434 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 142 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 36 + + + BICOMP + 574 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 511 + + + BICOMP + 94 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 169 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 745 + + + BICOMP + 354 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 169 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 440 + + + BICOMP + 657 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 142 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 468 + + + BICOMP + 497 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 142 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 60 + + + BICOMP + 395 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 141 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 106 + + + BICOMP + 337 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 141 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 643 + + + BICOMP + 52 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 388 + + + BICOMP + 717 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 586 + + + BICOMP + 735 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 155 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 65 + + + BICOMP + 66 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 346 + + + BICOMP + 752 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 142 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 387 + + + BICOMP + 537 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 141 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 507 + + + BICOMP + 426 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 155 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 703 + + + BICOMP + 39 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 215 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 472 + + + BICOMP + 674 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 386 + + + BICOMP + 525 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 74 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 521 + + + BICOMP + 728 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 47 + + + BICOMP + 706 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 32 + + + BICOMP + 396 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 461 + + + BICOMP + 550 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 731 + + + BICOMP + 615 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 95 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 743 + + + BICOMP + 16 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 296 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 48 + + + BICOMP + 741 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 501 + + + BICOMP + 96 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 422 + + + BICOMP + 503 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 215 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 580 + + + BICOMP + 73 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 459 + + + BICOMP + 726 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 22 + + + BICOMP + 8 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 719 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 736 + + + BICOMP + 669 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 516 + + + BICOMP + 589 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 667 + + + BICOMP + 58 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 121 + + + BICOMP + 77 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 535 + + + BICOMP + 453 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 51 + + + BICOMP + 759 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 685 + + + BICOMP + 687 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 539 + + + BICOMP + 599 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 683 + + + BICOMP + 613 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 569 + + + BICOMP + 636 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 412 + + + BICOMP + 9 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 92 + + + BICOMP + 109 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 582 + + + BICOMP + 758 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 101 + + + BICOMP + 450 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 551 + + + BICOMP + 704 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 451 + + + BICOMP + 64 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 233 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 102 + + + BICOMP + 375 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 4 + + + BICOMP + 733 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 448 + + + BICOMP + 125 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 500 + + + BICOMP + 427 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 456 + + + BICOMP + 400 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 385 + + + BICOMP + 21 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 528 + + + BICOMP + 576 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 601 + + + BICOMP + 83 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 431 + + + BICOMP + 761 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 7 + + + BICOMP + 72 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 605 + + + BICOMP + 86 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 444 + + + BICOMP + 621 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 469 + + + BICOMP + 350 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 233 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 591 + + + BICOMP + 604 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 407 + + + BICOMP + 480 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 675 + + + BICOMP + 566 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 278 215 221 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 698 + + + BICOMP + 524 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 424 + + + BICOMP + 105 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 618 + + + BICOMP + 749 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 428 + + + BICOMP + 11 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 414 + + + BICOMP + 602 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 367 + + + BICOMP + 87 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 157 169 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 590 + + + BICOMP + 45 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 607 + + + BICOMP + 383 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 723 + + + BICOMP + 543 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 352 + + + BICOMP + 519 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 561 + + + BICOMP + 655 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 233 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 133 214 684 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 693 + + + BICOMP + 656 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 133 214 441 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 663 + + + BICOMP + 746 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 635 + + + BICOMP + 376 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 672 + + + BICOMP + 2 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 570 + + + BICOMP + 399 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 678 + + + BICOMP + 626 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 133 214 700 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 133 214 454 727 718 441 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 133 214 454 727 718 700 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 133 214 454 727 718 494 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 133 214 494 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 133 214 727 454 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 133 214 718 727 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 133 214 454 727 718 494 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 133 214 454 727 718 737 684 441 696 494 700 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 133 214 727 441 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 133 214 454 727 718 696 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 133 214 727 441 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 133 214 737 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 133 214 454 727 718 441 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 133 214 718 727 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 133 214 700 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 133 214 684 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 133 214 737 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 133 214 454 727 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 133 214 727 454 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 133 214 696 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 133 214 454 727 718 684 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 133 214 696 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 133 214 494 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 74 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 95 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 581 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 359 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 558 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 1 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 719 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 124 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 644 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 70 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 770 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 739 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 483 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 571 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 118 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 458 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 504 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 10 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 89 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 14 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 523 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 702 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 629 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 658 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 515 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 707 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 514 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 760 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 345 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 355 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 472 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 598 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 703 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 516 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 79 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 578 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 661 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 422 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 743 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 479 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 502 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 766 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 600 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 750 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 766 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 361 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 397 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 433 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 103 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 445 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 522 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 521 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 412 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 32 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 569 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 51 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 501 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 47 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 731 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 736 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 461 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 667 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 48 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 121 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 580 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 535 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 22 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 386 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 683 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 459 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 685 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 539 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 610 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 65 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 585 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 533 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 643 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 460 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 409 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 555 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 508 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 387 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 709 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 510 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 633 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 511 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 36 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 106 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 507 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 372 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 745 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 367 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 464 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 388 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 586 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 55 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 526 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 468 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 471 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 60 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 440 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 456 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 675 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 591 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 650 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 640 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 528 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 7 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 346 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 431 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 601 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 605 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 698 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 551 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 582 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 561 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 500 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 607 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 444 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 618 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 102 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 414 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 428 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 92 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 352 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 4 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 448 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 570 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 663 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 693 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 635 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 672 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 469 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 678 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 101 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 590 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 385 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 451 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 407 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 723 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 424 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 91 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 378 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 642 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 567 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 408 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 403 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 485 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 573 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 517 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 342 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 646 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 344 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 686 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 505 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 31 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 394 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 766 776 774 767 773 769 770 772 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 583 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 611 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 564 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 366 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 465 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 721 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 42 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 593 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 595 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 496 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 78 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 740 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 33 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 612 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 677 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 676 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 689 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 764 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 97 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 520 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 340 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 379 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 714 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 439 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 587 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 37 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 54 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 594 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 705 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 534 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 339 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 49 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 518 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 572 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 559 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 695 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 492 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 474 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 436 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 609 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 665 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 532 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 0 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 122 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 697 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 979 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 556 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a8/iar/example_build/tx.ewd b/ports/cortex_a8/iar/example_build/tx.ewd new file mode 100644 index 00000000..897111f4 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a8/iar/example_build/tx.ewp b/ports/cortex_a8/iar/example_build/tx.ewp new file mode 100644 index 00000000..46b5c4d6 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.ewp @@ -0,0 +1,2766 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a8/iar/example_build/tx.ewt b/ports/cortex_a8/iar/example_build/tx.ewt new file mode 100644 index 00000000..2149bed8 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.ewt @@ -0,0 +1,3427 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a8/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a8/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..5dce3ab5 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a8/iar/inc/tx_port.h b/ports/cortex_a8/iar/inc/tx_port.h new file mode 100644 index 00000000..3ff8ef9b --- /dev/null +++ b/ports/cortex_a8/iar/inc/tx_port.h @@ -0,0 +1,397 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A8/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A8/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_a8/iar/readme_threadx.txt b/ports/cortex_a8/iar/readme_threadx.txt new file mode 100644 index 00000000..e46fdee8 --- /dev/null +++ b/ports/cortex_a8/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A8 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A8 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A8 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A8 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A8 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A8 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A8 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A8 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A8 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A8 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a8/iar/src/tx_iar.c b/ports/cortex_a8/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a8/iar/src/tx_thread_context_restore.s b/ports/cortex_a8/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..4a66c503 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_context_save.s b/ports/cortex_a8/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..0d4256ea --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..3036be83 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,270 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..fb54ea4c --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..cc8bb560 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..7d1ef512 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a8/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..4a409e4b --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..552ebed1 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..7d0750c1 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..6da2fdcb --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..8d9efeff --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_schedule.s b/ports/cortex_a8/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..865fb9dd --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_schedule.s @@ -0,0 +1,239 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_stack_build.s b/ports/cortex_a8/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..f5f4da77 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A8 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_system_return.s b/ports/cortex_a8/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..814bc727 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_system_return.s @@ -0,0 +1,162 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..efd958c2 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a8/iar/src/tx_timer_interrupt.s b/ports/cortex_a8/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d7a98738 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_a9/ac5/example_build/build_threadx.bat b/ports/cortex_a9/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..328e013b --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a9/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a9/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..0350727e --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a9.no_neon --fpu=softvfp -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a9/ac5/example_build/sample_threadx.c b/ports/cortex_a9/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..4bec5bf9 --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,414 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size + +VFPEnable EQU 0x40000000 ; VFP enable value + +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A9 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=Reset_Vector ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + EXPORT Reset_Vector +Reset_Vector + + IF {TARGET_FPU_VFP} = {TRUE} + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #VFPEnable ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 + ENDIF + + B __main +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a9/ac5/inc/tx_port.h b/ports/cortex_a9/ac5/inc/tx_port.h new file mode 100644 index 00000000..bc92b621 --- /dev/null +++ b/ports/cortex_a9/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A9/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a9/ac5/readme_threadx.txt b/ports/cortex_a9/ac5/readme_threadx.txt new file mode 100644 index 00000000..b05b8f73 --- /dev/null +++ b/ports/cortex_a9/ac5/readme_threadx.txt @@ -0,0 +1,545 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A9 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A9 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A9 Specifies Cortex-A9 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A9 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A9 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a9/ac5/src/tx_thread_context_restore.s b/ports/cortex_a9/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..5c5259a7 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_context_save.s b/ports/cortex_a9/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..ec7710aa --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..a5484af5 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..371ac248 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..a3b20759 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..221258d5 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..4c4a7c38 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..c15f0bdf --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..955544e7 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..7b91c316 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..d1a25514 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_schedule.s b/ports/cortex_a9/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..10bbe36a --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_stack_build.s b/ports/cortex_a9/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..0364ba18 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,165 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF + +;} + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_system_return.s b/ports/cortex_a9/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..c4ae7a15 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..c74480a5 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_timer_interrupt.s b/ports/cortex_a9/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..1fdec243 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a9/gnu/example_build/build_threadx.bat b/ports/cortex_a9/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..668eb5c7 --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a9/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a9/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..e6ddefad --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a9 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a9/gnu/example_build/crt0.S b/ports/cortex_a9/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a9/gnu/example_build/libc.a b/ports/cortex_a9/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 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

Q>dP6leU^u3WJIStz4({jFOv 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 z%0D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܌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 z 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

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 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�a>o=A><>fB106GvDR0Fso1bsgD7>Ju88AgoQB17xR#QM zwGGB<1!d_fYw;#a(5x-3-AEbce0Z3(IqjhlLs%J(Bk-Bw0m)&;eCO)38MM_ zyBcnQadd~_$9bz+7icYACDNEY@H$L)H$Cc1T<(1Tc0}-QG|qT)=le~Z`XI6g0K>d! zzM9KZq=Ke@n8Ly=BIVBaoABV^d9geWA=oaI&&JQx0bVDK2%ej9ru}l~`|D92=SM7$ zvo=#+?tFg&B3hdNqWfpf_8ze6$5S`ut%l#O-#Lg#Bg{Axmpk9zWYw>w`M$}|%`f{I zYRYRu0{SzW@JmQH&O~Y)#jmMflR3Y~#i})e6}J(7T&hMBRe=uMQoE2VZ~7k79*1Cpje6pvOMr8rKpPEpnhkbZ{Bixg$80O41t ze1js_r8qaaLvg)^e@F3g#h)npXj;~%T#@5W%EO5$N7f2}Cu#UpBJQQ>DsN&ri06Hu zm+nNg-2A1{RH)r=c7|s1*PS?r7Xyz9wymSwNgv$Da?FK1%!PK9yIcEX4&-ObxAp^H z(jVEh#c7V`G{Kllbxt#F+ku=brEl92r2FMPr@`|RpX8#| z*}`d2fjw&~Y)vb9Q8srGpFtV2BIiWK*;Awvh!(RkX(nE!A3^(f31?reNjZ$c*e<0HmQUQZ0?yNOfJTh<}4}e)Z%lDcaoC~N|C5E8FUA98H0Su zfEmPC$X@=K>HV0z;GS)L?$V68%Y3n3IK(fWJ7|Hw-*|u7cuZB!tj>(hR1P`($m)eh z&Y4h|S&-4K{@uQH;`75eULoxDU*|$0A?`!%J#6HQAo1Bdf2pMH9YqEr^PlNn^zZT1 zM9zA*FQ+iCowt0xGn2g|dxLwgeLkfp8JC_lZO9T(i~94IESS^kOr-VM$N$4w$NM?Y zu)Ch=kn$uzS2SZdzGrP`#N2sCYw0SH+2mn4O!pP5KofUtPP+RM!8^z}<2?!i_GoGo zp7Kv3tUG>f%`;xcBmHet7|@iLJI~i4DMaHaa{OimJEyfWf8aI8De^rfj&^qPnLp6}&iy76&>V{xzNN#+4QwO? z^0~}CGqy9^oxwP6JV%iOET+3u z@fsp7`dY=$Yxp-6pHlpp;x@%ciO9$6p6{4{QDgpN{vpGM4oiz`|9h!5=+AJwjrlp= z$2fcos=3b1tdczsoVx6J;5xkF@cSqS-|Cxv4~)}Y>_L=aUckMNzhZxaV{Lvb<)qi* zTdM1!)_2kt+y}C6A>((9=ecizv{&<3zs0_V@62d!`THts{~~8>J`NAZ{72{3_x*|N z;dt>!*c4oO3h(4_yuF5jaMk#Q-~8)%o2fD0=4wa$RsR(XEb?bEvH7?^2*yB^yFU8F z-~R=IFy`iS7h`VTZeBR%=3qSh#D9d_7k)a{0b}k(gB|xsiLWbKG{pEP7U2{BBbPJD zw8Szb88?akNr`1hGG6=>6EhKh(q9-}mzat03F4m!1>|odus8@#0yxq`_pWAu_hT@P zo1yi=^z$;9_RFh=`MoYXalxSKBL<(G@fTEGF}AvT=)~5>&*-!BlEw4Vom+g52C#WAx9{;#UfR3`qGeozs8T$q z|7VNwdu3SM(%QS-tpe?8d@8v3$rA6{&L5} z7vcnKO(IQ0@hkYDi0~N)|Gh|;&zShfNSDu;_*ph8D#US5TVvv9aS@otIO~*5kf0s@ zpFAdBgR_ms#PS^0F)?08g@}7U#>5j?E?$afD9%uvr?^;gh2rIkW-NRoW!%r58S7e9 zpLW-`hYTM)B;T>_#RaHT&RDlAzxl^lH)tNTgJaPBxo)i-A3P6waeX_;T)#cYT(><) z1Jgj2%gMiizbpASh<_X7*l=9ytdlfmof>g}=Q=gYH|x~6WlG2!GP0X_oN0Om&9~C7 z=9V_srtOtzo4?cAqI6;QqBJbd*o)E}1zW4o#o=;yiCK(Ja-545X^ygG$-*8S-^>Pu zOXKIx#y_(dE#s$xq@NuulfJ%gp7E{zbP?A!l5~-FNJ9s=9UCMgcqh)o&yAD zGdNKayb3I3NJ)SRjT3x>{|ZWiKQWvk&KCUs4OW?P=d?aB{;}g84vp=8S=F#LH7A`k z0W_HEBga*bs~$4+uQDv=g|hW$+0S5JsR?Dlb$sT=W8-%r@omrXZR1LKTGpdwdI{qV zuY(seYs9Ejm5wt}Oo{9fG8*0Ev92^Din9nZ=tmiInnHcqH^AL%{1Ur+;JGMH?pXLR z9ufDfq5<|py2J3}?cZLyN~AG);B{CY*K3S3amOOS_!&1F0(-e}CN6i3`wGS^eD}3C z#^p!J@8Ek zS3GSh2Q=rKJI1xg;BAd@??QP`=9I@WbH})g&=9pb=_uxoaqmL9gIh?K%NuzD>GB!l zZf0jhh4}1jYmB>j-xwG7?0ycfH65P;(HK{rzdFXnYo)Ve+!~b0G3-c1E^%>8`f$rES{A0!6D0X5@yJ*Sz4bcK_yZrS`{$tvOY#fYMc&>aBsJ^Q$hO^<0 z#5yj8s5x(|^4UY> zTu%E(*yxAicDKjGuP_jf)Fk(A{4-T!bmneHOU?y(VLgB1dYeGsFL;!OY!`yU8L zN$SbPeBirBUCRHHLZ}GhsUq9_z^a;0oj7QSf5b!n^znBL z${JOJe(sfvVp?9y*2dMmHioOwOWFtjoPlVwYk(M6vpNj2G&kU0RcE>yMKcWMzV5E^EUy2WJJlR|$<2l0Nng<2yc#Z)u&{ z?un*<_C>EmM~=qkWN_Keh`D3<*3wlXv&qA9m@c0&{FjlAca(9)n>&Vo7GvZmk*K{f z{Ihu4|J4)*H09-v;cvtfGoj_RHHP1eF|9lxwM^4~xnuZSP+mS`_%~5rOJmw|QNBIL z*kIKU-e}#MZxwS+tWpUol%_|WiOU_sZ?x*y))@Y9lsC*2f->plFLw+-qaeRA{LM($ z()s3&;qOPf`}G_MrV7OH1s+CjWFsN4y)pbo^cTK*jWgvL*`OW%L9A2rTE@;kI`2ih z2T;yV-5Kr%#+Ksv3@~GOeN2agczuU)sQP}aRiDCg@sd4FahBq8#fua#Q@lZu{f+a1 zI~3Pz_;(Z^SNxqK?|B|)6A}5?Kl0>nGwf z#_40`O0saAe*7{DI!-@9#_4s*GFIe7dz?PDFOyBfC!jJ;H{XMDoF0A;`YXhL_{ZsT zOSL{ue+H}FL;T*Cy$WV^yx2XcS_vS$SoWBlvT>{6X>lyhLrS8S2q4U5oEdz!I2Pa2 z5wMK}dK4Wlx|CG-dye`i%_;S45wz2~1Or3Ja;5{+C z$!82c6%CX&g#k_b<&MGA))E{Bt?=Gsnsu zgV$R1YikUCKgz2#g=pO==8nO)qC&L@H_l}F3Ib3BmrTX=%5w}}o97t3mW_*pag5d0 zI(qHCF*vTne$n@qtI%F%46ZMVa15^Ru0q6jW(;1#e0WK6QIj}IahzhE;u(rF6uA`1 z^z5g^D-{0)WAJ4S%cCXuJa{GfkHOcsFb3!Miu_*EfxRnzY)$b${5GD zt@ovkHFA4cUep?or2VfMBf|_iE9K7LdEN2D6HXo>7m8n5)ek^0gYSg1oL}Sj;ir%A25Egjy$Q{6_>ul$b077mS5^C6t4^q{&Wx+BX)r_T-M&f0?H)O{ zbj%xJ+g*wu#+o>&Bx-3$Z8`}P?6#z>dH33qcJ_GJj9F*SnWKtFc3(t}a&YY3+TeFj zNBiMLY4sb#eWT}&kDgmvzqY%Y8T-j|09{X>Gr$e(hn92IpF4JLEnOwjn>@_QbT`wZ z&cq!H+4vbX1_JLG<4oL92;eZuxBySPdm(hkkFO*%mgM@F$pf!53J>CK^r$m&xnpOp zZ{{<09)Jc)o5Fym{c^|752L(%*00B+Jg&zWXXvdu zS@mmc>`YDzS67Uqm%rSx^DTLfonJz_gH2&t7RB84>pvmg{Vk;9vBP(37`c;;g2491 z&O6bVOk*6&Y025)AH@1KE`#Olqw`+0djMr#`Pg-4{hHUBj?Vxyb`BrA;n10{D2&HC zHEzx@Uupi|9?sJA3ltj_FHpQvQO3`>=%1qu-SFP|JZvM_^OI) ze|$eql0!}iN63+g0Ztw&&*UToMWq@cD1?CFC1{b8goF@DAo38@wnh>jDk=g#YE_QU zTD7f3`_S4pAUrM>QdUC?1)WC#$p{<|L;$kQI;9^9ivYFiL)&)VV!QYCwh(c{V83hfrw+7f<{eu z&`2BuUC3d9*zGBEz>uDtSi&}9The-vmUS{}_NRV~`2J~Gt`|vzx>#&O+*xND3Hue~ zH!ik2Wkh$Ttnf=Pw|Y!3>NmuUZL?UuNBP|VUCrlMF2H92pFeQmfOHzp#b@#Eyy&$( zH?V(@N5Hr}0&A&u7V59ht4CoY2KDPTYZBdC6rE9%u+z}yQDtw1XY8dMT|0%RfxaN$ zEYMu`A-q`*@*l-IgmcLk2Qt#v(2u+Pz5>*ao&_vpIKBCdFoGTUhxx-8 zKo9N@by5YcMGjCH;7d4&yZq*ZuRWX@T7^bvF|mUAf&~owUqEXY-oW(dU^Ql+FbdwR zfPDaD){tKU3Giw_+~s#BO36(E-sSfoW5+NAEVJV)a9^LpKMKO>34vO-t; zFm;#TG~tnhYkHE%E4TpY3-CydU_vJeJcRstm*2Yxx61PQAN9DE`Al%IK&S+CR=I-( zL-(L2) zQ)y4`@{^W5k3p=YTv@l!DMBFhEE%1@S>l2rmc_b&4P+O>_Wz&&`37&ozgzHA%#Se# z1sF8&8T{))CcMj!JKWYXhA@v|EPPWw{}%?ph6Bo8%POpz0PnzK;r$P!bno(03A5v? z4eNfD&biCaL4u*nnZW~0XccCKupfiF{2VMhJ6^xcupYWYG7pC+TeQCJq{|IeGu@+X z8>=ucw3fZ`ol4;n4P_Dg?kd5GLJfqET`$=~-)^GRhUDJAg6xLo=;r!5j#9rPjby#Es9%8Z62A=}1CKC){?S>E?LKN-&IrszH7#|!I z7!Ej?mGco3)x;dHIZQDqP=)`4*#hSC$kO2}KE-z(>R5uV2>*pE`Mt*7fVzVMSOnZh(8;-~_^Gs_O zR{mCDPUKC-o~2@Akr70vSkkqH<&g@uT&0Sg6cKamXIl?T+R2ffY~~r3GX+&du4leg zinucJ6bn03#ZHejQzZ2OY_!5 zrZK0*)|FC{MUf10zR=>U%PL$R!JF2=U49PQ7D*9}D|AC-3|ZA$nbNfFX5=#RsC%M|{E8QDd= zN#XlVyj+nJA4X}m= zK{psddN^?j`{72ALy}#f@LWDe@9-`^KC9@apP>7mL%60#;3;| z!p9qfhLM8;e1e8?^qP8(c|pRT!2jUu_{XuO$AuiHPPgZv+`(499qh-DU2qG>j?Fu3 zgJ0u3Z~qOY4t_%j>gat~2%bk)!EcFo7n42B%Gh@!LGULG9e75jqpCkS{nQX{TQ)L| zH}M^frU_A@CL`}pD2`QVg?RcrWB7Q93xqluH-e%#jK0uA$S-50822yC3|&Dk(E^Ff z3T-2n@9@kH1(>ctt^+6xhrWPfWQ@j_4Y=flcxiFQ7*@b4%nf~o>Bc&7d7(=Xnla9a zi-!J2%JEKIQHYmqWE4Abqe9OxuEfE{h2Cde%)w%zuQ0BZHMR=Njo@r}7$q%j8pl5c z{0wAkw#u`Q7~_7V$4!Z1u)UdmXf7Pyj&QSC-Y(}2Uqbq3rZg`Y!D}VVl@fFQ$hE64 z(a8J}|Am~*Ra4m}Hy9(^njr{iV^5fKF&y&YiDqL(V-6?Te#xCVzvRn(ujF3i(`oes{BmtAZ=VS2`KZ~CTiv>pXGNz)IhxrT1m?>gpa-oyg zt3p^KdA;W5bvIMNCXZnzB`>Dn@>{3+tzw_w2zJ&;Te3C_o(}0-Eu#7MA z|EFbLzM*;5C$vqdu4MdQc0HuC_adT~k99euCPugN_O{~XXlP^YrEQIC9Pd*4;YB=N zjEKXe@HPg|3Ml>Fy>fPa%pO`*9Xt`H@h_S=)*iIce(Z{k-?y{xn4K6`T0Py)Dz+~z zo(M_L6L#p1j+ouJtj5mYIBRzc6o;EyOV26&#TGF7z7>R)1K%h9^HfF5OgRqn%Is)m zcI|cM)z($^*1(pu&FPymIx!`1e~OMYqW~+j1C=znufsXI$*Yp~EH_y$J;(24hrZfR z&k;JwM?VFAskreYjOCx;368g}Si`+8EVB7D0#z6vEEQ+)ad9G${_wgN`ZJXAu)4o0 zzPxT_LyO!qDfelr`}C;RY`7OU!f1O#`6MIm-7xv_^_|_j9HGOormb#uW0}!b2YZ^h zMG?18w$|(GE&Jc(=Sj-?2(GXkU*;6DZ6dEZltB~cT*wOy{Z(1N)X!dD^vHVlGvm2N zt|Exa!7&uFbyWkJU>#&w`Wi;2UA_um47kq`fqgD>#HF3ijg9K6NB4AFyt%b)-Redu zny&f;G;K>Au7Hd;uZb_+P=`j~U5%?7*Q{$ii#*4b%Qr$hNZxlULoEVq;NZsKW zZ>U>~`ZyPiu9GqyM#d<`tZRu&+4rHuSI`*_hoty9E!1FEjpZWt*g+y?hUDH8k%v* zWAj?0q45$hlWL&3y&F;wy?Rxy5Y+>rl=-i0XMSF@@~0pnI;bTVmo(m~NmKYw`FU|6n1Q|qfg(f)Ou zAutpg>sI3PIj-;El$ji(t+BDeyH`}*UK_upPVTQoBnC8_ZoQOwS=*{LPP^B!xiG27 zZK_ghuO8CWxO-OGhU40~(i8@()~;F+Z>fW}7-lDVX`nkAP}=x{YFH-gd(*F;7u~8X zMb9;@T8&#y``nxA+%AjpA$P&bRjp`t^r<{ayaKo7es~p&e2j0xa{T;nMp=3wj52qui(R)13HhGp zd!Fe@hvk5Ag2J)p6nC5R@>ZBbOJpp5q(2%RH%7=`JMw$d7ofddCul!u<0ueU4BF{9 z%I5v`IDmR=zy|^Afe#0_9&_Q>Y2YjpL<6v1H~vFa>o_NV zoZBEyJlEp>_y!-YV+d_GcPG@AlVl!+?VfJc@oZVo@%*db@%|BXo9jqj=weR4aQ@Ja z@!TQMj`*4Q>2DIA38(_DzeR}82d=+Ch%W}N9n&wzPk)OzXA1O3p8K}L;esN(Zt?QN zP656~;(W^yaz#zpXDRM}w0IvZ?n~LXFxDR}eBSdg7~2Vt#q))}${UKgK*4(eEj$D4 zGYe<$*f)e68Am-IjAxtYb1cBo3YIG<=YtVGMd6&^NOz%vY!~943SOh&tqR_+;CB_= zr{IeU9#k-;;O`X-vOeHTl_tU>1usyrUcoj6zog(c1#eYQ#y`@3N8$Sw{HcN|1^-<^ zxw94Y6s0lWVG5q1;5iD)ovnyps_=^yyj#Hs6%=_U=w49xZxj?E4f*3yXFew@SgGJ# z1#1;tso)nBd{n`G3jS8Xw-x-0f6L$8x&llV26S`6}(%) zM-+Tg!JjGEt6%_&1m;_=;8X>_px{;oQwqMV;GY%b*&wDLs9>&wg$focc&dWa6_h(& zkxuS(1#D5_mnpba!J8DkN5MS`b}9IRg1=VqEd}3KkSDlVz8nP$6pSf2Pr)UGcvk8a zyhMd}D7an02NZl+!Cw<1T~fjKRCo^7e$00yA>s=aJVk|9DY!s|pRZu83U62N8Wn!M zf;Xw~dlcNGpa}4h59e)bkas68_qd2x5F(!M9pZ}=-lFg}g?B1^tHLon4GaG?H5;_0I-&w}uZnU$6Wku`5*uu{=VXHn1G*(xlJ1g3m3LBk~|KNEv z+(DIPRNx%i2$WO8Q`1p~oDV4@9=)TM@f6SuNBbPaSu9;v;$3rgKlQT@K6vhu5y%&| z^Dzy)#j>Zzwk6T6nTgWfDI1^4+=M1C&YIKxFG#~O{sv`E zM;qdmaxg2pEcs2~;hN4=R##^#$TM?iIcMgW=Us^7Ik2o~qIV$9bMXuu&X?i7fZJ0! zQT9a-<`DF4FnaWa%_r8 zymz@uJ6WX-hHrl(DCrjW+Q!Bt%QHE)ZI2nQ*b_k7U>HB73n2Z%era`C1HOE-Bt6O- zuHIuHeE{jP;*s=~NI!DZzs-r^Ih1FjR-Jon$GJq*ryTVU#%@Z5lQ*SojO{@9rc`a= zZt-VT+>|m0*Cp*T*z?-E<99gynKCi4CTGnrF!6R(#!2$-^sNbiFf z7blI|)H8cB?mojg$S9r--o=ntu^H`~>}bNXb~esW0v^2l1)O{A+SYS+IMIvg@2&0K z{l~zZ?gM{t#=!P*90MzTV_pbA#KDqGcbR2tl5%`qP_U6Uy{8Ec6x6~am>^H8J`n<{<8r7NwKXx!SK#E zqRCs(UZ_v31w0n=jNv0@G;z1>`0vgO--7nSJ#^ugBrv>Uz=Xt2?6Xs}^5h)u_HY z3w>3o`iiiEef0qQ>g}YzuRJ=AHPWH49w*(2s9Tq@JGH&k>94+X@*JFJ<$QOg%*orI zJp7!DPnBUThXvkW!ZXsw^R#LEl208n$1hO)HaT;A{^9ve;XH>iRRLa7Kk(&qFMShB z+-=6tSLidlBJnM=qT}wJ5{LIap3R*_Gj`zdJp9?w>`>^85WZQ9U_;sQ;z~MmNGNn# z=yZgq4RnnuPs+q=7pT&SBbwn?vkNjEnK&s22nzNNnrR}I2T()#Fuhy?)>%A5=^V@C zP3jfkH?Xf^=j^`L>IQj7DJ>9(wL!dNj&vAvuyZy05Pem9j>o_`iy2X7pldL-<0*m* z;5!If;9Oq7mEvbk<)_hK;Dd%9WhQ|%>!-xhtUUn1G!VXb0>|K8QFz@W_kv{aRaR- zK!T^i3%N{@Rgg9m1-A+nleF#3s7NtM11V1LI9M<(gOn#aSXSD3#a{&*eD0f zNgG7U(GHfIb~Aa7aj?8JW^Ijiu&6O00rXc$oM+8UUkZV3_4(w4>a-fxEQczPzS6K} zJN{sL15Q*q{w$nYwQ3xHIBhx8&AC@n=cKVathuZ!j#U^L1L>K^tOwvxH7XEWVV#%u zE0$%U!@)?~LTr(P1=6sLz~LfNx3Gzqab%re@f>h zMC$R$)DP7$iBBjV^dGX&9~yGFK|VR;kOCw`EzR|P4=kWP+*1lq8Rmp(#j#m-sMroI zvqM#OXrpyv#LnIL<)#@;v67N;B_;N9Ym_;?+RoZ&Z}?+pNlE+65<47xeHuvZ%a+-T zt2)Qe9A8>uw{2VwPucjH;wu?H3&$5!pm={`JYHNjYu1F(=Z-ELbMEMxabqUT+ zP-6e!imK|}{?sx1B5Ry!6%4T>RrZKw*0Ew4(vhEV&+G#HHsE(NepoCTui*DCe#c;- z#qgVrAKv$31(J|^*M8{t>p1Su`_E)VfosR-tui~eIy-uuxz*ZYZw_oq>%{YiEkJRM zPdGGv2)M6`K@B$_v1h^Sd`U_W6FZRs!TC?W8tCUqFg{RQk&!=~igJew*QW$7UbhM| zzxdkAR@zaN?rw(w63?0%B{UK7NQgEI|tziF1^DHx;7BR zu3HL$w<8b-xU{iuwI{e zBxJZOB;}|L&C8Z)Nqyf^iwqiK>t>u`Xhb8iia5H_SN49{%2lgzY{ijRtLE@pmSSFY zXoJ}@KR}Uu1FmUY>X6cqCrPD`X3SRoqsAl)E^VS3`TtHi?ul-bbRCLH1HbaH_R8H zy;J(p;Xs?rZcIa`>CS-PUym3T6Fhp#da$Uv9&>$Z;5E*};++cy?X&byo{qJKfF~AwctH-2I@NuZaLP-7@(5)C2iO5ypH`R5#zt;rH|V zEBI0Fqn(ahj{rZv8ecuQ5Y_d#9)6vMJdT6FH%gCkI_?_aetwIbd#65;gCusyw^Xq~iW3Np|{Rimy&ecxS zaT`>RQN|5Iz)PA4P}33mien`3G5it&@t7D~ud=?#LfXX7uMGt25U!o(r*RGa;r|F( zvd))~vR!<8ii_dD3Cur+uytZY5zaUrUkpDT*C3QdpXH$HzbWY{4|ALoPg;$W|2^*9 z;jcZ*!x8Seqw9;a7d=PWvftVLB;_`C@GE@;?6>Lo>Gc$4!RPji|9n4uML*nIL&pzY zia>=I8VU~6s%Klxq|Bz+@;`d1@BYv2?d{1@HGYhRl)ZZv@n#Ie^|j03d*N3!bN2Y zuv3NaP*9ZG5dN^jzo+2S3cjKszeLHO@)^P)A%0m34pHH}Cz0_YTLzq~;?Gm?LKVMW zL8wLw{S68}K$ruWs)9dK;Rh7_rGo!Th~HZZ{y~MOv)_@gDA@p(t8s9K3a?VQ$mEd* zSs4}{BhF>yH%Z}>6)xig|1{(?LprSDTH~ufx{T_Sva<51xTD{DymbgN!PHtVU=+#* z8P&Pt-waST)#mKUUw#JmR%NezVYh+(d3+K5O!mmnIH$*oP3Bj2K(L>iQZuB)l?Psk1^IWD*PEFb?}^Brfm%E zMVWe^DM=iIuc~2y-JzIYUbC=!Ho^z^!>onfGmthbd}E5Tl?up~-5F_Ra0u zjmgX|=bO-XeSHG=ihxuf3FY-rw zC8y@sCpVh)Nt88ZMr)H+cwRCLe|G-nWJdVPDcr{oM8OZV8E8k!B4FF$AbD?t+$uME zqwM8JQAY0PcN9XF6UDD$eotQX-qd3sd~iV?_TDE&Z%M(&O8=K+8lV(?Y@>kdsCcj4j57)MTL>oX( zCh{B(BkmjPF=W=FAGgDP#ly~6Dw+tnT!Lfh%c-5=eaSA22?KSSGQBQI`337Kb?vQ4 zLaN@2cgW+B(-OV$Ga;*yF}S1~)9b;=TeEx8e?J>-wgls&ll}1Af%4s{oi9Kh3ZB{E zxo=%vGNY`?;n_1g`Eb$h)We{G{HkZ?h_2+0$$OIr&VzcxO@rhR#1Ks-JA-xZBAJ=n|jVcS?32Jqk^pI zDb}kiL3j+F=V2Addq;|L3COKnIqiaOEM0~b>9`5LIBP*Sp8w3O((S(spl>m4JQt`~ znlzEmzoM-pZ(WD_U)RGnq8#GeAAImY|1ioWD04JX4$bHH7+;s1F%9Vu#%CAu$@_=w zPUS%ULOEF2*sPxe(~Rwqyv_EFNz~yvBmb7)QN}_Vqx6>F1uE*3EE{Zq95iE{;PrX% zL>z2tL}QyHc;#hMrsE%n<@WAWIpla|%{25~-*)1&d$=}o!~3-lhT1S)H@jk2^34xE zsCowVrA+HJ$j*$|PCVQ5dQlc`nP&!Kx2Doi-kI>Hp?YLiA;t&F2K%yss@>g0~Z9dfd)F3f9~$FkZumv!!&9GkN5b8JtK~fed!@w*wWM??wE#h8hcdu>pKA7xPk%kA3yD#t4OC>(~&6#dD01Nj`J4ARE@n1#8|iQgPK745_} zx)yC}L~lh~&Sjoh#(p`Khqkm~qa_r@+>P>2QaJkL0W(Tj+}vKYX=-xUt!ZDw{D9wE z9H*0G8++Iml=tl=U(_SmwfWxHF@AGVRui)N^jKmlpEH&{FN*Txc{97FV*Z`N@!Fdk z-O>{T@2oD2+2rQPtKc7I+AzoS9ORwo4u?12i@1C73_Z@V$~v(w7f7C7`EiEe0oaOp zD+lTMOt1~*S-=?QIA@w!DxUl)=L_-KNg@x#=Y&y@7ZbOSYx}Plb z$r#N!kZBvkCNusl%mIDmk8>~=VjL$Ey`MkxI_W3&-^<7|V_NaPryjZM2F|BfZQZ)H z7KD_`0f;-SO_#&S<^007w7$YN%H`CZry`f@D|-v}mD&x^qPR>giVGb{f|ix$@}lD2(+Y095LMe=nc9ke&*vQB7X;;Cx&~3 zSekV$0K{-koYf9GNZj5NO6wM;O0ynv0@I0QSo|OfW>{YVFw+Bz5NL~7EiDsXN351! zf`YhWwRBkuYq1)}0OGV*Eqx>@wOB1(7Ta2^mi{lK)MB;tlSrw>YUyXQFj}mZeiAWP ztd`LR^jRc^SS{!mtHHLXD^`O=PgkrK^oiAiKCxQ*LY838I{q)rN&g#jam8vpYzMI# zYn`zN|0bh+71nv_cachq)zVKUrp0RM-y(KCsVP<)un!)VH4_t|VHyDubY4KS9-&R( zW>S)9{@5IaSh`B07iPr~Z$867bKyYQUV2WD#RDl9FdgKAfh`^~FB^tReH*E{1QQ4G*OW)-tFqMFR~2K~`Mr zDnDzQRi&|p((x0jtrN2^YH2Q+Q5Jk*%w|a7I-YoKTxqOyOiAh3S=D91iYH3!#mj`@a;NT-7pRbZM+(^SQUrylD3dNbSmQojsDbuxlGyl}GfGOvH;u23jk9}=Vte-$Rrc$E*I)5?iB&WNwr`h} zKxf)sTO8YKUs?q{>9XC`<6<4Lai!x+O2>^aDJvN}VFhJ`V<#YFM(M0ZM9nOL6f(AH zd~95`omXr>2&SRnT6-M?oW*uz8K~`ORWpQ$kT8~ypHUr~IlifUme5VUV|>ZXarUrc zRBz_E*tn9J)@hI*Qs#%XW*<2q_aPb1pZ06WFz&G&DNfUA*op^ZC4T+oh(+L`9iQ#W z?4ru-QP-K*SXbLu1-7PbN#C5YDcCtc(~+hDi>)Kkala2FaI~34TNV`D__w8KXo-3c z7&k)4T01H5L@UP!Tf2wh;Vw)Li1-v~2L?**`0%pC|C#)dGO)OF)7~1NB(RS#5rV5V zN@93qS)r11LDr`DPznfrS(mvh3;jDw57}7Q6g-0bPwFcIR0;|q{S+af?k6HB{!&rX zG%kh4Ynvz56rmr5d2taU_R+~btX%MaCdYK<8zoMJrg)R9653~&VR#%)(AdgdQE7$G zgoz@6{5uE}IVa(Pl|4W{t=yOMKhgR*$M$j`+0a%TNLYk0zKWTibV2-1P`JEK;QzI6 zb^t20gk$j|{n6-Rpdo+l$ZvozKzpZvK>JCX0&~u4+UdA65a5?_B~g!D%v7ug*UP#d zve?s!0rz7vj{0Ua%@6y0efYhPhGM2|&d0h%}Cs71e|`32fAaytXelFaK`cXT?GNe)ert? zvcy|K$M>&xI$!LAxnq=Z-vixCng~$S5&DW_OvgssO9%vzANzy#XB+#5rICyA*NQOh zG(U}N=nwz@Ql4R0daPUBxx!yt zwiidV=l&kD!_kU8%S2fr_M%+Jew&7$UQaQ8mK*Ez>%xBc(tfxWsx0lZo+xUNcelH~ zD1zaUeoL@EQbV;ABaLHJM11R3ih+?nGDNN&DKq4!vV~4r1W3FK1CcUA>Jd^eH4Bp- zWrwdRn1wzdehVPeB^11e5YI5kjxJNoQ8Goq0@4G<6g)*i&ch66yAoC_C^ALhB2xsc zQ{l@MT&3V83T{*IRt4`@@H-0bSMa9_CKdd51^=ob?ZB}d^A)UD@L~nq72K-eO$y$l z;FAjeOu^q0qRo306q|wI|0fl1vtNLR6+Dv=vN4V^hR;!OiGnK>yiLKc65{uuf_qfB z$P$rWWQl<9s_+md9rBG4B1~k5fTybPvlX1DV6B4f3PKq}(tnc>Y85m+^yt8uHm9T`PyMCvrUMJwYd*dh$n>Io4v%hI3_(5j^3%cay)v z?rACo1KYom8Gzz}+UrdF%uclltI>T`B4FLnzk52|+kwsF>^%`LK6Ep?0Z)MQo*<;Y zw#kiAZA^L^qLne}|DZQ5z&$(|lU|0Arj1F{Dy+|#bS2U&W76M5%#n;qJE;P@n5Ab- z`aLFgjY-!NE11s$6$T8u3z;fo(rx4{o2f7+%_=El()WNw8I%4Ayfh{~1MmpOq<_Y! zvH8M37+Q*1SYuhCbA53i-I#PMQqh?7l_;NQO!`VRnrBS|o*0e8!#PU^yYt%Ae$5xuGB_Pj#@o5Ur~8GbY`GY{Zy!7vo%G(sP;4GbTNrh4G9@ z-^Lt|VoZ84IEXQ6X<65p^qFM5&?!(LbT>0~jY+dC*2gj?&80VuNe^LxTw~JTU>;2> z515m@8dNs-YkkI~9|g_FFeZH`S-Qrg^U3Q7#-yt_PQLDBo*R-m+%+bB7t^`Mq<>FJ z*O>G$=HMEWK8_Xo1jeNACl}Y4w1^gtU`)D{ls|ULSsmKMvbe^iMVR0klRn5!dU-D? z3Smt8VtS5lOgf4h{O>X*eGO`C1gz&H_p=*3W72Ec654unAaW^VH5!bZ#h%b;R^&7i zd&Z>YJdrFHzxgC=Ik>jeUR}!W71K^A8Jf`33Kro zljib5j7iG`;2D!%NIK7$^wmT^#F#WcJH?pvUs$O^*O+vY={#f7Z?I4wVodrSR>EgY zS{75DG3k-y<{6WImZ)b;T2{E8G3gUn63>`)GuzWMCOw2{J!8^XAR0bn(jtfSj7e8A zt!GS{TQPoP(y|2h8IxX1-acc}VzR_%OuCWrK4a1rai1~i9n8*WO!`gM zag0glGDFXp^md}3#F#XnRZAI@Ucy5Dos3BzAH*WZ{0oX{mZI%tk3*X`j*Y^K*Q_y) zA4eLVFf{q}JKxL71oEkhW_SrAOj#s2m&L;TD(n8Knel}R*r%Xkc7&~AY@V;JYiTK| zZ(dnaTwH>@N}84~EvZ}GI)3G*||JCKQ(!mzQXDH?{iz_=b30iB*|t4=BcW zgo$=KL~g=wVeQ!F8mFJXa{SOCaJ07aI=*h=Fc8^-FB0b?o89V$sE=(@=i%q1BNxXZ zvFl*0Qd`$_jXUe`C!Yk)DXZB!~dn#-Zt6Q$6? zXNgtqz8|5ta5s1fY?Pvx#+MeCmba~LR46-cX^EpRSmJ!0K_iLAS+&(u&yJ*+uhiy8 zmGw-qL3yazSFyFKtdT;9;@QIVEc0qht?`v&jPg(eq>gFUxN9S{kFi{s^%CVL80F+% zilaFdcdUxKwqiZ=rZhY&WTN5JS2W~W5AI{%)wAg8m~xfWhiIAk$4~#U;~El97N{H$``fW63Bp z!Z4LmYTRA+irDAFRtz6e?t%I3152BNq&#?*?DR_Z`B4J3P~y#k7TP(ZN{3MlqL z0mVKj;2RiR|>L4iN1aIp^xyjS5ovdnzMJ}BT+g^PVq;9?&X@GTYo4k5Z^f71(vKl;D?PcaY*Li&=sJE+ zaQ^~R9p@gjIL<$?lz7kauG)%3cXe`CO7w`JmqES1F!VP9&=JFtn9Q`jcl?ez7e?&1 zh{$p0v5gxD2!%Y3WZx*;&tLyLP8o z9~<=uLjUBpsV^j-gkIVUUC{SJ+w(4AqZV}pJ$3g?v^l1ugB>yI-Yk}U{~P*m)U_ht zT-b~p0KFRaS5B-w6^^#222><^Gix^e6idQ`ftpQ8GxqB1;ME<24j9vAf|h!8Qbybx zjedHZx@JN6@d!K+tY|oF8q!lA@z3a6-5#f2*E=bSwzl!3{*@6-m>ehJScmmNAlz#N z5+>?t4YJ_35@rB?+l1dtm=^pTFR0(+Cc>zX6EzYx`rNcpPWHVK-JZ$_5ANZZ!J`H> zgu%TA?s!JrF&6xH#S+I9lqO8*0YOzbVPo8+n9f3ZI38Fg^grXf!-)R?X$p!^CZioD zW#KPCnc#T%^5*P^elP1!YgzPRK=83M6QuZN?IU(k&) za#~LNmY(#wt;rnpb-J;rJF6CHDy~gs-r1Q9Y`;B)bu7}s{^RmQ_lfwyYDX`YnVI1l zj46~8I>DF&Zp7HZoWW;EwJD#co65$?a~2K4A1;KB>$YV68y(3^`kzq@!tqWjVC z{^Y--97bCw^z&{>6)u0c8_Uy7Bl+c&KacD#)&co||F~SI-)rJr&$t(YjjY;Mu`C#73Li+^Tw?cPoQFmbbRXtB5{~+3g?M9tNyJBM! zuf>CbSUK={y%>PQ%!g<8Fb?;pKbIrzhq3bT##Ek9rq@q4XJ(g zn5z(<4&BIL6mxV7kb#+UWcwU^!{#6d&|@II5!;>`Qoga9 zw1Mb$9PzB_F2lSGebv((-OFt#+or*0Y+4WV4MT65^E2Ck?In7v(;WTjK+H)`UeI?Q zLg-gw>>6Dg(e9Hm_DWIzxtPEC8M3$= zWA_@n$^{jjONxQt0!HV%;2*fd!hT$t{0M1pOts`X_r+E+U7l@tVjCr&N{budic>d<~VoYR)Yq!e#)!!eiW18wK&b6!u z=h__94Yr-%3RH|wvE4Y9t^EDH1!Dm58+gJL@P*!OtiA_rx!1xNWV?qAr=O>SW(eY~ zQxZR$H#qS!`u1Q>bPDt`VQ03hzGnpDhD=VpjCUvA2eMvx>mAJfVT`q$HrSG$vn3g* zotWY{XBk-rwtX~Ki!p}2iotF(@?^UOq7ye^obC*D)%1K2*=*a#UTNcfW%8XCO}6xu zossB1c5(-vZP3<6HW{^vogYLxdQV39;H-{r&^tQ*>it5xP_nis5RGgi4SAOpC%Ty? z5^L`{*4`*-V6XeFch14MLLF#>+{XB^P|i__+f(E44q$mdD0-^bn)6ie370+GJ?O-J zz2=D5QHAx#20b?-c zs;ecR&MBa)s7)FbSEaD;A@;B3S-^a5^0@~u<`s@YFCRRkMtcv|o|sp+B&VJM9bWL8 z7_IFgKO=e--o==cIj^7Ni~;s%7TU#Z<8yRv59>_+>`RU(&Vd8Nh(o)v%#7ojFWf~t z$G1Z-xjxBy@_E^|uOrFzGwR9y=+3%eQ&-k$Q(xlP<#WumSJG46DY{o&ZN=lz%r;Q9mr>d5$wRftMMB^kF9gC8o@yy z4Ga{9xLX$(E;-@GW^Ta*3g#mLj|K)tgEmlj1JD3BT>>ZYt2ZkU*Z{;H@=KCUlX4H_ z$*F(AFV`L&TFBTja+a#l$i_{Xw$h~zg#HZ-H5LrLj076X3N`sKIT~n>n}#5$O5;dc z5_ts|0DS=-sS);>lfW~Of011pdK2MxnXbnS7GZ*e1wzBgx!l2mp-wcnJ<-9kLT@6y zeX@gvL*F2Fii72ZN6;-#cp41*!Qb++41#; z{WS*(hD68TJsS8JdG$FOXg_p^@Cb*##diFKNjOJ%5n zaX)s_;bz+})#rUm@lm4YV#rCG^oiCLeNu|4sqBAw<#Mya(Po9sl|s z4fKc`e8e1DIZQDqP=)`4ug5==CxRWm;!}LrG5%i0yR4AvMg#=EkALpGVd0i{KW-Rd zp5S>G1vdir^O15y+NW4#f?kh2#JcOle}Tx47^~4>LVS7gd zuVvb^RBSBr6p6i~ff+!Sr9S!^( z)1Iq{Ya+Z{-1d$JQd`*ejt26{wAWef1clF9krvkB66;jK4_J|3uoAwbfm6uMcQo)M z;)fm$+{GgKjs`vhHd%It8Ih^gI~rKed7VX_Z78i-8?Bik-8BiwPfy`zD5 zl8tvXa19H6?Zwr>X@bxxsa%LH1Hv!-qFBJHokW>@ONy03sh@Q zkKE0Ic}D{mvS8lPz;7`2LW^=dt8jS)FK@&4jt2gUZSNfoe4hE%T3Ah^s_kav3*_ZH z8raVGddb-?Oqh{7SQ6jSzd`>^Vk?60 zd(5)dTvULM*58=_QH}=YBMW&s4mWalA>BI|s>ktJMK}EnkL_`PW~D#b(Lg@pm?B;P z+d+XR@IS~?WX0erIa)XpixLI{7LQ^F0@f&G1sO2@<`aE}40&GC++>o`6Fz30!mMTlQgy0S!|Sn_ zGmpc#Gj~Y=NWYckQ3beO(kvQLZ+b73}s43xvhlngzP_Y$w_L0@jp9`uUj^C!$>S*x7-EG$HwmH)g#^u6-WVV!3>ZLy#b zm(wf6x*-g#QKRMsg&UBIB3uN-jk0dYD%^lI^QY#V9CFWL>GF@wMm~=-v!6IcWbtY;ydpm56!8KU z@j0g?3t2>jGu3=%eL!cu0%cOjoWhl^|GdJLUc>^a)bpyg?2s3n4#9u~l|mL5Za|wW zWC^?Q1$U@^nPtYFg<)n`k~7OoHB>Y!x-{K#<{g$;`O)u)2wLhP*ieT)Qy6juokBoY z??p+o4v=>po)(yFQhq!w>#^Ho{)toAiI&ua+5b8yMUbIhWI0m?3smG3NQS!d%TPbb z317q}9OY!QppYY7A?FoxtSe;R3FRE%qhV(TU@-@{>u2T0IF-YI;=KAhYd=bW*TE?K&p-JX z1Px~I{>ABC7B80*q?*Xyb$Yj^AP#o#I;}BxX8`qQvEOxyeZfgpWTCM0ne%@;Iiryl zpqwG~{)*JRj%r`B46ag$;;itctDSklyF=Twa@p3s4ame*!N7X&HBmrR7Y zF?)S+EEX&%YkF^G^XRhD((&rAxO99Bw-lAf#+1QgSS(g5M#P%OlzJqy5mXv0D=w`b zUlN;5rt6p41B>l7#VDe^w#pvDY$lFHQA-{x=@@@e$=LF-V@pb7u|!Ep>1z$K((&U< zN@CULjx8yf{lv@!ZYqk|@nZXwJA&uO#>G|?k_)iE@hV>|(pMswB2Dc10=gjLJgW zm#~=z7uzfOzXa7qUQJ+GP4jI{jiu+* z?Qng;QGr!&aaT*it8P?^+^X_^uECM&f>Ee|I*;4 z0y}?kv%tpZpC^pQ6V?>KH!hie3gKP5hP47#q;8Ad1-O00{wID8SbpMvuE?6I%V{KD z+qAI!lBveCvzuD?J~-9*+zqv_FY2CJvF+O%hJQ0sS@VaUpT9nAX624oXQjXRPJ88_ zs=A-C#(%r=(c6D{>C_ExRbm-yz&wrdMf~Wn@b7c470;Y$mw=}-JL@`glhtX@&*sr> zaS8mVo)mv{{3twtAMU{FbHA02=Qr6ah@ajsUi0HO(qhDGoG-v#z;p1U zcV;wXM|GLFP^Fk4iXRq zYY{(PwOclLqG{nS#w+t|^YiK5T8NMt-ggCWlGOXX*(XOc-U7T42oscl5$j@)WAlcQ5SF>GM!LHoi9hX zO6#C$4X}RtYHCQvUEMqni&*3(L9bSoYr}iTKAuI`rbk5V_4qyFX^m%mT!4?fObRPRs)YX(Wo6`sJbtoR% z)Khv@nt97wR@I?3J)KMF$tktE`cQ+jfJ6mhZcRqA$HQBd@3dEMcfRdL)>*uXJ{zG|#n z38@$qbvLMC$cx;l&BxwWny*?X*U|A~V~K8QTlp>_7{3q?p;mN7e zRqMl}xgy?DhdcK$P{nGm5f{bV_=4(HE1L}7F63#x>Uu0iA2qF#R$RGmO=E*J0TQlR zDz-zVksK{ltuyK)1ffMC@sqI{LXv4O2#iqXtW@={hk#8W;YYN2H{E zl_uR8KTb`?PxirrLQ}!qInA#0T*Z{=KVE;4_XPe=br?UDD+fQ7O9uPf1*N{(`*>?> zhoyx$sJ0nc1-Pyp2HxHWMsXU~F??5&_5_8?XFdEey;y>uj|0w0C_!e$_bLrR#x(n#=F{e*FG4$}pk`(@yid1_A!^%?CfM-K2b2 z%(?vTfS+mD&veI*HjL}|L82Vv`1_iID%iNE`0%=sdq99O)u!ow4Z0B;0o3Kgn$aD5 zjQ$Jg_R*u9rX$pS#;Exd@WqD!oGt%Qd!LmjgN_N5)BH59p+EfSx{>;6aZ(>$7m_2| zbGG!TAJ6R5M>tmLes4Kcro=CD8^Dx!ew*od_9dkfe9UPNlzm?9X6w+)x0EDs_$A%> z#b0~&hZ`Z(pN9QUJ`Z#lrp7TS--*hvadeYWgWt0%ekvec0zc|<&LpB-7;pi83Hu*}(JAmtNSK_w; z*Waqd?;)_z!^VZ%yL+fNRJ4yojIv#$^1@btE9; zd-2oXn2c8nXiE*4KrN~>Ak8Yq*G&J9GaaB;&>EMIGW|gs$6^C34jigdi$wR6w6(Ey zX&V-h{3><7NZqedXL;p)rj4e%9mz5UPn_l@djS;s6IK}FmUbr z?OBWZQ?I;J!TD$c+F_;MYaS+|FA!qzyrRN$@GRv)HcWe9Ai6Y&lqMEHKt5H81qnimBfKH`a26Xqjd zLWCbs_&7Y0d6<)@E7(am7S9Xec+7Et7B-KNElzPc^MHlCI2J6_iTe(Oxr9Jabb%y~L846yg;Bp1ouH3@CcbfTFhyD0<6) z=b+7)-vR}fDtNJicPl7*%b*jzWkAte2ITPvrq9ASA{?fm=q&>my=6erTL!FE@uIg3 zT=bR!IS!eApMs*d4E$|{i{3JD9-1ZHPz6PA8Mx>z1B%`l6;TLvzA%YdS{3@CcbfTFhyD0<6)qPGkvddq;Kw+twH%YdS{3@Ccb zfTFhyD0<6)qPGkvddq+fc(zzh(OU-WP`KzV1HW70qPGnENrj8vGVor72QUwiPq~6q z75svNTNR{zebT+H;JXU`ML{Z+Fg~o{=?YdWxR4NI@$(AauEOt8`27k#ufktb_^%aQ ziFt_pFC_$@FDm#q6+VFT55fm37$XGzWQA8Kc(DrqqQb9K@KF`srSSam$Ae4bM9 zWkTfhs)AFoDCT^-oDg(t2@$_R!MtoId=w$V$0@j5g+Hk9Zz`CLg%tUGQNgPSk?vXr z532BgRrp&9He#Y>x)wsve^KFADg0UmyHxmOEPP2noe=cZ3jRQa|5)MAD>wk(P^2G9 zIMgso6@DfmCiU|b-b9G^fXt8JizJ5sPTH8l%Lx%*q3}wD*DAb0;q40VRQPslo(ugu;^we_i2RiZGt42h3mQdEop8BVMlJxqnZ5k-`@%T;_k!uT}VV6~9a2 z-&6P#3V%)EzgD=sAMsB^bcf{A>TDdl8v3QB6JnE2j>XDOjYcQ(pZX7Bo9MKJ(Ppn|RU;)E!L8i*Eb|yKW zFbXj+tc|I}P=>WiCNS5qwk)Pjb>i|u zJZ#<1u=W>_IA~f^LmL?9YR{a{T27;S4Nq~0o?)b?J#!ZGKZ^Fu4?!b_wWVcU?U_F_ z=|ZPKfe=-TJj2>7i}kUzXX?uONhFEOiC*h_J=XQ*!R zF$`N0@{3~d;eMuU-G`O&P%AK7f4VeQ|7rR8bQlrYvati6%F;c3rsQnft8+Mg$} zr#*9ksHZ)%n#5H~y`wVHNLHTq%uExgr#e1^68Wcm$j?_so0 zdqx&MKJA&cjkY0t=4`H{6}0&-7*&#<<9wR(oNUuK;=?U{Bm_q1oK80%@z@HC;%uyz}} z#?zj8io~Aw48#;+sKF+)##hKg68$gnn_RZD5lywB$T zWZE2Fu#zUHBi3o5G0N*EoZPcS+4AWVf?-sjUPq}9M2W~7rvI`s%Y55Wv?ns zNU&F_*SCW6pI+nA-$$J8ojv$y2Dd*Y+uHw}X0g?|4fgtm6|75ndKaI00IPTIQx6&?KUDw)Z6qBbD(6+9AC4$!Y z!|KqkO$>5K{w`-!_*(G48UlPjz(MRL@@GNt?;&h5Q0|n2AKv@!nS&D)j+KEpena^k zY3at|hnE)jO~f6EE{0g0hJ>V}0R-)|cM1ZupK-qj!Z)LKI_?Yv_=1i7s0THPSr6_X zvc4?WT>Nwzc#R3zyPoI^(B9dI^YeQf4aM~2N2vML!>`l8Yb?i$e-b^)>2_WM+|Tbl z@QWgh{4(*={MNwl=a&G#@d(pS$E`wupI;8v0=j%$duV=J;MZx$<9S3z=}}I{bpZGC zqa2j$5ta|z?JmEY;Aa~4AKmZ4?@3)r;Edz%P6YwPJ&b)|f4h)|?g9KTR@wx?zc)Y! zk+17C9fI94#mIE*(?0G}d37Ycvwm_SW5*gs1p;}df%Rcg30YS?M&UKuFkZN$r=8AM z;~M(I{}E?TFg$(El)lhy@73BNv1KHA|&)L!vew?lBIoRC9`47hx0q|@B zmz>(M9Z$lKar8631W-GM>Gf(cPBYZ;K!a~N8;>`vQfI*3x0UauCZ*3q0mgyNa4?Gj z@*Yr;2VfVORPY)FhMj4k&VSK#`jR zirgGfOC|kXNA~y#VxjEq5ieBXA zz(sBjC~|W^k(&dG+#FEk=71tM2NbzEpvcVuMQ#o#a&thDn*)m698l!ufFd^s6uCK| z$jt#oZVo7Nb3l=s1B%=nP~_%-A~y#VxjCT7%>hMj4k&VSK#`jRirgGfOC~|W^k(&dG+#FEk=71tM2NbzEpvcVuMQ#o#a&thDn*)m698l!ufFd^s z6uCK|$jt#oZVo7Nb3l=s1B%=nP~_%-A~y#VxjCT7%>hMj4k&VSK#`jRirgGfDvxr+uAM1^HVI+(kaoOj zQ;_yH1IgQ8cWjbk=0BX>z|Z81pN@R-5J6%gN0ifHvH;)+qANw9`80=_5+tU ze*iB8iK_u1NTe+RtKOW2M1d}((t<>o;o~ba5Iqb3Gwx!{;mz==RDmtbQr*xCGklLS zu`5Uv_6741CO7mxf=nGVd@xW1uNEY7QQ?^33*1bS3^BvUU3Hq_n+({`3}3#(F+>rM z?Ftgl!(vKfS)nPuxQ}jzkM9DS;o}y)?FtglLZjIebgo}yoGVD=ey8mU5|3vYTtVVF zjB^Ev%gMzRB>p$!TtVU<#+~Nm5OvJ(y^3ta3|~9rTtVVA=HLkuqb!UkNW7k0k0MA+ z0|zm~CoSs=63fWg6(lZYrmh)2mgVD_;o~7&n&C@lfm}i2oy?=ZAW?*(o*?n7pgFu5 zKBsvCju}1&35Ir&r7K9}S+6C}=ItS3l3pMBy968}tMPmuU0R>2b_-brH5 z3?H9NzZpKRko{)(?jSRtAd!|3{bu;0j6YP6ID)zO1c^_8Ow91f1mFo0DeSTbnE8mN z89o|Iu|GtRNP}!*hVS=mE>Dp75Yu^rM1G!ph#9_sNHdin(S{kmlgP~zB>oGNdxAtB z*7BL*<35Ye3|}tOdN=egW_x;q#GjGa6C~o(&2NV91*Y``iKj5FCrIRmlkF2EUP0U^ zNGxZ$e1gPPJH<=2C3WIbQ`LCxnKjW6A|XL(2@&L#|a9 z_?6uk_*^;RK(nN=WF`*6nrN;pgda&x$W>)VIUv8Bs3z{}qQ|xJxlbGWFg2jGP-)cuvtOL++v)oF za>7qGj;mv%7XbyK8rCUAM#HMPwWHofRlFG+h6`yjfP@+@*~vz>fzUE;5A0!g+7WN z<#anQ0q!r~eDKrlj3T)Fu)yfUuLk@^D_#UTum1AC24DG*#O2pt{&y)NqhzF<=GOt- zU%nP!`94hk_hsK`iF`aLhtgw@(RU!=qsafBh2SrS z0v%2M_deu=m1L|O>u@;d5C2EV|NMQzmSx|1==ROVj-yp?q93bU;1s;1D zzy3bucy^b^jTR_3%2oau-X^!E1_xj~{T3)9i=O5C^7y4>XaCcPwz|x6jQE^At4;;r$ zEEKU^z$m;|D9D@B6AV}MKsILvc*kOFANJUIM=9=VChm3zPM-W%AkM;L{TC>QrIgMz}$2&3R7MMMQf zoe-2vog2d?U}j`M(bQ0|G%ul<`k5uBCaIOD%sgs_mr6}d)5PwP$Wmhth8J3c`-4dieho~jFAMLt3)h+N!$q*~XQ0V_ z83IK_bLLiwk(l9j3=8k2Gj}lIekRVIxn(#7`?$bq&fNMV1f*-h{u&->5meUx2>xYU z{>-fsDJRPGV+9@9HyUX?*!MHWIk4|{sJ{pM9w+C(zD=yH1N&$a#DjfQrwhQoDrDrG zU%R7E}kNC^vmG{&DAx3g0yzlw!~>KgYj% zNF&%cf_WA&gk|i>dIn%02UPM67TkOkyt|a3HJ=9Sz&_1r&fF?N5)7n#ux}mQS7_ns(Ha+!ybBl-Pv zg)7VahV}dR8-yF1`8)I7f46YsajsTC7y!JfHg>TJ*4GL=3wGnDxrxmWT{%@EN{ zKKf(fjvNSEo>B70M#}WezgV6F`?$r*gMA}ev!^HFeUd1hlldOG=bn-_%!^VdAS1xO zX^@kZU~x(rlx9ZeT?IGUV}v$+kR*8VT4(&A$NbTZ6QK^JG^M&?i>NvFYsH z>=_$dlwHTX9_*V8kpTN{;+wm4NcL#v^%Ccr-aBIV32K6wH5@yC`d#hF_IY@d^O9?6rXFZIbDLunTzjzSkEOE>k&jwk<_ z#BU}3%|5sV?Cm~_*_>odRBh;Lq&**j0`|!RARRLdzs_ta%kf~}3}zb;o8C`D7|R)y zItc%V{sjNHD@4G)V#ov7$1sX{fMUv&?VBCX*fH_1B(^9@)5A-i8i^=%7Lw!4t$+2y z_Beul^-OxVBbLL z-s4}G>pha1Jw*u@lY)ke($kr&kD*Jhgs!e32YjNh*rIb~d z7$f{8arPj_2VmcItVx4pPnO;qXZa%q*hlHf(!1j9XBpq9{5^4&s~`aTO#Fj!mb;h% z_8I=MI7+h-{4q+m?GdGJM*@I-tbhyd7o`sf`Q4-4PY3@t!9G5f0QQk*xBi0Vw$q$JM=J2dwz|I6~}F<>@*0Af0r5y z!bWiWXZ(9*Q^ObF^p4k4%z&XWydFnk{6V=Q6#h5J?=ufIj^C8f5%J%d{h(c9ilgI< zDn5N=5eq(G7uGzk9tA68L|myJguO7d$z`y^a7(6=fFYO4z8LK1!lite*7#0Wp0bz?`<{t zEecHq_P%>+ zS^`6i1tz}R|G|VfyEpIMfiZ8_tvxf{9jF{yE8g8S-QAJ7ZZ%8ZU3=X%o!jU(w!aCi zZIgNKWzzAY=V%OStD)}pY;$8s(>i#2Cc2@s+pvV261r=fTW<9HIvB~MmWnYp{=wVM z-d4NWPWA9Z(?tZ7#MhgwqYF)=7Bf*JeC!X z3IeS6Sj2_$HY$ckd6v)lp9Xey%?o=NNl=7jPWd_ySJTmOmF5vCUOO^ zLki*gH1RT4m21&#s~yYmMk_F0%IHyN%eB0vVR+XVV^|ZG7nVpq=r|ORl#yynBHz!f zdbyymbjF8wjJ&Loxzt_Tn`TdVmxM+k@nkwa1BfZ=`<1g`poZQXx z(h8-GN|!19w9-qJ@=I6BSNdJ04=d#&1LOa%QZ6c!|A*3k7#`$@DjlPArqbC;Yn3)B z6-#Ew_buh`Rr;7xel$|<>q>XWup>W4sTf!Tf1>iID_x@W9HnAS2U`}(o2trgW0hX-Yq?v{q@e(hHPcsr0K#zoqmcrOzmRS?QmY4#EqE?h(#saROo7OF$mo5hd`?Qa+U!zKqB1 zw00jWoN~ZH2j;|ejTJu2O(%FA@EOD}?cGr;+7cZ?9lv7e_`#+qb^H22$IsdkWlHJ+ zG7a_r)TZbb`hQGQMmd`xr*i!(an9%q4uq^EbO+nh8D!Z^$8v`h-_%wVt)snCDW5c~ zLlI@G9-`_XzQMZn>K#JwcrXl>W)z|vwtK*IWY@G^d!-{nGp4)ZwB4xyGe>r01J&Y} znVEx$f$x={&SuYTp}Ke&5@VdhrSQ{;qK*6qcL1*Vdwkj|u=#tWQW%p)&!D>aXCwiP zc|8*KRn^7U8Pl&X-;zW#sUW1Pi~q%#4pbLSu2c*`f$HK-U_F|7JGs&FItJ>NoJ_X# zDwLCa1dnp3x_B}eRb9-maHG0NT}z^wFMxKSx+v?>ieIKP-)2IGW-bW0?yD{mqa~X8 zJ66)EF7n0X(abC*JJm(Lj69ktIM{(D$W8q0^JtAnGeud^p_zN3Gd!C4Tb7Wox>$x{ z1kDr((5Ws$bf~(>_2WQw@eJ0j3)RIZQ7b_+rDvV$;(S)<6jSw-frg#xBJ0vK)x~j; zMl^E}b2`<LPVc9h&(QWWc(0Curs=EWoKQ3h0n$12ySvpx(~H z9GW?i`JC$FPuY!5b#V===~NfL&5m)Zi!{8jHL8m=FzHnnpJRC)s4nioIEQAQ&wNgG zaWre@Y@nV^?zxB2u0$!&%q%L}4b{aVkiT=OE?$O;3z{ifqF!~8dmfx}Vk)~XWYgL2 zv1h#MVhwMTM>F^3-S(=BOPJTAnF8>6)kT4NJetXgY@oV0pWW>yz1gu7Vpu_LCn^P>f&hBPSDJ&nb4~)ifXr4T@=;MPHdo7pj4olf5qfd z&`e^jf$HKRWWDO*39O^Hf%*nxy$#eKu>(AsIhfC8uevB(0lezsY*zd91XlwRr4G$B zY>QF#^Qw!tv7kV8aT@Cps4kwt_yEnkmNf}f7a!rR3{)2{W_+N!*uwZgbx~9!J5ya; zhYUSYUHlF!>{S(GGq<9)iQP-kWV{S; z;5O(m!=*A`LBkSz7%rVT067wS8m=f)#4okshAYm9jhhjM8s0n@R*g0mpNU^G6tVMBK{ufikR#S2^zTxEs6gDk@0yk zr7-wBi5dlT^c)7oCyhGGdS^#_6=Q-I???Gp#!R_EQ^PD^e3_VVoja-(Uh3DzNI!|` zpJSryW2W6`(j&>WlB7Dy9T($XIjzpmgG)r*`;^#u?7wd1nV6v_X9pnERsg~FD^gHg z1D}>J;;g$%rBDa?;^tubjV$Q-H>0>>W<|y4aQyqj6*CtuOcq~MK5OCEFEWU36dm8V z45yan1P0@2&P_Rf#4c`KvACf%H>MT$*X)(=NUxN`&Dx*kcQPHrOn6F;xwhdPfBb%h z9_p3xoPlW@&XG1=!l9fR*sYEN1}bm6qKCTMn!?cY-3z7{ae-yWz;T(io3R8=LIm<{cje-4UK_ zj(_eHRqo(1+`7D>0v3~Tg7Jj?%lEIs&JblQ5Y$kC2d5lvY?klzbmP3Uq`SbT-7{v9 z-j;1esd2`4aENqwu<0d@jV%q$Jha+ty*rRv4*BjbRPCOvW^)2DYc^{U%q@PH(Dn9E zrIll!%dv-G|MIHPXzquGW@GIQZyU^pWG$I59=;zp(xXn^4 zOqa$rMtMwC#l54{5~iiw4;RySm97$LY#w+c%KNtMyBd5bZ!P2%BaHHp#mT!3e&*qQrn?G}SRQtcalGzU zY9qdl$=ejm1abckKgLvxjru*(bq62sgNi+2GX?Tkw#;NTZqXj7D*}dshgaIccCoE? zEW;aJj~~pZ=}|{H?YS_#YkWK`f#uoJU?gvehjT=G$Mc_qp9CUexwko&geN$MsRr`9o!&ok@D?~jXVZF)XWtYbW%2kf6JT$Fb*sCA65!^QsK_XgvafLh1+ z6}Z?R{O(}9{~Ys5$nxbOTMOtbP&h7_f}8!XGP6KJJGV0X5?WR;ubVt9SlqH4_zAWM zn)$o*4bKM7p)LuGXSPYsDpr0GdAvY){~5oIdi$1y!9%O^cV=`^M6bB3R;l=ULNR_SF*Z&1qqW&HP*KBDwzN@f28;@gye zOKBRngZYLkB|1Rnpj2!gBmNfU?^G)5K?oO{$DmxgrChOj47w*CGvvkQF{s!)2Iayb z!)uj_&13NADK9pU!9SwB*gOU=HjhF7Tf@^SBWHJ|hbetl>93W(uJrFp#pW^Oh|ObA zv3U$CHjhE4;l087iOplsTII#&G58CV7n{f6#pW@n*gOUmo5!GH^BD9+O)oZ&!N04# z*gOU=HjhEY<}s+)JO&k;$DpTRptC+=^B7e0V?f2`F{s!)1{ED>P_cOoDmITn#pW@n z*gOUmo5!GH^B7cY9)pU_V^Fbq3@SE{LB-}VXe*YOSr4&!4Ejao#pW^i?}%gI+NKVA75%Aclut@3=vGrc@FkzbyN_-85K1C+aL#q!0= z{C19R*lh0p*|4+BtI+M|;MuUfHk+|Wr%%LlT!-u}BJ@vw2^PlDLAyMK?Z7#t_ww5C4Q08y~3qh>Z{O?ADDBeEtU;A2=L! z;{#2ocC_)qXs=>SF4~hwsD7jSmNa zcChh*JL~LLhjfNYxRxu*91_HJf8zsfS##sVGSts+eE1AH&2N05-l5<4a0bgcpoEG9n ze&fS>r0K!Nhbt)3ZG6~;vO3uKa4xFkH$G5@&u@IVlAPQ4@LQ&I8z1_z1h?^_4|_Q8 z@YiJC;jhWO!(Wp>GNh^T#+&3fKHQ9? z-PriRdEL&n@!@Q=ST;Toehk#OYuOWaYeOpA$XLs!vlDnHEL)V_n~D9#hf(YszwzNL zCiWX2#2U2U_<-W^6HAzTH6{BsCiXU)izwM|eE1F%`;8CBGS+W=xQ^v|o6Y0M`i&2w zsO>jC{FbqPPU`i&2?J`ikt=)=5z;{)F7;l_ubFt4}ST*S4NBHqWwV)Us2G571vZ;m8wnqQ|0V?nj5^*k>p~^cnz^%@n-*g2DMaLI zS{DS$j@t&MX&))DxwL+PQQC&qWZlvgiEh;kK(|g6+C#B|V-vL%>`}mYhsXouHpjq* zSbCm1a_^C_4zcDKa;oeN&CN>|W008*3=O?jntQD@ez#&h>xVab z226MCG*_V=tUTMnwLG?$^_q<&dRgArD6C7ff0xIgstSg9cwG&T5SS82s_Pu zURcL|+}ARoj{_wpwz72_u6LeJ&RRvNo+h2ToP1pNl?KhK?Rot6m9tHdUCyorWIbVL&i(Ep2fxe5clD_3)e7QMYzVEbW!3US%eE*wY4dxtZ)*GN`|l56_`Xx06}|BBmCv@NqLW^E>;3old>?7P z2{@f;_glR_Ibrqs!F?f{=^tATU2*7@CyFn6HHxm2yx3W{nf?A{$ukH3&$ayrGq$eq|5W`E{Er9WKMKMhvElLRO>3)* z+a3z|GVu2Y{8-4jH{ff*e@FQZ@PAwVx59sy`d@?p8|uFv{;#Y5M)+@0|9be>!=H%O zZ;p!BZw+?ghl1q2)YthC677+qJ3=gQ(P#Y{nU!Ns{N+{bEi#iS^?;DoJPlH!TldxF`JP{?Sucxf00k8%9wmK9+9wWi{+S9pX9IMhl%rbBz=;5 zgQQ*HPr=3M4(LO_O$<0rWkIQKt^u{=GZoGf;+y%+H1;@>(teAE235#Zp zuUt5xV$%4^ii$PK`NuXSS1o90s7juFY*n)1*z?c7;DQFa_DuO`nuHvOICf@2pZ|6hcEXCM2(ghW{s%Z-?M(up<6)Z*(O1>Jv|z z$=@D-r=hMJf2-DU#7!SK?8^9(#OIQqO0O2j1vh zL>?RjSTCPndGfH%$#zg4sg-vI{LC{E7u`Mm@LgiO@}KD#f2L9i#J^z>!alH$>FAc> z3d%=TKgUgnC5&X8U@J2HrZ!|sXY}^IlLwQ_xw(Y>@tCM#v{5B6od zV(hhOvgib)8)X?#D;mq1Zj3T|DboFl9(6VyDIW69rO-%zd!pHLvAxB(*e7<(!yBzY z0e_=Mot0;KOT+LFVx5!s$h#EuEkc)a`aLGpj!MIE-7^;^M{iOd=hw!?691lMHGaGk z6SkK9#S!gY*S08m*Su>_x5dX&{*b6t1NiKtZb?OufcI@?0l%<-UtYkUQ@~$Xz+Y0p zf4zWzw19uQfPbNYf2n}qT)@9k!2hLy59b23&p97&?Q@ouSIWz~e19733}*{9H47V8 z)HJMI4lVB$HL`0!r@Hwu%bJ@SSJW*(r$%E9X=rXb3s&%#^Ysq>SDK+G+t30N%z1*B zHMX|a;hkr*=f^g!T-LaJaf6M-EJI77tVPQyvZ-NNi-@kn31Wt(m6^wzh(GoN^6zQ zSGq{)Ql%|QS14Vj^gN}jm9ACF@kaTVD_y7b8l~4Oy;13UrMD{Gp!6=KcPqU|>3vEc zRJu{=V@e-a`jpaVmA;_#MWrt(-K6w2rLQY}Q|a4E-%br>)^-baB!TJ`HmZCh; zGK@P?r00QHq$`wOuJId`^57Asf0h)JHSSv+u{Sy|WhlQ|*l)u~k&e&g1RlTK0SLP! zQI+yjls{DYsY<6SouPD=(rTr1l+IInn$lXO^OY`A$~jpAbGaf?%$bTw(HBFMqU)jr z7<7ryu}b;;X7~|GXDB^U>B&k@S2|zm5~X~eGe4i>q!%i^oD}7+Q+l0-%lJmR7s#XT zzt-?J<@x-joPUyHrHHF3q+Ea?l_eR(S1ErGDR^S4uDxiyv=`+|zu=#xwqKfP2cT+- z(~RkA-F@=J$p?0K-TiGd32^J~)Qc&mtYI1nMbUsq>M< zs?8)zGhb(} zP3(I(>Me#NmqdyEN{qzJ3ye}OooV4?N4cWRlps#jW)kC%5*b5q64E9JNY4fP3_Q{z z{HiyBKN-2o68mTBQNM(<7s|EDgsfzu9hp|fIeVd>WI3{^Nwt}AtiypNQorKN#~A0- zX88I_IJKGnOnHz=IU@5_#^u`!{V9q`$B82|s~G3hW@?!4sB!GS($#V1CyexJGZ(YO zF4Sgdo_k%Km}`30sm;jK{uEQ8REC|CaB4HGOX5^^ke+^c5G!{r{&9#%2ksT|^g{;i zLL;Ab?BPUX<~{fmPHpA^R(_$Df&0J#mE>zW;nijyMw-(SUmsZ05+!aA?1d&aXg;2P znD~Za(wT2jq*I%DfU@$`W)jX`=n=dt-!%D#W!_=MoW0P?$T_u{o0!t6%?xJ=PHiT^ z9?nynN#v=`B=Xc|5>9RAdz9kTW;lgU%pi;Q1#^J!fUkV@hW)^kKHo z*$cgz+;a~zMJeosE~2N;Zj(_`%n_vM|iu|?TqnAoe$ybO^EuQt=l#9nRY5+?R)GcrT*YBRKY zobYNhB~0wqW@LKd)n;gkG~v}|XqPYH)n@*{YIwDoH`xTQHgg3Nd$k!coFAyoe23A2 z+KfzG0=1b(DJ@W&8PCGDRGTTLm_TjjTS!)v=oe?@(dyM^`ZJwZn>mzhCu%b>8a^;F zI?mD%a>A?4T+e)7ZRQ46suO#mzh)!UUT6ZRAC9CnuQu}>vwO9f)fDdSg&xaTuQoG~ zdA-`qS-dsgUg(dQ*sINO`846}g}%hRUTubEP7_{jW`8CQ)MnO_57cJ%X1xNnnMO(r z)Mj>Pe4sXS5Az3VGdHogKyBs?=I=~x<|cGochzPRIQ{TR7UlHr!%hW#UrN@(q{&2bWfl#?X*rnd87;rWmE)H*?><~Of| zHV&0x<}b#%V~e4}&^PqYVME~{I0_IxOM^i$omA>QzV1%=ionZW9F}SGFwd8;D8cs; z-&>dhILs5vuENW^5B?Thp<`OQ{cz#sg_RQHI!afGXq$&AneO}`zn+5{$K##L{FFy(<<-M)^S~Re z!;5_iJ?d;fp8-CsUlru#5Jq_ea9Md=bPDA?4tWz0W}S^|MnEWUPEbG2Ev&rH!Ef_W z#(yC)M~^xiw+4JD?=;9OMi}ci5SNu_v2@-)I#|?+p0JGsPkFp#RJ> zTN;Lc5STWGXW(MF7k+$&wPF8oBzc!~vrH3~bf+6yo_E+go_`oRV$e3E3=zbbF)W;8 z?tO4Ej?awtFlakLD7V@?!L+ufW`482sN6Incn`_%jQTuPkUbKGvE9TS_Pt&<9_0=h`~wMs8jDqr-7-=O^Wl|G{MXG(vgRB#lee@po^ zZWqfLs#Ne3@M3QeRO}6cwrKnXN-tL`_68BZLHT=?KBn~NO52o*y+NdZPx%af7%X4x z4T6fjK~S+b2rBjlK^ruk*c$|Yi}H6WrR6Bf5qpE6|5y1U{E$VyQn5FPc(FGKDmJS? zYc*c%4T3*U`FoU#y+MSFy+KgoeU#g)*JJuY>*sb{ZvHMQw0uTghq%f0=6>wdVqpF94saFKsHpWn_8wYPBpe!na>?C*o=LfV+n z>u(hXqJL+9;KHl`JsLS((sA&|@=(+r`l}Iu?e{s7K1sZ>xkG<7xqit{f?!*JDtVjX zaj)@EPp+5X+x5g4H#%f7$*m9lD2f-Z!Qr0VZO(aFM{7fD4$d)=^G)`Y zD&k-C16(b*bmTF}?Di3#88Y-Tw{03w7kj(ym-b@wzTESec0Sl;2estQOSw%8 z6ZV(cfS1{kM;@FTi@o6Ea+Aud%Byl?u_d~(uC;MoZtRiG^BYgX8bw1Rj;O)z*-i*u2W;D&OalUVzjVt_K zT#t0^wYTtl@gbz^&iCT${m{=SjNglcaIs(5?`$hXIQK4Y>b{Q4uX_-j*QO8Sdoirb zj`%+0y{6+B=Jy{yx1D3Z*;kkO{l+l^>D)3@7fpFJ(mooF z-D9|!?hI0C#vbn2b+LTg^pg_PR@8vKfg6B9ZEx zGSMJAM=jQ5eW;HbMZ0Dr&SZBpQ(Bg}Q`m*xa=%-kKZ{eet!?RGbHr~}Ibv>tv76%f8Lyk-xMLHW;$A^gY>J~5NV_TSamMH&+Sn9# zB=YE{xL+WqqfK!pSLy+z4mQPo9CCwAapXp`cCsn%FO+OH#g(IyZd2TkkW4ql{ZZ<& z3%9`Cf{UBtZe?uyo8o8-)oz1JXTF3CmMhB44!G`bihC5fxGC;M*4b@}`!dU!RASnZ z=|{;`hD&E|VRyStajVcozbS4ZIkzcpA*HxYanCc(ZHl{;Qt~&&amh$F#pPJ8+Y|>T z3O2>j;&!kp?pW5Xi%oGCqGZ_=Cq3&n#SNvTQ%ti`nROK8HpQ_nJ=+w=1tM;W<42I+ z6epiKg`48eWWjz@9JkT+U{l^Zk7PFCXFrnv9%Zn#ZxwdCBU zxH`&oo8q{`erqv**{qA5>+!ZYEi4vwSot0V4^4z94zMK4}xD&|vO>s|< z?Rrxj?TznTo8q{6R5rz3$fo;EaXeGoZF@^)-)F4d1((i#nLT6KqAcwQ2b^Z+FZa>EQO>u`X)^CbCh2{E9aa?o=HpN}T#C}uUW+wKV;_Ary zO>r}s*l&vCFEbHrid#m}!KS!T?2lkm+;~b0HpT5qe#=d9u>6s?DXt&H$fh`X0QgOD zX{Pg=;$9=$$)-5Y|725~EcW_MadVi@Z;IQ<&g^7U+#n_oHpR)(uiq4R2ebQ4apg?y zH^p7U9`T#v?qmn}O>y63tlt#({}}5x#ic0OZ;IoKHP{sQBw4>Hj)w$J!# zrztGh6n7EJ3O2<(KyksQxHB0aY>JZ!Xs{_xCZL^din|s9d$K7`R`&g-xcgcD)@+KC zjo!K`?m~9Tj@lIWXEYFJRiA>nPRvv7Oeg6KG-pdD$RDLv7gDLs-~isOmY%Zbkz zIhI6T-|_5`*D|wVP8ucVJ>(@ESML>n480H^La}iU6RlGzBP(odR9vFLNU@#HnKnBi zwr> zV!!U$i2M9Ud|}tHPS^lPN8}N=1P=F8ot^8F?c{)Ev!}#bJhppd8lj1~u(7G(oT%rP zBWlccn#wKqvJ~#e>0ptx#+k5|{WHtzu_5McbLKSm)a38B;byZPexx!x8Ydrb$HSC+ za*VRE>L}Zl{Qfbqy3CV|>tTFZ%q(-Sm$NyNw|ZQ&oCjymuUmoRo14TSb~`K2wD8?j zx764Q&)cHswnMdhZnAD(J9{~7dgzv_#yXs|XU<19I|rN5dv=Reu;bDh<2GmR&N}hP z<7#Ffb>!UHC(S(hsG2$4h*dY=H(A!k{ldM7Hruz1NprRJU32uzSx0dv7!USqtl@^l zRvU!=vHPn0_N~HwSle(UveYU6Fk}6ZwtJ}YGAy~9K3hgxv7pU@J8H|Hl7}Jwx7=cAJ*?( z$g};7#W^Rh75-4(JCN7j8h#;Wk;W9j){pZFTfaigVmIsw$RXZ3ThWMBm3MhtE15oJ4qE9naP6SA>6yhb|i2gyM<|BoC&4@I*$23tCSw1l+Ox= z3zh+Ty7G&Zu2p)O(i@a+Q2KqPk0||_(%&cr03h<;Qkq8hvpiY!1C^CB(B3_3reAvZ zteJk0GjcI5mGjh?+_wa(^x-4Hbq(ev%UZS*I=}e{bl;-$5 zV|xDX@QCAgGI@D!;Gd;@{xG}+&za@`T%m1X3^pC9<8;=o z3vlsQsH1?3(z6a+T*eAHaPb=yQaf<5h>dsP;<>zw4qW^W;~cp7Uo3AcEN;k@ty|#Y zFIk=g7tdpP4qP0~nmLObP2@bdxHmI)4K6;1WIGqQcnxYK;Np{Pfd>~);oY?GVJbT_ zWYgJu*fTb^D9gQR0l2s?@3sdQ%b3@Li_4kVgNwgqM|yDaBF1`f@so`8;NquPt_K$% zWkKHJh9G$!Tzrp-J-E1ntOpktQ?dsa`O6H!#d9e-02jrSSpY5`L}>xI$isQt0T+*8 za{`MSG$tY7qC5aRxHy)@dvGzwY@L9Mqft8n7hh*W4=%2t7!NMO5PzrOVg-{2;NpQy z@4>})DBOdKf~R)~E|_(@9c5M2Bf``&|#XRubai2;~M($Z0O8f69G z;_i$Oz(v{V5`c@3Q(OQpu4PRFaB&Ue190(b@|}T;w;(}Jz(pQv99Z0Vp5<>1xX9nC zwYafE!NvE`K!A&5G1rNoM&)B}oPoJR1}m_5i~x&sM!;nMF#;>j9!Wz=@p0T>6<0^Y zk7H(T(nUVfPuji=7T2@$Cw`^IR#K8xQYWtv(I*N7_C|OeoM{Wg(O=KC?jvbQeeg&OEnX>W_ z)pQHXG=ODih~^H%GS3EnEYN5}^GX_>u!ln%0~pSNOU(it#KLrD;Z_jX8fO7RdWgWK zF{`l?z?b-Kz#yr*(J{O+^?n z8_qVE4l}+j^rr4cSmukC$Fi5l` zhsv`ZT%)w@m<_+pLm3wXgFGwdF@an{k#_%oH- zaAK8HECXuuEQ3F2Ui2=?%^{5CqN=Xki{Q6)g%?&nP2YzbfFJ7oHt)W(50|j&&fm$t6DP z7*}c;Q1asn_zLjMi`yaj4=jkcK!h{z;pPx{Oq-d)f|ivlS|k2%uv6=rV6um0P{u8){tDtOS0<=o0 zV5{Ic-WV>}DyU$qpo=totx~~O5q^X68Egs zv_k3ON(Ea*ykM)Kf~|rIwhAiPDyY~40Tp{7pkfaMRP2F(iaiieu?GSw_CP?z9th}I z=)STZla(H=bgt6*N?Vn#QTj!tw!faDt!oRgR_bvMj3)enwm(w2ue7C$*R`c9uaL87Y44*5`kJ))F-X&t zRr1W$FSb$FGaX%x^j~Q!%4vGF5mKyq(7axKPWrJhLrh2bs>zjlfkmbV+)J@I(O^F0dVF;$xzTeFC(4@x z$Qpcg4IZWrU;Ph+E57=S)J2pxKMODMRoXA^0AD?UQ4U{Sg$$M}%2Whg_wm)QBNy@2 zZ?n!0U%i>-IDGYG#yNcT9=;Y1D3LZ6WoXgg4aSmU-fl~67 zH~GHr8ee^sLOs5^4_n;@zDirzg0D)?I()T)l1?#|#jy<(r80(ccH!;@Zt8#Qg zhxqEv>`RZYHd9o9uksw~5MLe3_yAw6VOasbdNsub`05Fa5AfBa86V)QbIEsxuP#G^ zp5UurV1>Q%=2uw$*5IrBty+BbYBqWYDQ_lMqr!dn`!ig6Ya|S?qO`V6W997A(VI?4yXLCay}2G|HR%Fawk~>sq3CEWZz; z;nz^y0tQbNaTLXA6~u{zgN%fD79a%CSAzdAK*;IIJ8y#@C@iL0hX8Urks1IsWXh{Z_--6F6V z7!rwpTZQGGRadhVhK#xo$7+TCr|5+S3w0j}RCcF^V;459YyeEDBdRCrrM+nE(mMVM z7c|MyEx|*erfxpb(Ydpln-+Gox222IXLRR#1Jf?Z z@Fjtnhqyv4_Y$o8;7`^UF->sT+!*-D%exVD9j?$Zj;;{P?I<1BDQzC+W4bQ{0oFUM zAl+Vg>+$VqolSQb0)pUZJsQE;FV{)24C>l38-AMy-slkkq-Kj8IUiSuNqg81wu^1GV;SCPI>rmf znsrv5`Oi~|pI{YJmIj}!?Rx^L+39Ni`{C9|* zV!R4=3ObJIK&zArb_$;3fZ>9jf(mvDx=6#vy;ReGf}NsYits~Y ze+qUAdZ6;MpaovAQ_xxs7wi;#?^z0_-vm2Fe+YI8`oC2#^*`~#;-cb5+tRspZBgab2!H;ysPdvV+R3&0s>6^b8O?qL=PtZb1e>~;`j~v1 zkdO9qH+~WL>q~9%#>-zFfHIOuL!HywbswW zOW5^~Y)|_(b1!9-gIz@dP`RSae#ma)x(~bFfn0=L?_`}F>?&srJJ?nBLpj)WJuB~E zS1J~J*mVXu2fKccwRN!T?-}P{*UwT)KJ5Aj-YFg=zbEU`kHetb<)YMM(~JJ)7O`HLH z2e9i1R@A|+Q`wIlz^*rwCM_Jxhz^>1*JO{h- zyqu0;*XLQDgI$khc@B2{133q~9>98f*i|N9UBj-=K>p4JyIzGF3GDh4Hr>On0-{@B zHI+S@oo3l|R?L!GwkRt{cXtT8mN2h}U7J~uhh1-EM|#-xGmQ1H>uAP$*tL@Pz{9SW z^2U1DRS;YcyFSUp9(J8Z)~mHvQnFWTQa!mjU9 zYyi8S05Jl)$^*c|u776bJnSk;w%vhUF~h*`Ierk6CKv(8iiu$lyV62$XEt;H#!>^= zbrREi*!3?I?qSy~+u~u@tC-lsu2)l*hh6VrtcP7+W2}c==TUNpud8h$kM zP(w97P4X~3=SawdWT#59YMjZ46#mHgDdeIo|9^CWQvHnSIa2D-(dVMLa&_hS%3n1m zGl{W)I#Yl~JJn@n?-!mM&#+;*#^J)igqw?dW^`Fi9RYyy*6W9tB*FTmo%RaPe|G9i z|5hQOHCh77`^Z_v4VKV4M?Y;ZyVJ;<7c6LP1mXi5tzz2OozD$Zzk!L?4@oz5XGTGH zD%f+IRJGl+0;3?f=RG&e+pEgjXn;~t$NfmCvVQnzXVk9lYWO<9~q z;KJM9;ar7y=WCMN|6^J@Vslu3b68SG=_--N=7Be2x~3q&dZ!hn<0=l{hSu41g?MKr z+kr;19bB)3SL!tz)aHRVx*dythXw)GOROU(CYll8iEN*hR}a6<18?*iz?LcWsAD?1 zLcFsY@^T1g{W`-tM_@g70@7G#%PPb>TY~y^hIh_{yqpyVYUQngKWy(R$SXz|>o*XW zZEqpoxft@kXB&xhl*j94r6A%)0iO)}#g#i zemtmkjJI>t0N`{}SXj0{n|2P|1S^=5U5>28G&g|qe0a9G_k8%?^WoEY))3czP|*hk6@5@p(FX+;eNa%* z2L%;czP|*hk6@5@p(FX-ha~%j&^g%&I9~86~(=`3kk*(b^csa4(DoHU1 zs8V{2hL6Uhkl}n^g%~EEN8~F>5pS_eOZkjqxc$&wsj8q|Vwe-VfBySRcvrzWo4eEl zr4DG6Gv{~`e@qu&Ew*#Rv)_C1#GMgOJXCIG6mdZ~F6Dxs;)(C^9``HZ|BZ+Pp12YO zcw#FOSv>IqjI{tytUzkT6KfIE5uRvrrH(?908bc;deyiQHtsVqO`{opJl}yo_G>DhbP|3 zlnzhahb1^X@nxpm3OtctBpy%v8%yXwjZ@|i4o_@hN{1)D$o4rrQEVA|Jn=Lp?HW&P zLko5;Jn?$;jo^u&VCQ-~@j~{QMGR9}?sRZ$I@_0H-NqJWk6~huCvIkEcr&@zF|o%J zFJWSjCn7C=Vu=!x(kWTdjrMrr1Sa-);sU1fc;XVqdOYzo-XV`C{)ve_p7=PM;PJ#; znb_lr{AGrC;uDMx@Wizg7T}4pdm+FRbBx~-PZW$Kz!SfVWP&Hk1Hj{n16iEM6OSO< z37*IkQpHTJAch`K9`;E7_R z*yD+3u|GYY_#_j1JdxYD0z6TS{hpDym!YLCS=tf~@I)>)g?QpB@&TSG+gAcSQMS4S zc%p232=GK2z6$Zgn^;_cC;pA&wKF_%A-bt2c;e4kpjYEOhW)rTcp`tR7EfHlO718; zkz2woo_I4F8y^{$pbd0oxGbJHRq({w1PZ4zp4M>%Pb7jH&yqY$&pDF86OYwoBQHY< z9#0hQ>}Yp}ebn*9nw41lKtttNIcQU&cWXqE$@ppU(fFV`G{12{fxhJ<(08pkE;(R9 zH?TzZ{Pck-F^yXUKOMukHY0nv8L%amxUz|LXq=x9DnixC1WTq7_>YRirQ|>V@g`e` zrJVVTq4~5Ju$by&jMWC65+tKqVbq-EShED@ zGARZZ9{cE2t=z|)ZGur0vsP8rXsA)x+5*Ir(?X6wA&p+olwTl-gt{&a;RdT{HF+mt zHZ`6t21L<)%T_MsopN?XMU+S}2VKJSu+eTa$8I{+J2j}f74~SI_M6q0W8pmdRBExP zdFAqgqcY9$nQFSV#+()ETby@7XdZ)6WA1EoQ%&Ql#Vcw|uN006jP~}95ydH_VtTcq zxp~QA48i)kR{S?dl$yIyU{N?vBM@y9#X)0B_U!q%8*Jt|JW_N!z>V@KQ60p{0f#GK z*O;XkJFxi}^p+Zoi(6|NR@Ft)lLh_Ou(YwRX=O{^;iJ}$^0K;B(wt@W`G?sO0mo0s z9!qLW>Dp6xrR@UgnNcOCb}{b(Ig1&iN9t*-spo{Qlv`~cL3+w+?}?pTcVcII`jz1e!oD^N@kZh< zd_QsB4lhZEGZo^E{4xt2)6(sSE5sW+N>_<=HV^YLU3c(Ce)4w*Z+w^SKqJ`>t}U{? ztk-N@VY!pA{=yXw>#VmBZ!E?em-#7=)XJ-e-{yfgT8bC_6nfOzelElthe2KrX(*2< zk(Jj9e<<%($U7Wi*4em1ym3lUKh8C*yh8oT&4|odVW3vt8u+nv>)cexD+b5wrUez-w4h>}7F2B0f{JZgP_a!5Dz<4s#WpRd*ro*) z+q9r!n-)}T(}Id^T2Qe~3o5p0LB%#LsMw|j-C8WN43Eie#Ui~$+FY(nEV2jsl-1?| zn}4=ZMC;#>IVi!~Zb@2WOI)DJ06G_$0XY|8|{OM(Qd{HEfWmxgEH}| z*;`1~+p49Qp+O;iu=l}L3(WSkajUwN9iA8}V7t6xbHP3XkF*FQXcKs@w3j9K&#Xsya-wa=6)b0xEtQMP$tuI8Ghaqak_Q;B zD02~-m^{#M#hJs&O*Y(+%mPZ8Vz^-$LTbr_3^yWkE~Ol7xLj0Br1NDIla7-{wKD0T zP=rQF4~0_iFX^GsVW@wy3n-KT%DOl?*YvD|LWfh*DW(dk%zO%RP$=t??2$!VT31ac z8#7NZr-MSzpwxw0hN@PkT3B%N!AQ8vP;^5K_O#^J2iCMi$=iPdF;LeUh^b<7gXSAp zb9R*chGEi~T`AH*p;W|5=0Ty!yS^$iiZd%&m2aAS!!mD@b5Q90NRxC>=oE4e3azC~ z2Zi3v^75e2=+AXp?-%)OiXxRQiXeyhAgOvOK3+xs>-i4+>5G*hrb4p@rY% z6DHrR%w(4Lq~WSFza;0N(9x{ta}PsuqI6!Apmk{rg)+n7r}%F&iW*E7{rxfc69n(` zp-`Wgb{lQtPr*NgIR>SU#sA&DfPZp!pOMQ`{A|*djHh+c*oi`}FCidJ^xHi*5>fi6 zA&&<#k&J1mQItwPon6JIPfkz>mGovHZPJ3BsqEhwYuR+RnSEi|qU=z{9;SJVv-?6u z(nFy?XY3IgTba#~^-w6G{^WFxosz9&tcOAeG1fz&V_5F7ns|El0v6<TCsB4~33oVh@G#mzi9dSWQy;cp}S>tYiR%euDiGK%wt2K7c~`2u*GYh5niH z0x0x-G_NSxFV4!N)kC2#v2y+87UFrGrIqJoCs62Ulr}IqI?i6p?($IRSmyJpmG?2W zV<7mez*&|-H@-u9~soL8!vK)~~4~0I* zSPzBvr{sLq%A|)vuV!C*)yfkos@9(vN`=s50EPaD!s?~uWa;`iOCT>9K%r|WE`UN0 zXMCVqc^KmZDD-&poj{?9GmxOWP-ybZME29{I1hzh$@05^LQ7DDyc|bH!>&n3(c2iR zd+@i4+w?qswtL9A-&+TT@+Xc*#4`{(DD@!zr)j6Q98#sk1h%3eLEJYr3H44)WW?|T zu}~G4gNK%-BAe+CojTw&@JuNay`j9-dotKt%kkY_~OLcB))qT{Nzcnf5Xk>f{~=gs-;GuWOdAL z-PUPcIt;D=wm7>XA8zRY4)eIGKqWwg@-Z7CHWmr7D4Z9?xqBY`XiyRZgfY2bbwJqw z=;lLg7Bf=-PDBc(7$TAiy(kO?AQKpwhjlIdX5rl}(Aj)=>m#OODZ}dMnX`_Hw#Nye zJC(9!{%!yd^A+NCfLbjGsfeRN@EqFtKk&rQZAE_Z6r`2e?PXUs4}I-bxWpchsJx+h z*|J7F_{xviI{33)earAgU|$b~_^0S8;%!0P3zGqdqm5A>FE??Ulv={Hbo=4L3kfSD z#%)q+iA`6D0PAPmCS2zS0oFSW;nojtbULOzeCt_f<2Y{&f}w9RyhK35W~j%?t2FwvYWsT93=-fj1h9b=vXtsI&ddX=*61HozCLqUPjr zktvin2l9B2tg~^2_-A+ZEt?@PXN7@Ud28Sg>(^a<%P&CQ-L{b`k1}r#WWyUB4!n{$ zm36kA?^G)1ZX#ZeyaMgD9c%ilSI^S)!?t3ZZ{k76@h9hPg7(A9h-+LKrQ=8u z{xPMC@aSVa-|wM*CExW4{IitLAg1GE2-_8#D{{tliDB+vImM*x+9vGlcuv9PVVKmX zOjlmjX0b_Pm|_bycOmS!s!iD3Rc%r92(U+{qdnLQp`Jq>%qw2y`I`o-yh^Z2bPupf zq~8dvawBM92bOuFjTdJBZ0*11*1z&5@X20ma>rql(RdC-bKm7HyjJ{}$byUC!BhqM z78nx_d;AyT6?^Bcc!@p!5lK719#9NPdD76dhktVJMdz7Aa*yAhA>afQK%5~Ty>(Vpq@l@P;Vvkg^ z^4KE}4c!8Jq-tS+J+4QZ9$=4GP^7~iAEm4gut%bs9((*IE9S7r>Es;tcs)}(>``C^ zhdn;Plv{y4av9uXkMFXC4zNd>b@kYzAf^s`q+*`O9(gc&fIZehXg9FON6>bhu9ZF^u05d)%F30_^d2BopjW9snMDq?yYAd*sQVoneo6qFV%eyp8?ivB&ky z=ds5xvQnL3k5{7+A@=x7Hp*j`|cX0DC;2nFH(*Y?KVJ$5G54V2`6%?*M!JCesJlBQ2zc*yABe4^8a}_V^qN^w{Hc)@N(5NB&kV_Q+Kc;F|klf*7T5#eeQp=)VTsuxQV_!N-HS zwE(CeBL}4jxbFG52}dwOI>8=~M`B=)2SKD_kDQ0c45HHcTcnN|CLUd4i}%?ViBilN#1&$T9i`)%zs|vFa!j_(KXzFgGP3REgl7Ikvs9Mv))2%@fviL?H5w^ zA89=>|COg$2_vHO(5WLb4G^EbIGy@C^;V z!?Pq2Ig;_9qm^=Okv~K!p8@1&Diu5s{37L9SH@qa^aiCHlzw07BT9d!^fyYm1j77p zDNUoB$q!X3x>?{)RlZ(ni_!~}UapkOP0YVR>AgxHQz|yl5Z|W!pOn6*G?Os-_f&eA z(qoj)Rob9b@Ic7BMfp3G3Lc1X!2>}B4+NF7BthjYNl-aU5>(ET1eLQSL2K~?VLO_X zo~QI4rH?3mS?QZf|68f(IwJq>_|Z|0*i8c!yQ`pLcNO$?jsLsSz8Eu1FLqZ!#qKJo z*j)t`yQ`pLcNJ9Zu7Zl)RZy|J3MzJ2LB;MWsMuWv6+94B?5=`}-BnPry9z3HS3$+@ zDyZ091r@uipkj9wbOr`E>nUeRf-X@0vr509RCFB?FS?GPqU#7Mx{jct>j)~kj-aCJ z2r9acprY#tD!PuKqU#7Mx{jct>j>J~&(ueB9l?K5dC_$Q|6S!p*AcwnfuN%62r9ac zprY#tdL&+OY@g^lf{LyqsOUO^3LXe5cpzvY9{4GaXN*O@;}Uq_4kHDRZs`dBYiv5J z`}p612OZdL{I9YD{BHzx7SmN??5Cz=h28>pf8_(wC=Ff!uL5^>!Atw8 zrHl=g1`|$cP@c3-X>dB9j}EvS$85@V-+t;b$VL09pG30~4!B!}-bzd|t%5!sq)Nah+!aY}=KV4MT)US?cAaQ7gJ5&NlkG0p*Za$K2L8tli) zc;N0VO6>x;YlJ+ppDI1;fV&*4?tr^5uuuowu`WHcpL!~8J?*Ey#hgxQka}l{LZ!iC zCh43X`vf6pTUBW319?Vhclm=-<)Z0%b1mf+dzRZ*k zxcevj)B$&YWy(C@E|I4+n8;HaOgN>%OIc5+G+4=c<^gvJr!=@5Q#z$V0(S`q+{G;2 zDGka@$tw-kF{#>5WnXomH2B|;v2y`;RH2MgiKnv{v3VZ2Bkw!C&V|w83X~ufsj=#*%e(HacF97aB`>FS^y9$82cI>B~NHGC$$BDeyPn8FN z2kvGtomUz>i)<%KgGBnpe(Ha)yF73wHhw*DC(7WR0C!Ka5rO?wW7XLy4f5+Wu%Eh- zY(8)o*iYq&zc`Q4+?p9#Vyc1tRK6?&`>8VD@=AjbvK1b<8^gT$z+GrRmB3wSKNW0* z^B7sOC=H%WX#sF|GRqEtyT3Ah0Nk~*xIk&}N#^eixLb#&b{DvVjniy@R=@*yqAb@_ z;0{A|5B^rI{nRO}ZajJoFddfw<2@&%Ca{(|@*cL#X#tj# z+s?--E?r!|(<$=tQ(zm6pbn2K8Y_-Vq`Sb?*x?pe+k-b3(R-6XZG}? z2E^%)m`87}0FYY)BevVgLTURjoP+ba!sGH3eS0mG?t~~>)UJ+R_}I5E1Fnlb8-OAvS|NzH-a;HLjgDe|$|JS%>VrJ+Mk9)_ z?n#e2+s}nKS~29=ekK}X<+Z|Z>p&6HA&)qNbvCXLN6Q8ELl!5m5J#&+WX=i$wer@$ zA9QOpHmF}`INF7f_Z8bnl}DL32eRRfMs*WMI~nP^gQKlLy89_uooxrHneLc~^#IWL zO-~$+{mrV9vaNP3!y7#dylnzK>a0A=TN;Lc7&sbnE^~C(kY2|Sy%EPrmVPYyzBhRd@QzwsYN?@&9*4Tlga13{dy`d8XdjlQK zbfA?=4^hhJ2E%7673>ZCBIVaA73>Y+Hz>bBsbFsie?)n~-oXDxd9J5Y{#!}~djmfd zw}jz>y@3k$1}fMas9nD!p!cdA!QQ~jiV|p>h70xvUa&V%!QMax zdjl2h4OFlnD! zpn|=D9+@`s1bYK7*c<2@8vb9TctHO{=|DV)`FrW;OvBDGx0>Y^b?Z{+ZsPtEyQ_1z zsU6I%1$INDT7$7gQ=t^)UJrYo>o;S6#sFe()V;$J`DWVjWO!d-a@eLb0B0X= zj&o1FR+LkW4)L@(%6R7MQ@I{XcI#hhQ5&KRWBz}1q-UpwKa-*1&y=?f+G_(eKD@}7 zMBS%o=HOl9-QuZuGmhxv?4(kwb0kJIR`^7KD`byAg&=#< zvkuuSr{Gge6;hdbEYu-;tV_?3y}7tWME2fePKWGqa=yjMhyri;lM!!0n)Z=Bt(!si z43o~RqezGB-N$Nofb1Q>QS(icZ&>CXR?Mm7T}CcXCC?*!g4Q}@FToz}0kUVxJ2Z10 z>*P$vokh|zY-94L+93bJ<kw$|Zc9+V^bkZYx`|?g$wkSJ} ziT%llzks81 zFTvvc$%s^->I~WYGkQsoJ=vt-kv-}e1}7uRPLqz2z0|MShyd9e$)%nh+X^?t$7(bV*dPaY`{-)MpOK0XR& zK=&5!oV_ka#gsX1uhW=uABu_bR+@(ViS2v<;!cYE;e%uwu)ngneB!MA$4}UQS@N6( zRmUASp<-4=^6Ui_i4@R4vnKLBTpY#c4J_J4_9dc=#qm~6rxDN3CN55{O$B;%hhpYR zOwcdEFhhHKc9dZq3@PofLk^eY$iuBT>2Rk4^!$2OcaAvhDZaOZl9t z9pV55Q{&nrm!BHL%elX-Wmji^&1h?uQQCW4D#-@ zjf4!!<8`xA5OF{2CPvr~>$9V5CQw^HWY5F&#vomHFv4nJe^ViZ7$MejJH!arVZ0Du zvd)%kc}v6a4+10Pz4R_Do&ABe&A@FBT|4#>9iJ7%1iAmrI%0yQmH{O{u7ICZz$<1b zul};SV4@03(97qqYyoPxxM_alDjun8QABQ-Lb!})>g?qplQ`lGQr!1>r1;!isIbFtJ_zC7Z&5o zmCEl2>G%%prfy%W#Tbbnc8N1iuBz%T&N!Zx!0U$37|y76N3Cj!GXfhdqfJj>f^n_E z2xn2>ZxeW8i5stcwJ3K5)EU3jmdIVSskr!xSEE|+l~=S4+jvD=@v~R74MBWr(-m!k zO9HDL5Us}o&8ER+u>V=BI3r6f3iJq7hmZ^9?duKp;*LD}5W7?M@Mjic%Y`}F5caC~ zM#qgP$03RB!H?a;8*y&q;YEjHz!EpkLmV$*7~EMHz42X`PFck97YIx=8izRevcrgBgE0NuVKpe#g=ExFcrY<4z!~f6T zm%vw5UF)CWCb@7!2*X9d05=2_1(FK{MN1VKlt~SPiWa$MQ^6TW9TaPC_67sqO1?|8nx}wTHEb zv(IqP+WXtVT0(aMMbF~+2~^UzIC3(cx0W!%btr0a+ypNzjz48=$F+o>{z!}@pvJ}+ zja`NeM#_wx5R!UsaeNrLXmNaqEtu$)W5u3lIljg5my9d);-a1<$+tK@gzj*Bi(`tC zZ*k;OO2@Z2_NR1$rzI!Gt(-bp9Ql|Ri{nt1=UW^hge{J5Q%zuToPhdwXK{Q2wGxY? z^sH}jl+`c3#ZkWO`xZxega^9joG79RE(qw>bWqXUexYl3*{eIDV1!^DT}qu)IUCIR1#` z`4&f7_V#CS{0__WEsjMj??tc6iekT~Q2|i_tiL@B6Wt@deBqSR5y?zk{`eeV8|}ILbVMU@hSmc4T02TuD{I zT0-uq7qU2>#B%4Vd2(j_Y8Dh&9K|>vSR7wr;=tlKn_^&bJdT=B7DutIA7CvZe+P-h@l|$L zU~xQ!tq9f4Rfu0@H^ugfALZl!nrj#hs4(Mn)t2$Uf)eKbOm9rsu>i zhKlrI3}O1KaJJHivksiN> zhv?Z+XJ;klO&nniAB-aphZJQ+psEZfm3Gxee2U@;rxyt@vVvqH^B>Q)aUGUW)s%+! zEUc_8X;|KfZ3!=uC0~X_v7)A;VR=Pu*@alx*i^Bmswqj{MeKGM>~GkahB4UZ&^M@Y zi$V-r@PJ}YesyW3x2fR2Wa~s$1KYDz!L;|$CW_pIvZOjyx(XXjb};_>8`xoSq?M|z zSdG($O+T$v&8liF2-LBM)0y%%t(1!bJ&L_6FRUoRhf~BU)2AfKG%$=cCkf}x!gqE4jJ^ycQvv@f7NYwj58Ey?S zZfZL1lX%Eh{i-^y#^%l4I&H>`6BA=F{*FlqGj(DNR!vrvG*%pw7&D`;ykb$^s)n+P zh6@welQ1zcnVkHoN#iFRW1Yg!@g*d*2GuycX^1|4@yyfbSm_SFjORCASkqKe3T$fd zaE0-4Q6_Ga*yXUiq^ZQpFKzUBN=r&h8!9dc6PfOZ4YiJ0se3|xVL17}j2sm`&=o&w z_`!mg6mc*`cCgho!$>m*VYG4afys1H9HUjn8?3Is%NJaa^y&C#rEKuCvW{Gupv9hHM9II;I^9;Wv4xV>%w(3qt|M+u3GILn8Zu z`iMr~GWeNiA`ZG6`*?Al=0!$7eO z16OFclm}UC!$7eO12=2D*oGl*Q(0`oki|9(Y}fGLDdGtz<%w+=@nYKoiftHJs`2%T zpH-AKr-+v|r@+k`{sp1q$CQQ21Vf!uJXkzE_~|y#j^r6)1eKK;e4@3g0U*iUG|25x!TT z@Vx?s?-eMvVW9B60)_7tD15I#;d=!N-z!k~UV*~*3KYIqpzyr{h3^$8e6K*^dj$&L zD^U1efx`C+6uwuW@Vx>XGran)Rg^WS2)|opS#t{cS(RnYDde3hM{o_Zy|U&MC~HoE zvgQ;hYfgc}_X^yj>Hn_i;^xo%{S?P4PEtHY@l3@k#U>)g>>9<_H2ha8?^OJYhL7X* zg!H@*ag8hQag>uP%l!kg+<)-TAgU(m@bbL+plr{{WU{BW=Z)U2+qXRr!o8dON@l|D z9NmIFBCT=lHrA!mCXDs0J85^8b*Zo=TWU+r4DBWP5zj2{9|K_ejj4%v@DU+lKlbAN znTokmHMADh8qWcRL4nsg45{D+lQ(Ev)?k((I-r%^gEYDyp&|T z@n~grKgb!>vY-7Ry%HRnNsK8tk{3JRevs$l{;K;yMyT1)%JRPKdbF}1XA*BeND@JE zKgbRGh3Ke)*UAcZt@1=V{a=uBzhM5;AME^i>zh!X@#5) zjoc41&fGq&?9qq`_JbVGIGs9k@_wfDX=Q1{=(Has z?fSAGWCP=TQ}7<<3l^VlWn^Fqp3K;8Xl42NSoVXIp7l+^T<#R?2g%L}_Jd?y4sAck z2bj}01<&Ux>P##9B8%!oE9-taD^+i~U->?=)iTx<0KeSv`aO zAiqIf9ZbP)2U^)+KgfGnG2awSo812PgCyUi>zjffVag7sV7CLUtlNQB*7a#+Ph~xQ zQ}Ekp%Kr9)qzreKxf_G4JKr4G2>l~PZH!yKv3g(p=-VgEt z${|zm=cp`X3MQv_5B7uP;?pkogOnRUU<4)pdmu0cU(bAj zDfk9fdjFwY+wq0hIs>8*$kfLz!dxp z69=YXzJ9rZDY%KP2o|5x1pNW_gN!qK$P}E-dWTHG53=x(DLBchhD^aSr|JNvV9Z6p z;~^tDG#c84F~f=;8?rDzp}dz%@oZ01a1)r*bnk#)DZhY{uUjn`#~Oy*B*Nv%CtXjOMa-}w>2zDU2WMO zDf@L1*%0zXNxKLo{1zQxH9?nSeS-f#+7NPo8$zzeXBG5NV^eum9n7fcXIUQzFHS+K z>B9PoM$eBFVBxQ~th4R#eKdJs3GS>cEElvGs)5p{bn3F8u=>1PvMJj{!KaFs<=S;IcRcz-e z2Zwp*#}8@K#t&%W5@om@-QFMkzL9-mW1^Rf7j5Bd{2ng$&7OEez`1&@$Z}L#bQ;1B^qt3*wg&fv5 zJ5)c~piKRY{gda9?&r|g6TaFtFm-ihue={R@Os44FYaNa>xsScWu$x3WCEIY5b@^a zyZ2zH;%|qr-Ie{$wxV3$MKNADWQ;TVjBGF*{$bcFIo1LfE}iw~$O+uxSc^*gCLQk; zv>&psj1#|nL^r!WuC^+@2~t)9i9XuvQEh*?CdBp!6x$zAY=1zp{Q<@H2Nc^MP;7rd zvHbzX_6HQ(A5d(6K(YM+#r6jj+aFMDf54CSdc^gQe)wpwN3S2m_J{ru+aFMDe?YPQ z0mb$Q6x$zAY=1zp{Q<@H2Nc^Mu)Dn;SKt;!n;f5OJz5V6?jrmK?m6#la>8*vwaL}* z$0oNo|I!_O6PNASo4;)*_j>G`*tXLi>e=JM`#pAPgZpUB=7HC2<{Pfqw63^fu^dyl zVuPI?F-{8cF!r9=o;hwD!sw>suunvcS((WftF)g?!vDx_j58SMdgB?cYc)ByA8R#t zBNmpquOb4LIi^kjEHhw{<~N|qO)P?x!BsnME+eeyHTZWEj$ZV*Ms;K)G{7>ql}X&Z z*dq`FT39Xzb4R8S$F&pg5{h}ZG5^JQQ*uY22rp=1`I+1qunR(jH+Wd)=Az(lD6*LGF~pz2BQ1hu z?zfP4;@~39Ur~#{NRtGJ!6MDUR8yEM?G!UjD6$e<-~GWhsVzpEs5B6=J=)%Am)wo$cMjmtHh0o$*ahd4~sM|E48ZB za=z`Akc3okInQ`?o&pJ#{*G7P)L16V+xEERn-*J7eD-@H&B(%<2+R4Nr)6gBzgU+S zynORxvRc+(q&c27dubAWt2ud#V_PV_x?S3^#EQsFrL_Ljq19&g0c_m>iUTO(w9SS; z0@iP_%#DH2zpi6qiY775Z3CI3Z{#fe@6R5v-$0R`Uh%2kX2!Emf^w0o1p!gE(Z6qC zM7|!D@vDPvxd%0}xZ&fQY0Hny0a|cBHg^_ zop=*fUx12H-tNR@DfflWkCEKXdn+wYdMM|!&Mb7Ho7b8aA4&NV=T{Q{P8v=Ddpk{* zue$b5s2S9Zv|J%Ci!|j15VaYGt1~`{#RrQtlWa+E+v|NUUSm0ZBPZbhpzq^f0ct0U zG-Z)}p3N|-`5x7bQZYR~kZm1p|5Rc#ttdS_vHN<11Bu+KyjEdAZ8ZVTLUm!HZG4ZHN`Q z9SLBWV+H(RSmq{&Wmx9UhrEXyKFajQI)^g5^-Y#v@6?F6#){Iz8<(gbW<@z9c?wh> z%P-;xzpdojBx5cFLz5mT5&F!hgRegRP;wdh7wbyfJ7P**C%~XedXoZSFBY zlko53fAshG$FXI`#b1!oPCwEfiCWp8$h3JgqvLxIY;iOr+vj9bzg?7bk0*^`+=5|~ zDJ{*Ugn4fe9FNK9uvz8)?Ra2o^!LFBpn-jJu$?SVE*Fa$uZ8ehMgC4Pj{R@;fE)%t zP7fS+Dxf_rRqy>&!2_Ev2ZxscLq#1G7ZN!pJSXIojwwhATbXTeL!lnvjudKyCt{BAsrgHG2 z1{(t|FR7_1kvRCcUJxswQnlWgl+|5<3!V+(x zE6#4Ja#byiXO)~*zzr^Il8mSy)8UFzoek(d-vFt?JfLhFb@pcb;356!AIa_0bzV5;nD8fTsqs{iV+ufOiS0<_Es#R z!9SBOi6G-=Y%z`%p#bBZj&S3L*LofTpN7VnxRVeN3btrN9E?V?9ehb*d)cnewm1Id zFEmOJZ@istZ&O0HE$T7)N<(?zwF>cYA488i)6dHwhwDdM8EqM?-+^pzOQA1UbrDSc zI@{igLiIxyzkZ!$fCSzXRFcZil{YrjgJ=eLU_`1c*!Z(Drt7 z4{dMX=%MYc6-Kw7*xvSFQ5(m&ai(94Y%m=DVc6c}id93sP^?g_QT(*x=M-;NyjSs2Mb7o7 zz8@<7LUE7c-xM?OUe9!c6h|x0QCz54tjKA^OnD@`HJ#$9`c1MZ%`D@GlajSvTR}l`L8Oc;od+!0~ALp&Qbii;x5H^6`eFM zUq8i!Vu9jGil-|sRa~ifk>ckRZ&Cb;;^T_nReVixr{cScE*>6If5kk-6BXwwE>bL2 z{FLH#inl7>r}%{88;ZLX|EieIPcZ1WxZ)_qNs7}I7bq4h)+v5g@fyWD6u+kUjN;3R zzf}Bxihc2rWBDg5o}suw@dia%hlh0UsT{#WgtoV+VqYTShbhXsJji(*=SaurUr%gw zpK7dYXbLTy>yEQ^O5q7Tw$bh8EOIf&tt-;7MlU_PrLAvk zOWV-B1#K4A=$&m_Ps;w2ox&f$a$<&aFH6fhcc+!WXit6~$Hp`(ad{e^A-!#cBhA)~ z)|Rc&EiGFY*jR#`c&pt?zS3^Dp0UHSmSNw^?Yr#6mR;}d-TPvs`1bajFF&d^qiADm zwCL*gG}JSF8rBV3XSE$=dG(8Ss>e4_55^Bid<6CB9DfC-%b?vbQ=BV%Y+8vM)7V#D zUDtJ}YX<5F9b3@{TW{cU>BK8Y_iDSnWj^Y<6#2KHu3M$9>BY-iBhzr8?AE<|ZylJt zz1^}F?c8Krz0<6ft+C{aR`TrTJbZh*YZc)Oeal_!PxdwX1|RFr-Ib&(H zDeqO3_g1@YO+$G_C~qsu+b-qBl9jFL)5=?2i)9v}Pg-)B2E$r(#h}ZAE*H9R9=BpF z9I*Zw*0Q!N^cTKTUXfufZkvp;!T!rY|8jk1teItD3|d#W7w_HMo8!uiHD^{S~H4q&XQNQrdx~JMnYG55zYnr2CsCtrb$1ww54@AcQ`M26msm`lx8Jw z#IYXdW1T;C*ba`J2-@|Q-yZajKX!ONy#9%3c{@?3jN;4vy1WIMT*Z6N{PynQ7}L<% z7VA`x7|spCzdjH9q#md~93QL`*0FBA&#zC{syb3esiv^L`$24K8f=D!{0mUje#{tldy6B+2UPSR^mF;`8I!iMv|AJ&R0pD z&t_V*5966Z^g$v|i`%O?N2h$OGVd1;pOav#!i+)*FvexUQxdCayT zFY~b+T!Wey=U=ZsZ_Ik_dYmx2%<=(|>yQ}^{U)+U0`TBgs^SQzMYP9%v@UeUM)$RY-d)V)* zd=`1nxt`rue~!8x%$WE+((gN;D7@jc8*Dhuy{C1aQCeRshPtH_<_y5hm5yuN&0fsW zjw{@Ib=-WpcgM|_W4(3b=6*KJrNgkUeu8Z3jA;sK)&vxi6+;+R!?Z>3S$HwdE<_aP z?(~b0L&VB+WgJQkpvk z5KYrK_fwGUXj;U5O47Rc4?gJhNHx%X9RKX7dpE-}+)Dt_j11Cx*gt2?4XlvG8rbJY zODy}Evl+T1S_^M3yv}twQG7V`1pAz5Sq(OLyoNtR?DKlnBg2iA%h{4!alb*e|?)&17ojK zVq>h#OVFB!P`73XkKyRE1wx+}`0q#j_jCNSvbfUzX?V8d=+y+~{1f4^7h0KbBjVRc z@(N^rEa~$nX8Irg;}5DneetjFTZo{`o&(8Vmc5X$G0IFHTx#{h12d?4=HFE36kzrKb^aDnn|+=8)N@N%XI6iV&G(RjjOFZ- z+fA2{>49BBexIp0y6h4%)xY5vr9H1*g6i+-P!wlOZNza44i@#SDe8v^U{Rc(wjD>8 zMQuey6rJgvU^$L1t3{eSe&*g!wVFFr>+?u_BaSUNylNF?OSKkw)mqw*7lL1{EKUYu z+IRf)OTF}dGae47&)kD_yx9H(wD7${F1G%>*zCpqdAZqVc^6#fk%(o=X}}^J{drk} zAX%`Uda5S93b;8)nyGrjm+=LN9tTBBaCq%o=GAwp*S?~D{MsM1@5@Nfw9S6{ z&h2aMkp6X~zY%Gl_S36=?T@AX-s_M)9qF2Ij&H-!^)SfB&=2Y}0_lrz<1NO)p|ITy z1%CYDP$);ljX1g-3S~$@=9Lb&q2OYe#wasF2W*CxS8#ObCcha=!qu_{^5)JvaNJ6d z@If(%b;0*?%idsD0^B2T+rNyyBXH06Jhj3LQoSvCR+>DX2RHqd zEN6(^+r>L{HnJQEX3qxp#gX;&QOl9_pHyGYk?1Lj#hs2RoBWhbR4*yTCn=lw41`OM zFq!oSoG{1wI(&y~5jY5S%T`$Xv3FP1!p>V=T~Jz8Tace$K;!oEva*7bhMMuUb+r{; zuEO@dRGDSi-Xd$9A6#Mb-@V?pKY8pYSB#riFuvfp@de}8Cg+VGUr^wd=SQz~N9Vh< zo}5rN!Ts3lvsWDV-@i*DL4o^?OD<#B3)bsNw^t?pDhlR}OS*Snl0SapX%pOES+C#e z-hRp4@e`4#&3b*s=@srXm*l(8TKVp`FUg0FaRmhhPeo617mMzrU$1bVvo3S*zogRr z*dN`mT_T~cSg#ipjDs}S{ecyo>aLpW75;6n@U1L-#9a5bOQH#Pk~7YBOXn82!{)kW z`Ev@!FaN{5IrD%8f4Fl_LG+vg_mj>T+x-!y7TZSYG0<5v*O}69p8Lt@1E?J2MRWf! z&)sT8cd>H!di8kSLiO%LE#5#1hr1+aqVvM@Wk#_#)$zq=X4a@{>?@rs+|NZerfo>S zJY#)yU9Z_$v-u>KKDREy5WEzUoEynW`-B(Ao1f>*YaFH5aJ1ssg@bPr#!-F;$DeS# zZvuhkNW&X@HI6l*^t_{Ag#+KBQ%dH5_l@*cA$&f*aX19OTO@!eLxF{M9&`a9kV;Z-IX^j)!qP5ejd{2-=8a z6OLPO7`FoBuL;K*9K6*VN4XgX*RE^|g+B)W(>R{Pu{{(XkY+1Md`(69B&%_CNj;}+ zh)1SX1pM#(K_L=72R~1%<4XEKtshRc9fU3>^T@23eWw<&+9`5RSJ&0m>qWPpJ8WY^ zSpgW(ac3PrA%8+)eM5zcyxEo&G|KI{z}!>+4^9Wc+?&I_NpM$lL&EnybNS$Vafdkp zTQDJ!_f(kFE#9J-jzf5~%H}qZ30qItncLe~1TuYh>G*rgy^ihRC2rc$d2YxL@XqvSqXg-UxAWW(E7xlm^|5_MUuh^0yw(>9pJUzgFZgTj5Bea=Y|Xp)sN3oqi+NJCJ%KC z#7FJ~J?c!{TFBv3nt(o2zpmznnEZv%S08%z7=8C30sTDBbob!>@hB4snO+_bDFVd3 zh&ess{xeygKrBvYy(Y693{u#jd}q?}71)eDMkbK%c|TRq7fc_jw$+SIP9Tu4xokK4 zkH|g=>ubTdN+8TQQ?8K>hQmLMIV9n87qrr=%|BxfiD@U1{Lvh9#fFRaIVffj&Am;$(0xNfSDr$W4H_FEFoN&J&=12iHAy`!;3d!RZx_ zR-6{Wk&5FLKc+ZcagJh<;<<{&iZzN&il0{Gbwn=MYltZKdPUAFWB4hGXDXgWM7mPN zO2u`G8x`+TyjO7>5sfu-Mt-j{-wUZPQ}Gxg(s5-A@jMM*ruZ2RzeQ2ziopMf#=olJ z?85!@sEEcPf5M!+)sqj}`x>_&%do@FX z5^9XFj%O=8B^dvKlczUY>qXkf@ymprhM|P)-p6;VL}EX||A%R@ifr+NGa@}Ezxm~Z ziB~_~UvhDz%2(CYT!>lJ=vIiG0uJ%TSV}H11t0wT{~^ChABhI&_APv%hPQ7y(B>@% zxp7N*Md_;Lsp_iQitsKi^{Yy2OKM=w$oJwg!`;d+tE;KOv~?>V8_68fTxqt5LkX9S zxI#q(W|;9@(l28QxW9BqBQE@&yT5efR3AVb)8(t5V9MqDtMN0u6bHwaaVCym$imP1 zKjHo|4PksogV%rWn+w0m1Fv;E4sT#m3gXTS`5DedVR`hZGdj+O94@yI9m)2yTq16( zf}aF3PZ9^+Xb9^(ul#2mk5!5ih=2DXaEcK^ai4`B=c3+3wIN+s@57zn`~C;%_^dXL zWzrG7D_2A-6P@-7ynS)tw!7c=zPFH$?}o-1eMUAI4)6ZGFI*G0(~LS#8#n@tT0vLN za1i8LxcP^iD`y}G*!R5;=FgBLj}Ol&OX1Pa`r}^zHrMHf#_Oir_b@1v_b}i{rUw=f z(Xo;r|GaJSf(K7`bNr4^PMMMrSKRxOS@Tb|?VyKkYfOhRj@M8+|G5*#o97kZS7YJD1UPtJR#?T&4Etv4@BwBAuZ zu9bZH4<}!0%bU{N`iS6Ft&b(QwmqEu1&*z4j{qM5l1qP&?#sUKGcI_fxnUDL?e1Bz z*hx4YX&Mf~3UrdsJ&%|S-K$*e)KRosY~HHuK#D8dD3c3$V3a%ksu-i&qU^)nE&zn#~;ToEn=H+1_T_4q0?56i`WtQ?N< zH%Dmab-p6&&gD(NjG%+1EE1k zJ)~!Sy8TnA*eCTkk9z%`*I5_mpmts_L5)c2@juMz)9v#^cbL@U3fB84EGpP}oxB%5 zsfQHo(e3Yt)Z=cd^mkt0LR}r`_8p&Y{}dD!ka`G@gHN}A3ajbwynYW;e$!)o7!~8! z{$S^Im*=zt-M-U-Zr|xZw;zyt+)ph&-Tq%#!n02?EYFa7+`&5J&5TWA=nJ__kvBhf zDbXkO_#WHm)9uT;j90fxN|1Wg(395xc;vU4-DA+FXx7kw9R3I?emc_a2Z?F5Fo{12 z|3K!zYJB|fe=YvmFQJm2Uhy#};sd&UUll@oOt*hEGz+Q6Y3zc4)Z+q#gSO+-c$|XF zB~DY3FGk~Ic_vJ3W_&6W2c#Z5p)$1dI?2?XfYjqNOdQbd^Mxox>e0f)!OrWl%wvv2 z{%LIip0p0%fOdQbd^U4hGy#7r_ zhv@ciqOuU({&(0Rp`F*qF@E2j*W*+Z+Ijs^Bok5(xdBA&Rnos!Jd5c9Qjb$89)NBi z=1h;&gXXc&&g-``UqH8iCo8poy8Q@uO)zx(B=s0hZNbj#uQPiLK4!0=oSdnK+=^r{w^o9*-09R>aA#AKH2SRGy1q=k*CpRqXV}X~m7!j(?7F zXy^5@tXGKCqmtS}bo)7s57F&^i}^!z`!}+<5Z(T7ng0NE`w{XN_LOd)q#i$HfdSqA zX{=8-bo-|xORu%~XXy4x>cMLjr|HKSGec&xl7~jOp9{6PMeLt$KXN~mMz2cLfsr3jwM&iVfv!dR1U-6{^nzJV=csf!PTqED-QQ==K8xtKJOSh zee{w~rw_kU=)>m|>!VZg!iW$I|GRA4?UjFqyC#3(u@mwCI2;ovx{djhvAx%Xar5SN z$qN$xEz7euGi%^A_6Fy2cYS1C+M29{{GOtI>l~b+zu`JdrONBP+Db4LNCiSa7OBWM zvD{)ge<>ICrvlmp!wyh`2*Xq1F=Ye`{jpIwHm~-#8}Gc9AL~L_iBc~9Z>qqgqQJr( z;>s`_8DUb0fI^_89JB+5_o1wA6+ZGP@4!Bs8V!Y0JZcOuLUiCg2<@@1R2WJ~urDKo zM|}}&PA#k*O4HG4g97k})R6c<2qOYAj(~51d>&vxC_#3q*Kb=54#(f$t@?FUyAV$m~0hA_WqcijrFJ-uV}) ze|@iMtf;`%5!yn1dew3n9W^Cuqq2PmHaQG+jhAGD?2oap!9Qp5fy7%{lx?khcbe<>FvEd5QsBaD*M> z=sJJvZjsR7pGh|kLB`M6797o?0ORfat(#vJ_;fSQr0e{xyBJ?Y5~w`C_25&JJn-;9 zlzn?m9_m<)k6ovS0*se$#i3%XW*7ySpZfSEmHk3_84i;NUhBEc;CnV@(|`PS9@e)J z`mzy5eGE7H>fjIS`xEr#BFs1ww-NzieYb?_hbH;@*1~V{PzS!qSqXa7nYc?JhxN6D z>PI7*sUL0G%wxXUPe$Z3rjZ)Qc-jz*Zg{PC@zK4jZ}wkC9LALY&3r(96(3i8PVq;I?TR09>U;er`)Q;9(s46pKgxdEK$%+sl>M}U(=}f9 z(}rBEa-E{=r;YHdRsM)m-|Npu@layF9&S$kckz&;-o1+HxaDvTN^iv+BI1uxJWg>W z$3N2XzS|Q%58h@1OJ5? zdgW;?J2!8+YR6#fs@>U^$4S6+d-{z3&3sMA_+sm}-G#|(k?w}wHx0O~^`=pY*3Y{m zTdij7pDVvsY__l3y{C_-bNnSY%^&}#1xut7SeM+TEl_QK zp_wj`uvzdUTOjO}Cuf?)ykT2l$oMxb-wM*qk>$hF@I*B>K^Rg`&YX(TYY7dFoDa_& z$j1)dkr=`@-wT}k;R|-(=2X5&#u!HYn%*?$HUO-GGw@Q;VfSrt{I5YWH!&OkGdSI8 zKjuI!0UrZVWVAP5ZpiV!lbMG}NiYX~p3=z0_)m`i$n7Z2GY3Xar)IPJHdkDD=0N9C zc-0)Z8D5$Lk7Dex-nV#c!%U8UPk$u#4MwRHjm^W`l94iF<3e#gHwTiMp5{QAY&g-h zV?#DDxA~@hTLF zUCly$bD-EA4$2&O2L}YqfqPg#-yFy_p-$)Bw+Apuu>1CHNYk}BQ0vCsx1IYuAsUnE zlD;`m2*~zh4&;Oz=Rq&uVA-AB@y&skunxXC@GYkF&4FU=@OR(-3sWA1InXO_YHSmm z?wbSi*}eNQ2M%D$7rcD)V`4XW(UXc|T+khu17D%!n**JDS#323GDFB5ND*JaY20&Y zq3vi63=)euP!spW9H>bHbD*#4V9bGysFs)m*Rykj-M5#ry2juaiJ#3_BSt;Dkr6ZF zVzmu+-#(Ik6YRddoR`}v4y)(nCF5n(9GC<7I|AlFFLp}&1||;7fwX&p_&k(a4pLX%z<1P0CS+HxhUSsCIsfdA22pB2lC1cn*;Yy4w(aAV#y(M;5Vr) zWDcxi{J!QuelZA}1AmKTVh)rWKwu6$mFa@rx0@&)z#O;(y(Ap}Z?U_A-M3$7zQ7## zQ&wvK=0JyL<*+%hAGHO$Z;OpGFb6(E<$*bH1CIAjjoN;zZ>gh+EB&$FA?V#m*=wvah+G0P5_1OLGEA#>nG zEG}dY`~mYHz#Qn@fNnb&b6^H55SRlmqS%c&Fc)>)#~jFO)tCc6#!4QVIglN7Ky%=c zz3^^s7os$KF6wGwMjX87=Wyw!J%?4Z7g@t>nyBm|n~^-$NuuG8uyrF`u@KtU1WMKb z{{PQ5^TEV`Mjo1x?*+>)xMRbl==J3jF!Ri|WzJ}L-7$&;L4V7!qCW{P!`Xzco@}{y^rV9xK2ha-{ALw zZ8PXLSRxLOvG9MnozR$1XdLR^MA)ryu&SnhRYOIp9uwUUlc7*XOF#$z?`bXUXt~o3 z7&_Ydx>%0d>_o7XN>uWXwUO*GaYsk`46+|(M0n8C1GW%a2Kanpe!MYA+R-ZGeL>t7MFUJrHx>tVcb6`SG$s$c z))pLm**DI3rz61l8Am29KJ|<7ep#2m8RZVPh%@^55sGzTllydz%KLxX@ zY!};V#wfhj!x%4J^)utb&XmKj?rnhK5?EfSqmX~!bvov1^-APA9dn&}A+}igMtK7M zW4AK=9}|)>oP`z63kuhk<#n_u9*+IFIX3862igodo{eKaCvY%sDGuMJh*!i>CDy2N zeQ!;LUTn)6q_T$#pVbUn$PC6q_SZY>q&&IReGz z2o#$mP;8Dsu{i?8<_Hv$PC6q_SZY>q&&IReGz2o#$mP;8DsS=S8& zA+WSx)^$UEL*?Cy?DyD9UIjK+4A}o~n43V!0xT+L&&w;th&-D~in#@nUlX{#e6zDn_DS{zAnW zin5P4(vu5``a!rW_y;1!)}IyM*YFr_)J!*si1?w3xf-6}I7c||JG4cLy$13)mF4<} zjP9^7vDQc4o0yOHo0PxXclWl(iIb1-vF(vORB*oSk?Ra2t>a;H+|*u8nX`L;LTGO}ApYGV(cUoJnX^*ttzKa~|8_q54pNgHawx>47 zj?}(^2`#PTD!cT66ql>)GR%5G>tXh>*9Gz*S|@(*`-Q!pk+hEahBZ>P(3-}FR5VTF zoJElAsIya2iZ&hONuG6T)y1u%2LhuBFl{uLZEX?gU)g5>z56YcI> z5gUYWMc1%Hhe%!V&w308zo~konIYYN{|P>=bexLp&n!OpIm7-B^?(X&-+8QlBF<0! zz#p4%>6Udh!8fQuhw|h{wCSYNX3RJ-F$T>%CNU|$FuyP{2EYC)N*XJUNsO6MS6;EG zZdF5BMZ<*&a0w(PCXrskzwuJn&ktL0C(VIukb+a#-J65SX9( z@JRIa@pquf1F!Hhj-f}L>A&+JhxP4(z-JcqG2GOz4*sydX51nX!JbVt*eH;4lIox;j^0-~mL_C9m zGsOs@xG%$xsCpCi7YM_R5K4!ioBo($G}i`lT7_|@3PgFTXv9EtN;U%dKEeKGzYy7X zD9U%E5P+YIzBBs#0QH2!yZ^lyt_jNvmq?kl3EaNFA2T}r!n0*g=f!@OaBZlMtqR=X zm_y3GqFaZ<|Gg)7Y3~=Gx%tZbSQ>smAl;iOBr~DhF7V~alkhczMC*!>WzN}*(dS<1ngh4K8`(}-lpm<-wTy$=_6hWd^wXDXTrcS)MLHCB(eRyBzI<}==hR6 zJl{5x)8-7|EVL0EV2OaQLg%JkfGZTI4lW|s?qcy<)~_JhPvQ1ps4D)*BpJE<&lygj zs^By$Y%6ge?io&hMx=3hFXpE$VWJD56|5DXrQaEu!Ixks!HXw@Ou6KVGiL$B_in)V4B-lNY-S=nP{KWUV-zI5H(t#BzlIF7GyoZa-=s&8J;v#N|WB z9k2`kBd4QYn5IU6ri?X7{5V@dLS_C$BTpZRQXdLBEh>c|KiC#HYEFUrMBu|RONYvpL zdQvn-);o8yCuPRstiy4hlr5AE?(v>9FjitC&S$OQ(p%SOt+arJcUWk#OHW(aG=ENY$WiR&CIO0K`3nl_HGvZ<8Y8f>!Nv%H=? zn?Y1Oj*8F8MPke;j4h?!bFY)QXpCvx^VmUd-bNc8NWIa!@Q)vdqytA-{p`LG2KD(7 z{+$IqQMV%YH2iKQLs$l>_uS=L1}8GH-an;UkF|nRzvpS085_=&FL?Rp$5u1ti=I>z zd)|ih(j+``oV>-c8z{ZHUD^QF3Vv9{G_~o-Z!^OHwr&8$0Tj{Sq|c7LfEI9?+87A^ zNzD;TOwlA>1^+i;|NFBC>^G3v(Z881|9 z%Nm4P5%;C|0(Ne|T2X>FzQ9_+50}0ejlUfhGvh}yall$3*TBinop_1EH6JHI zgB!3`tYG5l4x8)b6~@^+?o5ZRaq_0bQ%roS^OWSB8t=oza~$s$G%a4k!~tssXUDqp zGxIl&2x^S8U(;Cx0BFNyQYbXPfYwdFnU#J|Pp z3ow5Ukhk55UrA*bIzL8oH}9>q_*zDM)|rJabn{x%;t9rI;`~bD-$}zMU~i|zsK&MV z;2+eCwD%!drki2M|H%ANn_;**<9x2T0c*wa6nooV??<7G<@Al5fd7NOPc^7*mOIjp z-_2_0*$ktaFEHOI71QH#jgPi}DzTYXlpY>(*Kn-J7f=aIQ~L*g8olCzwSu3M-LoA& zny8JV+dW5nEE2zz%9l7y?c_z{eCKn|b$Bax@V`uGIqO{ushKAMS(ow#%@SS$Fl=$1I6Mc!z~b6Kwt zYsF}4E0gSQ-aU4_KjX_)e!z}D#QYU1KL&j)u2SWv?fCV~zg*?#VBBFNcri-14Y49A zG!@g-SOGsc!-`H0%STv8oDX@A3)YJ7vcNirGQ0KTtWUjDBjOq>N)K;bqJEea<&fkl zP{De@7H9oHI!G6J%E=t1`Q)YeuF}Xa`f8f z9`iE^|33ale~*70TRJY>N@Ps?iM*k3{-m9LWHsJ^?6Ih%eVly?V(Iu6gvo212xCuR zVfI-$mDp=)LM|hg<&bBQSy)cK|^Y#Q5WG@=lPyyk1>amN4+k61n@&L9+SXSau zmN-y!*s>A)VV&mYEonZqFJAvFG7I_9BA+C~1QwwwZ{2WNOtw!iICkQ(6R_DwRhdUz zfv(NO5uWQd7_xCZbu+Uvud&xV>)fKO?4gix7T_-8iN=Ao-zE4YFJU?O@5N#Osxz;^ z6#tn-6~PBm-G$*lma2k;8x`dVkN2P>ZAG_p(n=c3nyP9lQoQ7_q<=MNKjWb@_F~a(Gqodd^_6yPUODX&&54_eZ zc$kl)N1f^CWst-A_CO!Mg;F0rm-_k|;ScM3ANqzP%s3NAJ4RSvc)lIqCrte|z;E(U z$54FRP0*vx#I1!K*2npFrhZw7Gx|EuXFC!49x;tXI_l$bmm)yiJ3XAwHVWTvyJ~M| z`^0pld(tQensyMqHy|&v8uQtb2;{FuQT9Otuz&k0+}b6eym3D<`DIFbT)IOePMRdu{~&_01~@*VpzY&)Z@ zANI|JHS=;RXnF54GQW*`kgy#N&Ldmh?OZjCGnPf$#4(D6iXT(ty@K(lE1s*kLXp=N z-@n*$)75RIL z`L`Sm5Q@ub*N< zu|V-8#nTm+Dy~$#Nbz%uwAT$DSlS*8pS&lzoz(%;>(J^ zRQ!L6eeob<`6nx$p}0Zu2E{#!e^<=FO^x~b6EVijT(xByUZa@cI7d96kv+62R^!){ zPmR$nFGjL(NNN+evkpFj zI9Lal1C+?#DYZ{We1zMx86x|LXA+DgPC-ltZ@iIQK5ne&TKu~LM=yHt2H@q29FHW1 zxgwGmyAP3(4kp3KNIr7OT;b9R7RkGg`N>ug>1Yz{nJQIlc0Re4>MO7LtiBJ z9FiC*8e5FpsgXP)dn2hya2DF`nFL!=R`e{0FT*1(f+edJvJlzBBsdE73rvE?Ato>h zj%S>25?snU_$I+2tb=b7B$0h!5UbLFrkaxgtr$zDaNi_4>>etc!b4%oS&`hhY-@ zALjI#E4T|+*d)jS<^GIC1w{7uB8_hn{64bd3-$p_g4a`}&s>3z=P(HlLYR|hOoARk zd}os&iR@jUxndS2pSj{zR?BCuh_M8pxx!@+cVMn?I}q8s9f<4$li(Mq#b>Vg6HDm8 zT;YDt5ZUv!VSgsU7ui0a$o`9zUfl{^PF`RVBy+u;i@*?b1x0+5|2HMFzZf+Zlb~2; z1Ct=PrhpC55ZQAtWMA}%?0qpaK9-3ClVBTEx&dp zOoD6?OoCqT(HBql+UuEQkAFj|}LV!nX6LQR5X40rNi5~PQR z+;(9S3=`SYBuFBAm<0J~qPExArhvJEzd2wMe3!3ofk}|Ja+(A=(1V3DyIS_!DCpjkV&wT+Ct0~Lm3}puJ|VP zg_tYWvbYd)#hc830OpFwxj36WWv-w}@Ff-)Fjw$d2$NtbUuE-P5~PPWTRAH*2{u6H zDNuRvjgZA8$ZHj+>Bl&OLSzr!$0E*(-h=%l~h+3lvdRiw@KFWd$V-HREgRYAeQ9l$2H#$n5h1wecO| zocOSXkl!rihl5!5d=h$`Rb$yh2l)m+_|?h>A6^rY3>}tj7tC3{y!-VC?0#8~usAC^ z6n@EVO~Q$y#Z@apja@ECU~c37?QMCcF<|2UUq?URtsO741oJR)OZ*4WN*tPv3Ktx& z^WY-ypPOyhq%9LS9ZMcQvfdx;yT;$rr|?9zsC>6 zfd{&8zv25BWqEc1SKtUc#?f`QpuCpDl z23Z+*-(?Znf5g>USVJ-XqZWplKv@P#=%G z6anH=u-i;A0??FuKl~U|^(N|Or0c4^2=>Pw(|!X1Pnt|XqmSsl8+nnfFyQsXj+c$` z!ZB%_(Pw0X;qVW`j)&nHa<=U68`Lvg8}`rPx8t$j>3Hv;9dC$8-oI?Xs7|tZ70ox6 zJpXM@J(zJ8=AlR+KW%z!(?7$e$Lp9jgYy-6pP{@?kw5V%^Ai+tvm$>lQr@QcL&Y~0 z+ZBJO7{#ez`az1L6or2R;le)wtk-bipMWg<6F}jg0B+X!#})a3je38i$on7V|EDPY z6OdyV^b8mN383�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l 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 E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_a9/gnu/example_build/libgcc.a b/ports/cortex_a9/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 zcmeFa3!EIqbuL~#J^Mgfq*<*1S(fct5JrHcon5VjAOx?3cv^zAcgu1GaBo}Eml zbd>#{Og1*uH+VT(XDFp!QmVQ&f4ps_QgYO;Rcg^rrRtu~A1j|!YNAKe!%Dqb$NOGT zipR#3cU*moQaoCp@{aD;m73@=h&Hj0k#m)r=`rFiV#;vJuDREozJe&rosY*vcL zS9c!%@t6Hd*~jPsr6zhjjlRL-0P4=;N07}U*R0e}QTAWlr__HWm3sXleK?h`DyQak z<-BXLa?ZHMJ63E{4v$s+-tj)9;c@$e%K7BE%K73`%GnoJ&Z8TZ^W-DS`8(wM$5G|H z(5alCKd+qs8db5%xhgj2UhjDOA{9HWU&WRuRP4NsDt74t6}xJ!igoN(vFk5Zv77Hx zvD?!s_NlmveePKm`x4SWu~@}^vQ5SQ^Iqkiuu-|mM&+J!hj(1?kaF!~9l{Ui`1Gi9 z?c?k7lzTYGH&CXZRkpMYclO*c*t1Nvw6t}#wfD3P_aLBov7R@%(j7Bkpu zG2Q(Z(_=G(Hq$$xTG|G#YZ>So8Xo9VEj@ihT?0369r&PC$dp>Twqr|M-{vk|$*?5# zRuWV_EJ=fv1Pv0FWSNx&%@mfT(Mp2G3rn)xN`fX0OR~aBf`$%Da+Z|@%^#LzrIiF1 zB`nF=RuWvQkR-The(UlAh9tqI^po(ih9toS_LJ~pha|ye_mi*-gd{;{@RP7(wDb;c z8R)cbu-@K52Db%++awq_MgDd~YE-DDuWNH>H?Fw3Njt&knSsIKc5wLb?9S)x^g`P@ zI}1X=BW-u@*0!PHzQLZ(ZePxDPlF#-5aES)Z5!(9>m2O1%h8?BG2GW#AgnhZRS@BY zUpL%aP%7{!2S$T}Q1A%dJmj5nbC>7#8ot-?9oO}H5q&10>w3G49i0P6(c9(Mv!fGy z*Y$<@I zVup3p(7pk96W*yzZYu}9= z_O&N(UHd?^j?G{Dki^!tXY6MG+S|ooj9mLc``UNg*FF&AU3;${y%6AcnBfABD%4ZG zMt=tbdcF3=zc;RMDCuFpgiOyf?E5?soejgic9-n5JFCQWc3Z*S1vxNAVVhD=ER*8YyI!+k?0i?Cik;k?ZKZ38_+H<=ji_rf_CYDIvn>v;&(jISW9 z<;E5il0zj^=%_|8oBM`aOlN4>($(AFHDChS6PPR?YP!xqS6e4@8umsMtjppV4INz& zZSj3K_VjhOboBSP^b^Nj;qh0l-_UYV7j6rS-w@!Nw_3g176TY0XS0LZFIYPxa(!FR zVAloPI=cFYdbVH7{d>y->mD&qy**eg&zH4a9z}6f6VxPa2 zkXbKq& zZt>Hb#*=i?mWAoywruX`XhByV+}hXHi~FWU&n6hy&M~qsXs{?W zUmU{Kr&gM<))`@FZeY{Wt#va@A2hd(6(V<%4hkE}7%|L}ZU#76(hWU6$esTC_4lgawC8%;r5XWV+h+6x`WQ9_Pdr1G3ny{?XlV`2|l zq!Q|Qr=7}F+I3Rt8Yi|cr_{Q7 zXHL4_ZAjPu`ryHHVvZNKJ&~^8k@CV+GM%F=M>Qqg9(p}2UxQSI6hOeqY^XQ>YImf|U9;iXM;d+QofspU)7En8JLIM7jt?ze;i*Ds^Du48LochBZJObKx@dfMx~%icD4op+ha zVi2#~&y+cJn%qx+XsP>)SnNEfE>&0OJ`L{CSmo}z26yHk=>)MD%JJ8_WXu`&FZNvc zCQ_`r!cr9xv9Mf~Xf?6%<+uGN)gi%X+R;*mHq`zZHZ%^Owwj~%znOI$P z*%irE8sKs2yIwgXPPIyuS37eYxAN_kr&iXKu^tO>=%!F{vYJ>UpOy~ZbRAXh z(!rqt&)p)vfv(=ALzt1MrJWodm$nZMs->&ezi(;V(9l3nJD>!3ChF{JAKu)8;&s`4 zPha;|WYuwP?d=0yH`uXl1DvN1`sIk=c^A^K=;bCY?>)ONQp2|+oPAAbV}-)~snjeS z%+GX{I8HUZcPlG(vE42v4vsn#2h*2Im-5oUhUO9F%@qc&h+kv*8GQ{RK1YusN!JA4 zu16>8!E&%3Yy+vsM))NUyy`!|JWh`xiGyLUKwdB8B@sq>lq>RD;g>w{s=q)73aiIJ zAl*|)mt+P*lu7EtVb^1qbvLtkAPLCle6J4)Qdl9dor@spCY#bsl z0YA@a%X=P;b|b=sM4s^C+Tn5a%Yzb5*DYun^7a|X#}%({o@{B1msasoxQZtHJh^`F z_QG7HZ(~1!iyB^JI2gRu9F%9BAM5cg7SDF*#=*4na4`MR7|s?FEfq6s0{H@)3aAvj zrFsSDfBW(HLlG9>La|&Jc6E(o=o3}s(L5|O!`bKjcw9RPH&#+n>&a4j9anX3s@_krZ_IJ>q7lP3gUv@mL6i& zMGpmW!8W^HkWSbjE-02Rg*+Hm`r&9|x-fl8y&_=^Wml#5IAn^=TUQpjIh` z3mPz{M!^LSL0;0xqg-j1R`{h1@Ty-xURXVXxS$f1Pcnlc$|MDG!Bf`t5IxScL0qs1 z^0sRU-k+3-E{f#SV(5%l!Ii=V3vk{cKUZNLt>A*XAIrF4F&ct;zS$}~`S)9V0{%`M zOncOE0rbE9w9`DrEI7I?XY?J2KY(%-QJv!&3XY8#dAROnoqU?&y4S7?bq6V^dmlrG6`h4! z-`6og-5Y15MZyMkZ?SYKwa2DVgBPd7I$3b?=i_J>d20vC+x{ zueuKcqUhddAS8+O)aB#p-rtL;d;5`&@`Q@%-dAwm1QPMQ5Ba~QJJ%V#u>OsmAVjGkCaM<;zia4j;2YK7I1n&>k(nJ?g zK0O>!ukJ*Bukv$EeZ9)QADq)3RlQoMR@JjO-x2B6&Ks`lY#Hk1ljtO<g0 zuS59r(b>@UoY#fT;kKe4lcaM#Rp9`Egg->(Ff?VAOV~418GlhPg=eQlpP?R0&rdlA z<9NdHl+=jBu7~(*5zcfTe8bx!@Y}>V(rGw2?v+XhJ4u1ApuDg#wh7@P8(y^*hy8$9 z;?705J;weJV^hUSb*9kBOHy!llj^z72l%8{v7K*w(`T z5BRAYg}(#-6D{Ph<9D*VeW z{=eWq+v1PLn7R;e5#-;B1X0vIUvTV+q(hys&B=mO@yyA2vsatwGovKdeTFZ9-U$A2wHq^&)Jp zA9jKc8$s9!e%OgR>>h-j=!c!8!yZD|Nq*Qo9rhT)=J{c7(_se?_BKCkz7BfZ1aqm$TxTCPAG7Ph z@t(x7o7EHC(`(n&#KAelPE;&i5ce?Mi4fieo&*FeJP+Tlk7_gn;-(iW7y20WU;kfZHB3xqZCNsDLxl*KcDqs23xVIFz% zFBTT^7@uFG;Kg4Pi0`#{%Iddx<{zg; z!kY3Quz2SGp~W-*3l`7#mn@#~uUS0fU$=P1SNRv+JAcCB8K1Ox=3i*>z9@K(2Clu- z5|}{!uLRG&%zKbH_d2-Je;9ugc;Zrt-wl5f2Z{0b!6nX=_`iU^5eJF!v@2hLL*j{3 zrT;K~4E*m|@&5_G^dH7^p2adrem+Z;{=@i1;I~`x?*YFPJc;q|1y8Ik`P;!u|6zO| z`2T6e-ws~-592=tp5vY5e+c|2coO3u2LC6Y??6`#X(>u(BY^yW9 z!%Selgh?vLkJ!7}|KXxPvhVu#{e}5(*_lQbSe2SD)h}Nj**@Bg^MVTIOUcywvE*p` z7~a)gRqv+PRacFys>izFV$X+%S?-OyLOti*GIod>%2(rzwp8 z?Rvybg=*nq^z|`fvtLoq!#L7uI4W@nmMoTTv6n_vpMHOV_mz;yYeInd8P|z}I$TKN z&P4$Az7TOP%R#&jueMu}XL%$Kyy~BDP#+3O+*$+M1 zC&aRm_-xibFCQi)5XSQYlKb_bEl%1PUUdNSK17cpu$t(4{nXVxK0SSf{x>e>BD*{aiS7SF(UEsW7?(7n|4g5M5%f zHN#~)vo}MRtTVb~-Laudelx90rtX@fXKT5Pw3Ef8I{f?&P(o-bs5w16507@(BA{-SYN+7txKkL z$@IKroZZm^FFosd33Lg^et(M|z5nqM=o0RB+T9?kq~w}_`sEFg-@RWMV&jTc*K(h| z(DxlUr;h2THAiW0xt^}BuCtamF6r!Ey1}y&n62gB<9JW9AJJzdY>E3|g){dF8L|q_ zRz$)ZzJ8B&;kX*KWr;n4@l$yXpIwh)wybk?CG&rBX@j<`V(EgmET#*y0W~39WbwyY0BKv+G3wyb-RE@_=t+B|5>dI{%^ zV#|62@}k(Xc1N^jwc@<*x5@|cp=5_2%kvMmFKt=uKP2HNHVhSRU8!}3H^%!aLvN0c z^K{{$Z3<>86+0|jRwwt)$4>N~+9>s0WSRBNn^Nn>H=!J$g6AUC83=nhR)5M^Or^5! zXf1XhJ=c8zCe-btyR$K@{B#p(XUFJW)zB?Y3j3Mf`eZsc`#ZaGRZUK&s@cs{sm5%T zT3&rW^2D33$f)M7KS#ZvD{I=Bi6xU6H&vTa>g0@*IK}5zlwXlcH9dX@WNwc+)wx}X z{aNS4?bzpyrrZ88mB^08oSNLO)VH$EiXC2fa$roQa${vUALcec(Q*h+PV zQ{I?E7oRbr_GPyx_GX+5*Ni#MSBzC5ESVV|L)@ctzMIZAoSM$oEWIteVR<@>uKsee z`GT=z=FTxktT)^d>vHq4$4v|_ z){vd!l&#~r&)JjMmu(=fa(1VPSh`@6M>i9@Ot#)N9m@l~?DGc8>F% zd&V&STYxq+1jV}Wn+udP9n7< zb}&9C7hA}^ba%vN$KXFX?Zn}C9r$b0P7MAS{0`h?a>E$9!&j=3cd>1rn>%{jSXHup zthy?l<#REFy*xL08=skdA9K?z=B3}my!3nSr5iKi7ui2AQUA^+<2?SVfR?POOcg zO=8Z9Q^uStFPO9A;K7%j@2o``(dSe{Hg?i3wgWDGI>+|8b?)uC+2}vyMK1d#`Ys-; zr>oIF(RUx8hqTqsg}bxvg?Blws&`^1-A)-bk_Rhda*)ft0Fi#lPn}ii+%jB8)tsj6 zEaGyXM_G!ci>*tbpR}%)w7ZdZB)Kn(wx01sbvoOIddFs^vj-Q>K|fYA4#pdDvubMR z=xdBPmY;r}d)E2bFA3+4t#ig=)%$ZFVjCoP^O>bC8_R@tF9>6QMd!F$?jb4vp1<9f zZ9aH#hMP?1_U_-8#oonp#7(B!#}ePd_29K}aoupeW0&sCtikz0Z4fxYje z+~byV^Fc0=Ox5ELhh`X1*I4&H?Q*X|hA-1D|CrRLdM}HYPsivCjY!adlnh_zC(e7^ zS^lYYRwKp}eVI;&f6rseM8`euQpT;-2@IqC%k{thTj6_A5>McYh83y02L5sH#pQbc zMM(u+;y7WDI*B{A2p}GRap*AvsY5X}tL4)aem-p1L#kAZis2SguBqTgi7-6lNT=Z- zUMZC>h^Z+r42w2FmdJ)zZ9%%5tN`%_G4)0$QI@0B^IXNs{j$jGyDnxY3(RBs$C;Ph3Y@jQ zb$510>s{3;_#bTI{#wgxP`4T1#vBDWFdMsM=lPt2==lccA((UQe&SBdWzxCbxi4lu zHTK1fYE9=pwc$${yycv8GI!R*=K&{O@?3dm(Cc;o_Eojv3IT6I0n%9+^m1z$074-NA1SEg7bm%axx!)tU0m& zbiMxYXUv<|{b|O*Tq$STM(8gtbZn3rDZ#FRP% zZ7}u#_E~So9PnLhc8;BgzQ^l-)4_w!?NuAI-^E_2vDPayZu7S@lFlhl=VJd0M+V`U zzt6;4FHFvAPS;jpA9YC+jN3a-++ysrUNj%#$}^wN0yE4gTc6Ip`vbRU%iGi09rfw# z{pan--d3B=E`DNP_Q$w(yryh-rLQN-w?Ccxd(L$bjxb!RG)C!-IjnPj&KBJI$HU91ke5s|p7%1$Za87m zlO|@&lQ)m@c-wz@K8f!$vn}!s+K&wDDNc*j#j=vrdnY>d-d}Y1QdW4C?59sZ$%A!=&f6B_ya~jYTGz{c@}tb# z(op)ZLLRWdxbwE%n70igjgVb-38QO=AItML?i<5-PO~Yz@O<7w|B#9A4)7BjphD(B zoD*1|gY5*52PfDGsvs2n5zIUIInl#-=HAd4{Tnzh;ARE+&rkSmJ2jfgq1j$`Mu}HF zm$utmU%)exf4(y}3(rVq;Tg#+==)iCMuPi7KUcx?6xyF*n@*woq}^20HE=Jg@GGG_rLdPv%2kh7Ed~0^P_FJHcV)*k-T?lVX9;*89yal86|f`9O&fW(Dg~P~u*GbY-TQ`JGwRcS{%n&+_VRT! z7E9O2{sUI{GSuUgknp<^zT+^$3*>}hoyXD8lY@2c!V);xl(pFz>fO`pG&sM{gA&I0 zOwI4k)HYuNASAz>K^iI){-t8^B6i$XT)n9Z1bA0~!temA<qs&wgi*J!>P$zycBD)Dlvrol$SoiB3 z-k-!Zfwk+A0>g5%9)JgaJvPEGdEiw&82rMp19gloZzY%{!YGe&rCnO#x8f5$kB{|R_%T#5e~_=_!m zVqc3tnep0T*2Gx+iNPUNsZ9#7u-czhsQ z$Ku6p^RdB@#MZ~-8H zm*Kvx1D&X?XBsZOF4Et;v-Dm`cX&6ekI}d{A~A};W+lV*1Lyfz2~&poRT-{f@xq9g zAOg!f^55_U=E(_u3Bw~FW;;yE+R8o01-43DTUQiNtVOA&E}#g*60DI=<6wzneQmy7 z59&cuEe_mPz783I-zLV9PQ$_RRW!i}{5DCt#Rx{@Q+*ACrQ_Y5b-ne9vrvP zV@Tr81#j!sxzK|wM=9IFi4YKm57-8_yakY#H1cpy`uN})_@xZ+s_%mds|WSIo$e(t zNoFv_vXX+&gwMr!sh>*O7Ai3)M6oSoa6zfBY`j7FL42?eHk>wu3)y9tFuHblX?)-f zev*GO_m<}Mq`qEnPA>e!hM*9ADmtS;r4944Py88Wch9!Y?!g|Th9c;pm8qnr(t7BC zcPR?=5Z6%I3AEqj z=&r}1yJRBG*|BeCPkG){aU=N%3ORLE843^Fgu`?R>=>_rWuT^_g9dV*2c1yRPud zxE9oB#nLTC9$TL=9quKcL|zj@#Lvj5aBvPGBymA~wke`M`#lJVqR(0*>a!EjDZ=Uz z)Mxy*Nm42Sx0pT~iKx%GM@|%dwg`GEiavV{>E23vV2q%Rsn6D#HWz+k<4}k`GrA|Q z&Ki1d#$LIo*T+z%$uvu17K5^^jjt&x5|HDX6=Or3>mVrkiVI&=Gk}mY?C&Gk4NsNYVv$ z*V>4>>rx1aqPsRm)LrEfbyqT??iz}yyP6{Eu6Yr47vHsOmqvyw?Q8{UuN{6Y&&AlM zsk=6s3J5>3VJKX88C_$kui+!pUqb`n|r+1v_9vwg&pE3Tr`Ux$C*+>~rb!@J?C%1DO$r^R5)$pZb;?E5jPYci%QAw)|T) z4%VyP%J<xgX#eZW8%)`Ua%O`&@h%i|Z|aRb=hhSJ6)(3DV$zsvBU|vHNrmT_;)32E(( zjhsJkP`|zuQNR8I@}lV1S0n1zuSV3bqY?FMq9U5DGZRt2J`z#C-hukIhP1O4q`h+8 z$sEi2m3`XQufk7k1Palwd0lAf*Y1hW4e^e;=vC^>lDhRs_aQMlFU;OZyT%)$YX*b+ zkSuv4_aV_|E240w_aWg89FfAlsR0b-Q!$;vG1?{>JAyi+Sh}FjV7e$eqZ#SA7DY(T z%l!89tWk`OtVgNmV^1K>V3&(`kXyE-ryqGu`_5HnuvzA5vo)vKes9-)8gU&$M%iNE|NhUKfry++; z3}(b?4`6PCy(?cf3AJOf<>${C#oW+uTeQVm$b;RLZH{^C4u77?Hplg-M!R$F zTs?w!*0wL)=QvnZ<&^Ev=~W8*R`6P)ozT{+753ENwd39y?_HSAy~j=DzJ@i)vtuat zJGWOSV`%Gzx6N@8{#At6VxJ84uIM`f0TfG45q(_~xs=3>hT)zDGTpsf+lB^vtOzT7xUbWW z8Sc$zDTrYB#IdfoS4DKJyZr3PST_aR7pMU1`Z&wNuon}nU&pj}6cXn4io!No?7qHKQk2{(6VA=ZIS=bwbxbrrHIUPm(t@Lw?^7sI;+xJ$# zJ(I0StmB?>PbU-G$Cf#}v&lr;*a9b=so77t-d=XZi{~N^*l|q9BaY7}xThfTF5{H~ z{@ky|G)^r`xDK%DZ}dBABVOA5&e(SBaThDAc7aX3IP4AZ7_b$wBu4WZJcq$iUxWK@ zhKEVjd}2`yRr7&Ofl<}`?T!1mkKKH!kNvy_&th^e+K}Z5yB@d}HM|zMC;e-2j=mPF zGtOu-<20mm+vo1fj$ki~lM!A!XGb>KfIS?XD$ETwWKpMv9jSEvt-$`$hHUHSxi7=F ziI0&cb$$}_iP}Bz?}2|W{I$-8Y;FDdN$#z%2mU?q?}guO*vI`6s$a!BeZ=)xhX0(F zp+-(-yT+{R7u#PomX7br^4vV;>v?_mqrUrD9^m5d!T&w>BVy{?&3T<; zxW3p^18qIA>-2Tv;wLdr^X6yH1Gu*IV~En%=#No{KSUZ{Cx-DleGXx*2;+S3F8E{h z-^*PC_a20W*%5yi7kF~;^q;uiGb`X#Yqx_FmM+t{nLENEhJV`eSi!a)Ru;@GU{`0% zGlbFtq;*DX_X2KQpuWRr(y%v4^JZz8gX*4 z#%Ig*egmG)Zmfs8hBl|Fr~S-qKCAV53i}Pv7&pPq2F}Ihn%as!OwY4cK8>U2r@~$X zc3ni*2lpCy7CIw^3R7pW>P$!7daB{Qp#d)e+U;WE;2g5oK(TZ@2W0g#4~gl*Fu@wc z*{9kG<{LVP_a|{pU~NoLX)pon!RfNpgZ2{11Fzx}jWA3=-C@g1fJq{Z^4K0CuN8h< z-hV@0SUvcB*G@MNl}{o}h%!liIPCLs&x8cRcwX5XfN3$X`uGf9y{GARdJM_A=z7@I zi{QJ7X#`@N_T^DN&nefIDWAur{B?Q^i9F%OwZlte0{aX+-{kEza32axOmMj=xbU*q zz&$2j_8Jg=Gs4+EyG(q4fZrD2N5E4yiRa^cLVIz{GyI+a|26PWTJfXsKX380!~M$Q ze*%9M8eQc54E#cipV$x_f?+lf0banAwz^0CG+-sm4 zIqba#$Xk021fq3pey@R$#MWK|jKy99`_LBLYv3umxCt}Hea*NDv=jFlSY+HTgyXr8 z9v=>WuL0CH>RtnfVcX-LSs)*K@x2%uXQAjC6X7=YF%iRPr=p9yTic(2hqN1J=eULS zek1l4IAp!l*X7f(8eoiPCO8*mn#$;5fo@a$Y0W?vyNG&@_dgDHIM(+TuAeN^h3K6TwU6^_r;YRKg$nPMtj|HeEJIlRAHk2SamI+t=QJa^lNYD6e}s2LxCV;v zlPI%?0KY|pt2kf9u?7k*;v?-L@KIcs$H)u z(-hWMc0FVSs71v%n#c^~KEI-#hjFCSaB%D`l`g2SC@*ZBZ$h}phF4?MkJDpF;y51J z+t#4z9rYWqOcx{BFcC`rLI3zk}wdXR z=B2A>aMz|$y)^fT_U1CpT+#`956;dc{i_y%^vn3uXeTmp3<{1v#nJ`GAEx7dCM4$# z+AP)}0mm94Nk`XH`CiN@0$Sm%z=2y>YYEB^+AMhAQl^l|6JA_9d?NRm$f2uk4ii$o zh5g=J!pili)BUp+?aFI3-9Opae|eDoOvu$OBOKevzEj9ct9faTTL1JO^Yp@~r8{V; z@w0w;D)K&;E4?cC<0qei#73Jl?&$Y2aKU-FJ?z;=FRB?+8~E@1X4dh_0fE8cOysVF zqV8{N?^(LRYvwXtGIuc$xmoh~7y5kovz9#01vinC)ycVvWPYPx0$-4?3oE3Fb@6Em z<8HeifN7e7ZLK}BK2;4|4 zTMBnSgEW6-WYH0MYvH%$?S;G~!YGfrlESUrNc`(C6=GJ_$?A_Z~x zGdM5xbt&Ba2;@bv3GGI~M z+&!_urVwu|Z1XKY9Md(vn$WXxPcICMVkoT_8X`ZVXb#Z}u3DFcy=EDnckh5L2j4zw z_IcQET-tZS^aSs>H(XDw)OuoEU9k}5C^FoS|N7~htSi`q!}JB~`H|g*VmKQ4zd;JeO9{SeY6kynT^Nz^~~ zdHIYzfiPPSFm2E-`4r@BN4OAJO?18C#p9nr!4JSoQ?IPmrhJ}Lt{J@QKIj$da3PT= zytsCFX}w~ff#;jNwbd*y^~zOJaJa1Z#73*)^Afx;b=}rZu1W42Zt3;7mMvYq{apjP z-@Lu*2y{@R+4?uK4ytePl9qlRFlBVm-%snH>xSCe@!gc60ngnczPE}F;<{CiaZ_Cf z&9&+Qudg#Es)OWPVUw+cbF-W|?`jr1W#?WvP{s_pEQ`je=XHQ9Fy&3DDYiIaQfgS1tMJ-J?r0$vd#` z$fk6*a@%OOY|9hb&z4tZ?kz9Re7d3{b8lH$rlS8d8E4b&Cs#amU*@z;U(8fBrL$#N z8yv^;n6kv3kmJpvoN6agJ_rA&&Z?Q|qG!hzDz|dx%<}+>TzF@B-uQ{|o-^}zW?oW* zHTgA;Q^Obp03MYej~w(~QnM1v+$+E`sbMQmLSjjJTs|q5#2cAN2n@Cq$=*}t5^ zy=xcI`!RYi-;RIx7W`F~p@o?I)3<@74xFu*CX%y ztA>?xe2iJjo9~XVyE|TWgCDT|?)Zkghc*3KF%n3^k}NJ)5_vjxB8i>Y~f8NS>cuwzP3+V{#EtP*>Yv*XhYc z=Wp%o+OTzaprdQxrsS&i?@KnMQp>Mjwxs@aOD@m3#yjPjtAM12JBHNYmaPLrx-_OR zIA03o9jaGrt{U#^+1lp`C@52Ovxi)Z4&@8b)iAB#`E?Qec$Ttr>u@_>MpPG_fBrei zMX2-XhgIcO??9WI)jb>)%FrTbZCvxdOH_HR(mAZ}@O5^z4{vU1Yi}Ruxy!qyqtossi-QY{X2W`8bx2Lml)94Tl&FP3gG(n=oYW4c%9F(h&4ffqlc zhQRQy5)$t@2;hh;^bE#%zB8(?C<0lJN*tHrkUa1zeqa7ZdJIV%b$~7JdFVgpr#wCd z6nR{yE_vWp_d#BY9z)W8SA)0Zy#RT{IF!e5kw<%_E$%W`QY{C z?SNnMP{zMPUXmU|5_c0Uh9b^To)c^)75hf&Y zUqS$i)Gy&TBOUdikfaORb?!yFzm!C9B^_OF?DZn=MWxse=7ObdhxK5)v#vO=PY%xV-ntUtrv|#@%3C-cyWkGj6YOc|SA!Hsk(*ad#W{v&OyOxQ`n5 zr^fxYam&%%Ebk2CUTxeD821L_-fY}k>EgVfFz)A#+evwlqw9}Lrt1%$kUoY#aiyJF zuvdF$kG!E?dLGemR`mUW`f*)A1@nk_(~=h*%m=XVANJ#E9aG89F|O0XYLZ+G`z|_( z)pHW&8OyOaKbRRdKfuhyo*(Fmip&p8+-x%ssONR^ngu?k7Hhv!zYEuS1b;FQU^wOh z9LF#Z;Lrum1hUg$9`FjCO7|0RFb~i@s3NXAoHq~n5F;)p#&$W>1N>710Q~DgHtxO+ zB>?#U1_F07A_V-Ofp8oA|C3H9;GYAu0skL_SIzh%`~mz^;!NzhuADmfoK=pFg_pH; zH1=;|P&r^ekh(_ttC^nY{(O22xL31zLdDWg3Kkz#&X#Y4;&9$iLafD_S#fSLW8v@R zV0l-!m|IGx=Hni7xi!x}x#aX0fXi{=wno~%?8$-L(?HvYz*7lmhv96y(+Lu&MF(Ub z7NpP$zfFuI1#xz(4$c2bI(>KNgB8>L(BdT>b*=ar-3W$vkC1rJK>$>kPY1vp0LM{` zs)h9k!`VH!;|38YB=UkdI}IEb1!q4Gd5c6CTxq|n;kV02Tt~gi@-bY>$KgxL0I!Op z!K2{pN38M@ZHc@c0ePoDUJ_wKa;_lG9<|Ch9?m|W@pWrE#zRH+i_7 z#*K`Hv7q&^u<*)MWSjb~5G<_Mq>iR@z~qm{;G!Qtt=FZ(k3M-0!<^Cd-NeUSpL#6f z;j%D146C}0hqaM?mI1);Ma^(+KyiKFrL_Mr0Wh;30)RR7h9Ueg0PrcuQ5lcxesfDL z3Zf0+JK>3fgcbqbgZ-;lY_NrMtzqTh$3N(JH(y3cgza)h}ywXBbwVrd^wrbq6KCyCn+w|oq z`>znv(&F7>I$0PtmfpYwhmDPm?5U59Z`?Z2*`h7*)8=Sx<$goV(Yk-4V``fSJ6t0U zy8{wekZN%-onQ;<6`L4G3gYBq>8OV#5A!kIx9Kq?ap!>-Kch|u!#hbxyg{7Iea@dn zqEa}SdkFpy5e8S}T?#+3l+cqF4js=P{VT{zN+!6{enFh9?d6Csg_HU1q$oJ~d8>Tm z;pAnIXO~av8^p;kM8wG(Anyzjg8I>Nn zfVtFq{Dz~4mo+xVZSb+*TD+{4!(a1?nS~?p(nNeV92kth>~SWr3_}U<^3NDo>D~zk z24k)!0bahBoM$lpFuk6^xF22^jNd`0!sRR)t3?(f2k`Q5m@JQ%IZX@0%T%Yf?YIP9 z{$nOL3r93wrisGY7KWE^4B}-IVBzJP@_6~?Hw7>M=J4@y9uVj8vbn|36yb|GY`jtc zm|I#TYiYCcG-8grX63hf0Y{i!+3tTBk2TfeA0x#yUPc>CHeOERoI<xWJvR#>HF+Lje^ouA6E)~c#Pw&%yZ=I0yr(gnby8%If+xIbpzdqwt29~>HbShoi zdjYp!r&AFpsx^zVchc*@?H+gmx2a(Pw@-i*kH7Wi_ne=C6vhsJX07+(O5BQ0+} zDww#SoU+3CLeH}6uWvqdY4uxo8FT3CaZ_+9v$ji8zf-r7h*#_mN7EaLceIVY_)MQ^ zX=7o2Koh+N;Z(x|B5BeOcZ{EoV2Lx~r|eScQdS;#73Gc4V@Tw!1}}a_Z2`l(Oi1Er zZm{d|D(W$cFxG=@AoW-ezvO{et;3CbGd+eRj%%ZBdHZ0vWxXhmuE=YLU-H1Ko`F2p zO^E48AHZSDdj#?l2%|g{)t5I2zb)@|$U6mLLK3$X0k*uStn%?Wmz3|L@Jk-bco!~A zk{&}6w*$N_?|@Z4u7eeM9POD$>i8bWJ5hv~II??;AC9IgARr7ge+97+(QlHePas_s z%=}fPquo$Qia-}l<`cgI*N;G|EVei6L6>#Kd40MV7vVaeD{M0>xS%adV`lpdJRi@V zr$g5`%iZdwanaLo87y-2n&h+}BDMAc_+1d2T>S(zAL9Benk7A3B2Tn2+vLK^EFt?4 zL7THY?+~8Pii9YQ<~F7oJ1yiz6CbpuP$ zKpBI3x^Yv+JSMCk6ohC2i?vMgL~YQ{HWH=-i-b$xk;LY#+y7 zH%>pWd8>!%*ED@{ET!&wiCCZCd@olEGZl$bGi4Y~_1r=AkEujKUTyN;=d1wU zF9+Ud{A&gH9+gyTWP;c}?9I#ovRB#=uFvAZ_I~a6ZWl*iqe3frBjN$uKLsZb+h1g0 zx%(qJl`cni!1iC#sfgc1=kgEY-{oK4G>*PNtUdxKcFo7}@3I8I>JECda()qaTH%sd zCJ(3oJU#+{`IUFa0oC#SYA}-m#eaUBQ+LVI_tstV-b?DXbj11^&N9ZM8-pIl!KsbLxa_(N4Bfv+E(YTZfVgLw&I>5=rr}Y6;?wBc zd%^FJkH}3u^i3U!drXg^>{G-&b{`{tBn7eeV*n)_hdCxQKZix8J=O4nCLRKB6VsB; z#KH8X(xs3_^1!Po@Av63Byp?3i=R<07~WMv5=R|IJSD{E^^bsIJ*Y>d9zpCq3IVrB zCb%Lmh`o0~Ke1kvM_1&vTY2DB=i3CEy3ie)!i`4`nrLgxlRDO*wJ%3&+NPDF`WZo?7 z-KtB%Kf5$+ANHg?9Zl@b3qaD*Zi9WJ*u{HIT3jOEF22cxX}fj`I2l;^=-I{J zK%2O=KS>muIQ0@PF`H7~l>4+FYZ2i(qxcKh#4lxdh5M&)^58m#tN_=)VqB&B1?DPq zXHjy2P5hIL@NDAS;RViqH=T<3ml^TXvxdO&=rIXvn^0G1*rrvchUV+>XA%zS(ywzBpP^d1KmhlBpU2NuC2YNR5^tJW2w3XTe)F+1^k9 zzrnMoPg~Ka+=d`wINt7n#G<4ij*rg-?m;+p3_7=u2ZK2NCB)gpw4@-8FP1Kaw33JU zm~Mm~LlU@w9m- zMHpO>w*!6~$2VH#8xO~~K;9w|V&swCW66eBeH0apg5$r5bb=L`PeccC{68UG6dYfP zN{v8BDI9+XE&}aPLULZ=#kIrVEF7Pf!uYM@1-y|sejiQ|#fENQWA^V0{IZ7I&|3oW zy#c=HJfOS4rmj_?%mun_!}$@|*LhFc_I29lXkTAQ7agjZEQJn`1=wUB;@P)}E0~VhGKjT@5N4BLkRaABmM(?Nl817b zE{e_k?~smnm5|5?V(k&sgXvh0@v!zsAs`H61+g}Fn~j3CIifC-!oihx4r1*l$V-^= z!Rxnk5Nj`jyd>g zz_@xFljue6hwRTBFkQa!h$#=1rl1v)ceL4(m<9}cOX8!rA+fj0z}t-2^BWsEPD?lh#MUN4nyu_YT`eO_D7%XvArh@a`M!SNw_3`yKM;HiUz z9xPL8Hy8{r1$&)c3SROsE$De6#oAv4hUw*N zkpOMdFX?J=oK@m zkHOV?4DMPJuk{#st;gWDneZ*f)q^g=^=uukc|Pr{oKkBMr}fPw&(Np!P04*Zr}YhP zZqT&8@!DZp-}ql5IR^Dj@7A`V&Yo@E-sg;__09DBCjT*-BmLyc^!$b+py1)@`OWnF zW_o_3UmoAqJs52thUxju^!z6BSIt&U>ziqPE}1zbDqO|e&eg0X?xnVJ#E^a=8Y%Q>jkFQ z3*yo2>&w)AO7BxH7G8ru9v}H{^ZO`sN7Mr*-sp zwGFg%v~_Ih;);P%^P7fcXRpArX;ABoTQ699q2uIR-@)4%c}}S$7ajrvcTtfjShy8+wKK=zn;m6^8&Q|fRx|ZS!qvk#m$&%Pd*{wOyZIX8A2PCV2{o5y9`erJ zj~VE{bH~-Cc<1h4=v3$h)mTDZ3l1Agb2NgA`Zc+D{A+L=TIHNFehP@d2mbe$wRde+ zj$5vyo6EZTI+YXmxOJ*LUdNQJIAV&6Q4d*t9eML&dkv&MeVJ|vcW0G@Rqwb)T>EP8 zc|l%?MNQ)H8t)PKZoz@?3+B59cyEoWX<*IsPa2v20#jUJ_UU!wi_YKL*|lNo@IXh` zz)i_j>))4bNTrrvzidhU>FT%oODNuZa_qFW-O}z?;;%&-rjr%L_S$L$`(saVT}H8V zi>*A&&vaMOV~FP>1=pQ_5@Ebcge2WL2(Z_k@5K7whY(hS152&-y@DXc_unKByy_w_ zo%9%zI1UN6yv1OcpYpg$n(adV12`lPylO9)Bt3?t{b=*D6}&BPEf^`Ee&B(4%I90Z%)>R? zqyz>fOAYBb#(x2a$Y#1~bR4@cNZgkYhp2w0AzcFIot{_!OS<5C{LM)Bmm%qx-Ww;q z$Su5B2%HONHV(E6>&3c4gil*gxv=*D`~=1$Q0C;Hyn7L%X% z3gzha{%~(I{Kx2`6WnQBjw|HZ2co>ER<~jqFjk&Q;O%62noZn=(b1`boL2za9~*ga7(nC_b>h*BJpJPg*=*Vf+K)zY=Ct7CYm zt7UMgt%JkvVS=%7;a5vb=t+*s{s;NDE3l#YfSQ7@^l{)Yuk>j>4&-*$#x?J|M3u+T z$(9b@blp%}JKUiG&)p)vslPdJn7u`AUv@$9*TT5euoJ5>q+SITDvX|Emr+lb3T)d*Uq9LH3^ zXv7@Ea)*o6T80MNuIt~*7qTOLi*9-ibb+O4TyS!fQOFboAk@OsdkV$$DnV~p*Hgwwv9X5dAG~Df2 zzUE zZNuLoHtqjnAolV7ceu`vomMy`jdb-VtDkEHiw|<#h)-I3-bwr(-gAyqe`dWqbE$h% zcj~=()G_{^zAW{cS@DaxtuLQ>c`Zw;%|~%yZ$q!k!5?nwmeyzdo2K12T%tce{U%H* z^9^*QuRL)OnUH<^t+AQ!yHI`N0NSWX!~u5S5*saN;kHe6p0TOUML6?|O_g>+@`5W` z;kSu#q%(0)E0jvdIfUeaSGD4x?iG@_)d&zjL`q2FxR$||cfe{F)=%WM!!LO#<8?5L=rJVi`~mQ`yl25A5XSOhQ1;~w!f(r4 zhyf&tFd>QK^I2QoOIG=+5GUp1s3UnOV@(lxI}m5fd(|o*w2v?EGw@R$uOF!s@;tra z@r>iK$GBc7zA1nX5oQbj3KAfyU(%()yi*vsltl`zQTPVZJ?cg2e@RCdMe^w-K$Zjo zPe90cYZP9?MGZTzFUWZ0JY-AT!cjSQdsK%L?(MVbwR; zVmM?RkdZ;-$NLyrxIFa?1OY#Oj2SBQ4FcyU3@mpK(D6SB@iI8zM-FvipM;Rjeg!{{ zFmudtTH%sd5brw>URZha-SKsI#|a}{oyY`CBADDB%Y(_a9+*TS(M=21u(A&du@Z;k z$!{Svk0;R$b@Dvk6s?mVrPTLPHwT8kHX zs}UxCMt>Iv?11Jf`BM^@&(9aJ5U~7X_t2Rr3~=uHK5d~ zLQF^c01mr+uYgG)jPhpS5P3m7xiY3y67fQEt{|R#-6|i)Cy^J#lbedj+krfG`Qj*) zly5vdxefB7;K^H{IildnhmkG}*9Gz9_mM6No_swbo~%OU!_F)1F0Qmc`L{Bj*c(St-w#a3XZILTdk?~~O8#IdINhdXu zK~d5DH)P>z{7C=n2M<2&;=5wDoigHgAA)vCr{?f2la=pQm(-y7zQZQOAp?Wl_D29P zHKZ(a4ZysKCn#;8d=kl=5&pf;X@x^#Sv-unww2!I@^69jn5MMT z7;~z9>^BT!+I`C##t!}dSd)cS*w>jZ3}g1PgIXlIH;6HdrK1j$JQTxpHiDM8)q!;X zKX~3vLXs|sF}Xf=9}<!0T9-u?p3~2}m6{({ z&Dq}^JovG)1Td$;ohkEuTSr}y{T1-&|2=qczET^rzeGCl6aCihk>Jt4XS3swL4=oq zbT$r0UzCzNnnKooCi>UUKc{(62-B={%H0 zh?QD1tLjeY_SjB$)2syVSMLJ+BYb&`imt7*sZaevg%R zlaRy(G3p(tM-+_u0t9dz6B2nrj2iVDxvjY27mF~s(#{`%-^P?p76ydZZ)diFlmT8v z449VHWMjae(f3xhMD%F<3Z6|h6jZ2Lk^wDG34th4a#sqOE zN9a86p9JS^2{q`n!cSU>!^52et@LU;sOQyo&>@{^ z((R!Cc2w=4rfZ^phiM0GX_2gx`A*=Qw~BN6S^H6c*3KJD2r61r5Mwq)#F(^O+9cQ~ zh%t+$3t~*Bi-Iwy?Vw((2QlWf9n@3usW?VH8yptPBa9hCOc-!40-!J~R}79WrP z0Bz^g@NbuoM>);%@aV@|;kE3b9-p^^euCNGBs=KGouh6CBX~dkNS?d@1Ga3iZ6&6#98)l2?x^X=qi~*6=0voiV+4v)Ay? zA(UGJw6vJ+34gdPR4xwV^Qoghd4FSY=Cnz4Y5U-yTG~0)9=ofswV`$&D~30@*E$|m z>NSSEQ<;u@@VPtnkxlxpMnKReS}dKu>n#CH7sV#ZfrxjNkeoO8+*z z7o%~G1)J!NCbV00|IX4M(r$8Ct$qliZO}>dKs(YTd`Zls?^mM+W!Vqm|8fWmM|}W8a3Xa>yzh zNjrFUHop?*sla*u73)YpUCX@dkhcqYuh4m4#k=$>xjy5hzLohI(v-np4*$#W^E@;4 zExRr^PrFyBCb*GP|8TNhiUOxSJoc^ezZpi&wuVvNm?4xc-k9Kg;4)NAj zU5|f5o^q723}t-6oD=1k@2Kl@D6^Lb@p^4SqDzxeF14Hf6S!KNZJvk?T7r4 zu1w_!&#@`@_>t@vP~$i?+=&VsP?bR~9giKV=)I(dtGX({n(rp)MP4T%u_Qe%pA_oC z>|up`7<&spj+NiVs;cnwSjRW|CsS(HOvt_h%|AOI%B`*v4Cgjj*gs?@-dv++j(MwW z0d5j+VD)AbcbJioozwYi{K;$rUd|ut7+&G>zRGV~@EZn}yFa5->D~zkvxy2w!fZm{ zk=|@V-?W$O*+e(e9I~JnSCq4fZy=8Mb!F@#r@VLTjS6ln_}D3`;taaNV!`e|>2&Lz z;|5i%S#Q&ITyL+6t#kB*V#Xgc`Fe*EXP$s+Iz#X|xCA;Hepc6cf7P&ZPSj!LSO$FM z-SMg$`~YvagyV;iWWGZg$KQa+w`=dL51Q7RePc>FO%6*_e%0OaO?Ss<-&n7l)n15a zWmmI4iqyDC)a)DaO5BI-)GG1Uh`R%Edv!ddoo>f#X=fHlOFWAl&m#3JI)`$8&zXb+|hyXP!*zkF-A38`~W>UL*#uU)%yi(7xG+rD(| z&YrsWy4QBYaZliXoqOD+Mdo*Wz9+=%zh>6FJDodXA9X(xzrAc{xi!yAqCtO(q@F$; z?|FjUHk7*-$1ON`DIdWh#4ujsEjZ^+9754&gIjtwZ#gSg%4W{cMPdR zUL{;})o@?W*1qY@DkgKbIMCL&8QW5r87eM~TH3Mox+7Xn6FPUa`z`dfrr>&-i}9S1 zbD9%yu-h^nAxv=Y_?XqF5$(@+&NS%-=NC(tvhpxL)6pa)B;r>iK>UpR6Wpb|Q-vh% zJOlv#`?Lx5NFtK;7;oVY>alx?_eX8FiQ-6ST?-T~Ehz`y% zzl?NGg`{J8s~f3GG+GjYz})(}@VfE(uuY^d!>bmdUxl5QaW+YL81`12W7>6fvCk{} z2#I4%lxG}f%H^;1eg%0K;NnqN(&ar{axXPpi+3;`+|!NA{zm>R<8oXee}Qq=8h3+n zuQqO*aeIxc=bp&-VZ+~U++D`~tZ~_YDgP(N{e^Lfk~t?mXx!DP7w5A5#@$61@w<)t z4dXsx+qbIe(5D-1k>upI=lJ zrk>^;T(ic!IfuPA3ibnj6ZYBo|JaN;aFe28y)8rO9ZNR=Pwc+s4O@rqt&xJ#C&rtLgEuA9kw4Y&f(N#M zw@Kf?2nb@}V(F->BoE~<9r2%##H~hv_!;+O9K4%^B#yey#&9da>_ZsqF&+l~90Y6= zVQ@v>W$@eb?EQAx9?~xDRvviO|6}ia;NvQ){qNno$!^m$-E8_NEd{o;h5n=6wt-fx z7@$aj0_i_mppf)0t@KYQEfhrzZJ`Az77JLBKZ~Fug7&98t%|+~qSc4K%Ht`|hq_6K zwD_+oDo>IAzTcU1_Ren7WDA9YGM~MB&YU@OX70?~xo76g%@6$YsJE7XB$gkipTzwDnhf9!QM4p4920pu0xz;Vc<4oG>O>A3{QHsL06@pQ*!AN-Yyc{g%RJHTKgnJyGuv?n+HYjruPge0 zujmDx&}X-R%P(3jau3!zxw?pc@r zEsF1h8tR^1ogJ(dLV0<*SeLsPt(Ho;heY>$=gf@7>u_xEqWNp)dvDXlJDusCZrf6w zsBr#uF5bZjv^}Xtd4;-XwWHg0rF&9WEJpWCIl3LtTsarczw%oTsZR1&sC%ZJ z{B@;!VrgNg@-`q16j{#Ee5~!DE8X(}$SX$od=R=~F}i0Ke4Xilg}Udf;44P=9A2dE z$+1dj>E;SV5N#jy{xj>Ib-2G`bx-%~;1uFjZ8QxSbGf_%4Bq1hU^KYVFR#HLF%%p(hA; z|NYGIjP`9@i9uc!G~S!rMIIFvyQx>6Mve#8gkwBNBk@#JF- zhpZcUZ#h?Sc#q>kvB0@cx97bF6#ujMD_E+*XB&#*?TnE7!o*$@O9RdqV5!DO0I*c! zRf1T+4y?nXj7mIS@o4nVWEn+;sU*sZD)nRc0??)%HyQAHdae#UY;8{pSoQAQlSDZml!gHeV z5NO!>z}AJOTl-GG65$n+{k{R zH*^uYXSYMm?+fj-)~(&QO!O7N5lDwGOtu|DqptuOeFf0yD}d7^+~_Ot8+`?EzR;Hn z~t`x}k9Q_%AUm!#S{<8SLO^8OoJ|cp@`Xx)Qa6Yfv?f1MVq>Hz+zRZUe&CT{h zb}g}&w%<_o(m@t$gMB}4=E6?$qcgEaH!~#RWhP8WXIh4*?rjeePrm>SjC?KoF=rO{ zG8=Gb+ZY}%2xmgCN!K~hT2}octMf%I(Rk2Mdiq?+>S#eM^0NGetytG;wWjjH$XhSF zq_x6ToF+rJ@{YsPWGm#iR_y90%IKwyN59$=F28V}@0l?v5Bf*9>u3Q|8AO3#h`-6$VF<+Q% z!%EX%o5iRw@19N4Z;g+Sju$(Mgg+WW?6DA!GsPaIlxhS0nPoV&HRr2Ca8I-D7cAvo zFUqaR;4c_iGK{hOUd)mi^GCeJzz&&qmN$n-eTLVV{29GJ1pX*|UiMF8M}K2%B#PXy z+V;cwo_|e6c`swT0m(QP6Lkw)rK6B-yBE(sW`<=@E;#J^7|nGI;j4m0!>*d$12jBuZtdM%LFaT>gRjHS-sA zvWgR7$lXG(=sDU0ny%~X*Flkd$9}E*3iB6n=KBuKlFm-obh-^)n}6Y);`8WC+1R;u zkh3*jlxC#?)dmnX&j&)<^3BGaT<0i{E9Q^ba?n=t5cNkaCXS* zeuMki2M_Oq?_0f(!u^2UAGcW}0jj)nfxGga>lu~{?@#3|aN+>Fa1HN6#1gLz3sH&XXiknY^$k#Mwu>4p*EEA-gbIqu%p*deD&mkF9 z)1jw(J>5-#=`r=tb=1q*qC*$pi9>Zc&Nq7Y+#JQt4dt`Nh3-&%7dMnf`Bk~o*VyN9 zZgQZ*z;bo<{P|YZm)CUoN@D&a$s+Z9G}0r<4>&>~+aCQ!&j(~5LI3FjrwN=Rkk2T? z7Ykf2@G61V3cOz6%>uUze1H&*>Oq0u5c>BBq4z%}{$~X~FZ8|Q=Qx(>ucjYz`VgY3 zs>RP*=eR*3%aMH4F&xu+_v46~@so;OubINQ6fS=pfwh^@?D6ehD%0X+Gi_+SsNU(V z^rzrQTP*X^3tA&ykoDtrZFq(-#;9wnZpIj+IWr+W2z(er`01x#C{J(5R(Kn-(d^yN z+p$JnTf7-#jpocYe!qf=zoxOpTW0TFIObU4>w@PFntE2 z4El!g-dk=4FPurSJ(!*KZDdiwnK#^Tf#~3cL=0Ze0l?tpzpPJ)H4uWqi+OVF;AJo= z@!(Tnz~H5piNvB0(`WbUp&iROCi*d==kX~BHsTLMno$I?U>E>~G&2!d4gvWD1DtJp zm%-0%d#4hfVMZ;HA=tL}C&Q=P_V^&lw!Q0sdS#E}58L*h0qB`wMt=az|9d!6VjkW2Uy@Om3Hs5C<6-tAGgOoRXf1LtB;pF8~(mu#vg`OPcW*V{4{`f1Fpj`w0br0M@~31 zJ@(8A@e9UIMcXusGRlz|cYMV@NF57zYDM%GW;z^aeIMTapqQafSIZ@|fl}O1Ty?lu zP{q*m=AU2F@X2nGJ9J~HZnwvU@3E^^tzP8mZn<1Bb)3O}XTUXo!GhI`uk^-*^YzPC zE?MRJmoHnn*!3@2joEyc5Ki!iLgwcWvGRR~X23-qozDf|&2*gHaT|8jP&=+4F2@7M z@r3DU0Le!`yHLtg&F}%>u45RT>2U$O<4c1_<1ilO^>YY{vO`v!eAtNZ@d;O_D0M07 z#_IauK2iwmZoIVt8NEp(0jj)nfxGf*@Sf3fA=GkN;KTvyB@i&2h&b}mQI~V&O@_P# zXx)vsCP6?kImgnwIOUDx4%<&d0toZR3U)SM#iur#ljkne_KX@3n2)s?;Ck1{= z;3EQ`6!?x}@bEN{uNqq%Q68ifDHW1?ZTP*&|1%62A>&5>Sfd@T4!yIe4>ZFKu zClkiK=C#k282P`Z@sf@TI9#A@HO8+8RyPUotBy~re;h{YB)5y#q+ONJR&vxv{j21&s?>3^}@xg zuTGsZ=&Dt)dIV6fR zZ;ZW&t2e`&bK1iU28Folxzw*+r+mkONPV$8zR}>(IFv(q^+d#J81-Dm8MF--8@M_R zI|&3=pPP$JJP2BETqU@mj+uO&1*ma=dQ;(1S?2*Kr;nnRguL@m&|>wJ6GiGVHjH^Y*<$4%|p(1oG6%zA(Q(=JWPOuAP}f z`Op^F?g$qPG&&~ySBU=u0GZwr5%0fV@V%yN3TG8?&f3gvCos32z}z-?$~)m< z0W7{ae{qEGlM@h>QYnXnb# zbWARD{*zZvul#H<_Trp1rfT~baygUrns6P4soF_#F3A#P={OudDOL-KV&s0kMDL@ z-ag1HW=?gDlRx%pn!im2@_M6UQlP2Rv^Id?mftl_{<@k|9eV(I4?rGev!3bB1K%;4 z82m(e70#(%j*NGv3m49*ehz$mKdMvFg}U(fz_&}80F{prMVoWOar4E@sm?`Z4b8<0 z%N8BF1Fd1H%dxn*;j_sW7rKtRFl#(?#e5$yP?)PW49S3q`b5AScr3zh5BRH0MlduO@tk5c>H4NO%m@L4J-G8QzBw zRZ=Z})^4Y3RZv2mu2q?sN}VwNT~OKW|G0Ge#1nC<*n|n=iq_+I*(Q~z$9rk4OG#&Z ztS4zpHD>~@dBUbq?82X znMf>ZT4&*?A$mJ`?0OWwGU6rCsif51ga3lD#OaWOu>`ZlsmjilrkuvO&eD`u4WBMe z;d7C1Cn8H@WE%p{rHs=L9!OBbJf1w@Q!xE=+IPd)~4xYqSQ zR^pEvolcL54<0)j-A32z`q`4gF%7LSWw^|krmOWP+5i#Ts448CYH^WH+SPqm&sPYy7*Em4E=O8adM4XoMCGflQo`O8~#FW?7_~#YKD`x!j zoRhz<#y>|OLn)-GPV>G21UG-rJNbjEmb+iht7{y}c=rM1Js^B(GQnL0zG+TGqPz;n zKc6kh?_4!X;rQp5;5&+f#VKFm_~#$s+oeo^%13B54jb5jN+@RhvlZ=XXeaULSI3M z@zQGX-!Jgs$4hHEw|g9Dyp*1l#vlr=`?Hu|!gB>zFkZqQ;S|^H&k*|upp28o7uY|1 zuU70IGjd}j^0@X7Aisg(5};Yfp7 zw8oGhsI9|{C7#MNhVZTB|Hv@(_-2U5Q^3nOyq7?KM$8N@EGq{WUeBWu%u6>6-v=TF z795>n!!R@DHQ_o8rjj3)_)8p9iP^M!AX^E`DI8aDRhZaH%p-?DYpRyoH-7$U3s3@I z)vB5i*VkoXI9m+EM{59Jr{fNcH;UgDY?x`4W!bSe>`1lZM9H0laKbTLl zIzO=3T-Q=735FvcLUae-5bw{cw#f=H@b$pUXGXw!%KASlfzyEt}amW94W5{~2v7?Yu8M zRDU4E7=lYr=pTk^B77}lh=a1Z)D-{C(n&F74v#+-AP+ln_{~x%$88?=0{f|qZ}tJF zf^2AinIZO<{BebAf8m%Rw7-O7i+AiV<|N1i><50Dt;5uU9jG)I+^&50e-BT=K!r~a z1}gsz5DrvMgpmA!$`DfGff)~%1gA2QSoEtDS2$3KQhOHr%SVC2{&EH>*8Vbzl-$FWnl&`{BCzwZRD%hze^g7@ zc}&CAfGdS-3a&wd0~psCUoAok`Ck9nD$k^2MmxNhLo(1hbhe#$MqzK?UBjK*cp6MI zw|`N=3&&wY@f2{JVfr9I^3h*74!aFB*RfBbGu<&D)NbPr#8)^DBVRui0$fq{){0Z$ zL-4Q{P^W0&IBYcTBZWZTM^`qUCS>#`6$YsC&IRs{OWb|AEDtT01x_5GUO56%M8s)1 z7mmZ+eYsHWbMgw;xQ&K@V#Z;MpwDT&u_M#`6^_HsF36wW?*_zi?{_)m={OOpVNPD* zIP5aWt3$XtmG=M$#C06@4e-s=KnbI_a2(bjl{E=;bsA+S2&k$?rJo1BV#Z-Bz_&{y z0jfMgtJT=R-Kd0O#$lXk8`_CHhh$Jqhn~YV4h!d9+}yAn+2TU?My_#dKr+RT!}uBu z$6?I>TX7t=h55om!9I)dUV)zx_=rHZS%&WxxL@GG+IX%-^-<1Egm^ALD*h(~9`v}a zaaE%^^^v1pY#<&t4ky5#m>xHAqOOw5Un@6$Lhb#0Gh^s&Ujfgl6E8Ii8 z6q$GsJiT#YnmVW3odsOu0DVLD5OW-%PSYyXjrk2omJ{`uUz?oHQ=FAL04t zY=AnVygnpQ>Cd9TJJTuIwYxec&-~$FU!96BTsK6WoO-Z2y&Ozc%RzptkmxJQ6Tew)O>c`d-<*9J-t%FjaF4-AxXkVh?intakuxX%j6mC7?Hu!DW)tqcxO}5V=c{n+(V)Un;SN=} zzmb@?#{V~@#Dlv4pu+L6ddx9Hf%fFU{L6u21n|6UE} zdYLb~0_Gnwe;Zro`TH$C-EIvQ-#jm#1vjrAUfJ0IJvnah_eTCi;FmE0Zw;6h2@b58IBUu|XL_X(tZyE3#nmf#0{<8s zsAAz##kgvH%|GS$E!}oUy@9T9j&rx@7i{xcHYILFz@$c`f~UEv((f%vGWXdK2P zADf;9ll4cJr92e^KT%%y2?VeXH`tk;`4B=~ zJ(Fia9;I;rRdk`Ac|Q2Q-U%Q1k)@n#LS>~u>Oox{hblu%(9XK>KsUa&&V;`D{s{I}~%5EO$Eg9h|E?+W71r%hNgQW~iJg z?`V6@3(>q$Y#WF`DDSje9Tw^cyK&CzjS$FoNB=~DeD3K#UEnlK!^tQpuk@VeUbS2{1&wbS4%|}g>A1e$h@0mJb< zg(`2~DaY^i8Z&K^n{eiPL#D;6%e2I5q3dFeNGWvU66n4B#`=EG!(QEIUx?RkY<;gc zt1W2Ul>IaG;uymBo$}2++>cAKZ#})3CuG?t-Ri}4=I%Z34Cb~Oe+5&Ur;;8Ez5o#F z#eALQ>%}jTEgqP9F9|A`NSk0TsEOVm9%wJn#nt(lLux zMeZ4JAYM9qTlD;GQR>OPg3A~<%j(JEo8!gzfyztu6SpWS;?^yH6} z`eV;LXYAKhQRaKbUFSWBxe>=(ol;SKi@!OtDYzkeeaXgBF9n*du^!0&-SCA9XIBdr zC`(=btfVZME=pfMq}xREGamZh(VPE8zYCvo^d&UzoW3*+IQ^;#Y}AGz! z(%{uNj7Pp=^k%Lf;8UkgQNBN2J(Ax^-vt`qYhCHhN8>?eSEx?q73$3|LmpJHZuREv zkjHyd7Zrr>Z#REDY%c*C^G9ume3W0PH}8VHp`feN{1xiW3CPp@u|HFJrt8+ofWLvf zl;c-<8$fgOSMB7lE4{fK4Pv+ofefO&?h^=LTn#c5>U&|`KZH<-XcRVYIrxrJ51@)J z)SGVtUom>~qbL;G{JYbepU2I=yOVSsl0h{;^c*g|d0H-0Zf@RKy_rd}y=vXm0jC~4 zngQY%-iaP*_x|mmf1P;`#`q)n&NfrS$J;XayoWj)M6^0%BG^YBB|`M z(V4d1(53H4t#6$H9otVuS|iY*&3QJj<(u?l{P&jIGa`>GKeMXRPx`g!?@CL&z&Sd` z`y7kL=FGI|;Rg4-(*XT@8JIsg%N2G9y;i9S}4SN5fwO_@*eT_m%qTvFYQ-UOEQNs_S!3m`^^Nwh$iy z#-1Nfm^LN&I$uVsMa}R|wbCwUZ`~9Q$xQCQ=49>Lf1(zxr!!l++q!Jm<8`p5&tubb zoaq7JKMq$M7xV+;4#dZIkj5b+`7R4odv%uZz(*CPkAw1D(@2D8V9KN96Tu^;Fc0$$eFz@*iRx5Fp)UDJ@O?#@ z0F{r>_NO-RE>;$Ze2?QDY3_sf#e0Q_oVyE!H!$Z5c)VR~+g^lR&| zsdSu^jd94~I5&01cWaFPeD1)UkRC=4ObNJtmPF_Re8rRF2D;(6s4M2{hVGlA$az!@ zY>ci4I07;wfNVR269w`ar~h<;(*({G$Y+P)^93#!c!j_Z2)s_`DvT#DVwp89LZ_QFq3E*&H3I;Jl4}Q` zP;%hfaU0uKQqN=Kk)t=Fr;$>(jTG}f%YBJvG~__zd~R}s=Wy%1-hZOp zt0>l+!+-zp6}_N{Vr>Bg;aBw8aPG5@i27lHrIZ4rwyCLLN2wq57~^WZUGE#??XZ8h z^?Wu&v8J?N>1rlcTLaj;(s^A`;iqBpl;pf^UWY^h?sj*Vehu<%xR8{+_iI|r@K38B zyDd@Q;Db?0d@l42-vHco=9vMZP(N;PnSd*wdF-7q^0C`dr+n;g6lWNZFXB_BPSKM< zaJ7Xf2J~6bs&MgDr21Wi$9q_55JH`(EB$y6 z3Ui<)YNI&55Y_yU^3SXv^Z7imer(@kMxVsPRSw<=9tzbfS=Q7qjsA(iH%dP?N&w`q zXL^7)3cO9=Ck1{=Ajj3@ds5&_0*$pB^h#7N^R3@iT*Pqr&HbQ#bgNG~K-)9ae#_p& zx9n4?D_T?O1<7|$$W-=Qkg2R*zoGKj2Qw{k%)gd__lPfLD!JBye!tez=r3KDX*mwp z$Gu2))FiBpn7W}Q;>~LDnz%l~8(CU=Th?!?ZAI~pB;9YCI=-}aV>(*9AR86gltbLF z3*}N?PskgBt7I-^&Tc_hFtW7n_N<0?)vxH@BtKyXaQGIWr{EoEgXTf3bi6i=H>5?Np@a$IowjAM&{0J0Ir};yX-U zX4{F7wWdH8cm|fToST+pM*{kgb1ce}_`2MY(Tjp9i|%JPmEsmNjX!L1X*#y-XYL#cKeLve~(RKg#+1TsgCB<{pz@ z&fqCaB^I=zJ+@4mo@seE)}XU&xbB8|M;m3kG-X5@+oj$U%arBGdmD~6lxvq;@tm+7 zv0ZMhZC#G~*0!i|J1d_!WVmh7v~6jNwr$(CSXy^|y2tjWmXf9g*)6#D{a6pA_0P7n zW^n#JE|+^e5%<>T)D5}&9J<}!XAkE-Sq>~ibFYn=7KYIum3#G4xZjAq-`F}nGjs49 zY-z`GIMRqIlvd#CiTLYZSnfO@NpS0l^f6qPH!ISRKmUuJq z{9tQ*I#cDRGeJ-9k{00G{4@uzGuz5gE~YKvd5D{GqIr`66(Wcm!Y(3NTCAYAR zv423>`{)mzHU2p*e)_cW(Z)?_-17;KgT^lPHLbyVYs@#$d{=R#?^lg8rYz_=CEhsb zmEpG!=u6gsNY*MG6k5fPBJ?3b;}_m|J#qg;`tkE@p=m4yEwF!R7Q-tLTPS2^!}A7E z0Q#wLTLtFZdqT>f-d@k1XCmlGJM(dr?#4KJFp4@A^2;`i1;`B=5uBYEnTDr`ZXqt8 zJFRqL#Au?iz$o3Z;CBed#E1|VgAdEi&;UL8)WXT6#Do7Jr6jnVa$?c{rtj>*j7oja z?#PHzm6W4?IID(5Xy=n+kNP=*lvpqp0Q)pHLQXsy<-yUBYbd9L4d`+5;CP?X<*Tj= zkNNRp(?NGn{oy*1I3`4TTmk9+w-B25)rDV?eTGkoJ+H#^=~HL%kBR!%0n)K(FkQ0N z^9M&slj)N3D|3Vy+oChKMSCsu{2|dVgClZlwAWhj4~;TyonE;T5r$ccM7YZHk99>> z@TfrMAq63v80vi^JiWK^?{552+w&?P1XlTF{(TF7$?xOOKR@{l!K~yj2`);$NH90~ zXM)*D4o&=d$({rkB>NFePo@ZFBu4?1BKNblMXN?5c{5APgh8|`v12)Y27wZsK0a_CiPrvszR!T_!t7}$Vh{p&27IhD%d-heMKbR_R? ziwPb0O$UF_!S8o)4h59o3-RjudgQ>$@diAVOZO8_x)%2a9E&=z>3+#cS8$WA;3i$c zO}c`cbS-YvwYWE+DJS`>j%2}&WWkMO!Hs0Wjbw{k$rkqp+(XHxB!A}Ik;T0us#l;+ zUbX=%P*WBi&>MANZ#0Oq#%%!$Zn7h|$&TPAJA#|+SlnjE;@%MhpJSCot<)9=pBCc4 z21VIYk7UC;>KtT-*U{dQXM>nJA4D8I)&P?4A9*T(9o~71fxR(v#+>`)H70)s`M$V6 z_V}6+6UGI*uRSZcXw0Z|aO{}$x$%>0&Kx^_;W*6XN6z(wiZMaIF~R%I|0k~<6SVth zjXfvW_TeSt$Bqc9@Lidp?5t_ygTZ5hn?8KjIq_qH9!t&+l4k{f=4<4u!SAlUXCsJ- zv(jV7j$1f39Sn!ip9ZP3($nZ4H6b#sDt=}BnDN1%k%@8ZgCBeABYjXbC=GAN7b8s= z{^qSW9?Af5eCJH57&^5geT)B*$W6hG(aj~BN^gi=AK%!6)A{HN;g+C`IdZPAx5HpV z9E5)xjAurizTN3f;o`fc8BC4Qt%Iv^WyZN@d!;U~@| zfJ4Dcx!J(ReE_tF9loW&Z^rc)!ns{r-J_sAi;JHQe97K`3F6YiYFx|%Wv75MuDX|q z<5o4@a^UQR)z#OpMd_?qwP?|@n$BnWb-gu;ah%u9GM6>uy+c3OUtf>j7=Po!nw05( zWGU@UnS;%IYZtm-qR$g!jNXZ1L*Xfw@NHOwpw3(Ocb zu3EKvQT>{$8y7<$zSCfqhySyG)D$}{$6){DeC)2|UP|j-wrHJuWcQNQ^H(f(3E_wC z!>x55GPa>_gnS?CqFn+X@;0UlDws%-s7h@$2)(_o3^^ zOE(Hv99MUIY4B(qpdRIY$RQ|tY60Ir(9^NEQ>T0VDC4J)mm(rg!)U8; zC2cV8DhNNVz@J;Xu+SSS`$X;f_O;8bvVj+*Lx4{-H21wJ3@fi%wsKMZ!p6q>M!c!5 zVl@c2xE=T)7(%jy@b42p*YD9^jt0f>X@v046F>Kgke)&{lb$Aof4TUt5kD0rh7Te{ zc!T&G#n1YTpq;YzBfzPz9?<55LNzugz!BsFObf&ur}49|CjE4Q99htBmXrXpPo;mc zz~uss%?b4N;%A>lzS{)eEATS{9})Pdz$XO$uRt@qh4@FH94Y5GLX_Dkf&8`{{ht!} z6+-kU13)7jCvd62^#Zx)hv8o!#PubCdxg&WVE9}@(B=tbeJ~%BQSO8n3S1&^wZLly za?cC-?hyE>z^4WNLg0%6|00le$aob3M+=-JaEib>f%60|6?lWdZwUOJ!2c4+Z?RE6 zCdCc>tH4S$AkvQ%I6~k|fvZ_BC=WUqlC0}5Hb68wbb%%u?45rP*y#2LV*{L2lQORR z?_0f+G}-B30~}5JUtOlntIf0}nzyv3y_@&Y9!US7+AZxr6r12Ku?a>RFdv_>^ZKV? z-0pibT2?wX!HJ#N1V;~Z>=Qd^6TB>W5^aK)Wh(n#1e@SyYnQ;cwOR&#-r5A!_Cgx% z5w1;eq+@$Qle2agQ{=N+Tsxq~jfx#Y{j>v?71&;k9Ak&DHbB~3N-_(wsnnKM+TTt> zzGzoSWVZC}lit!7lS2bj=`F2+w`~v1*DuoUhezVh1Z*RH5?k66bqu?GPYPukpiBqR zwgvkk(!oo_+OjA+@Ye4c?b;7vFT{F^4)(%5u8j|62p-rAXT#oc;jL(DCzYly%tq^; z%tlZ*%opt)FCs1Ex4lmt@>9#Yz0KsO1ZB!HVO`U%!TXyl_QiQ9$3pw!@`AKWw`cs4 zx+UHSK-8Uo9O9;$FKb18ww!QHrsbr`u-l+cY5!rFqmE4-((l(=nyFLRqadT@6R3}2 zPMx9+w4kdp_4;Mpo7&Q}{!D!~hH@CcMCwy*R3<)bQyIjM!KTFar11;e7URF(HboiB zSe9bHoIt!T+op9r2z4+Tw9f37pDM6h-Uq%y8{Zz+#>e`njSpphBFehY*&A}@K6E&2 zktlOh_NguHEc^22E$u9CQ~pgXhr5kGD&NXzMF4&l+3buA8l`Z`Z@wm^Uxa)>l?w>qA;)rKwA@(dMVJk!<)(90Phq z?St_=7fv$@%TTD(}Z%@(cKj z+?q&!4G^}(?-0yN{wKkO$)6F-PIB!6>|Of^W>)?kAX!Sy^49VsPt)`-syqUqY6wzJ zLAo(4!tyndVKDAp0{SG<&m>`PayG%70V8dQbfwIC(0BOST;cjTgp)cYYj`9&rG>R&+R zXshzuAXNU4LH}cdlI<4!fnZkh9|UufJ!~S0W<*JTl%9FXI|(kSdLN4AS(0h%jNBSe zeueZ4l8+m2H2EWX>ykesn4A0+!JOnD31)bGZie{Ba3wk90#`Y~^kg*w@2T%`!02+u z!+tsAVZWU5u%9&^lDEG#9v)BB8V?N`8V~!2#>4)h@vwhrJnSDD5Bsmo84vr1#>4)h z@vwi+c-TKQ9`?7!L#A6j1@|_f0j*Jthy7jSVf8%>9m%`1M!x}$@o>O{4*h-yH?}R| z_bA!okQ^Eht68QtU28D3>5B2N8vUcBYmI(3UBOMdf}3;&H|Yv)(zUov*WzAvV@|R) z`dP_>8_9wj$$}fnf*Z*ew~{UHRo_C%rX;Pw(B6?44+r)Sjfee1<6-swTz0I{&t^w( zlO4fLb_6%s5!__Q;x;=L_XZAlj#XlfhXYz1oI`w}13SVP4+qhBcqFaKypHk)(Rg^Y z7!T_}^8G>M0qmMkZ!xep)p+=|xZgbDym7%!SncLw8%i+DH64zOjQ8WGOdEUr*ik{x z^{^0*9UHvlt-tj8;G-X2VoZk1RxAbW{ty4em<-Pfu38c#AO<$Uaq;uhk>UM=EqJH9T`uv;gID^&%X5dv189z7X0?wCBb@seelH($5WAk zVn9Tx?D%3?mo`McYG6a0Qc>5H4e@*wwY4GIVKf9|ItUl~L^wP;;`F6XufA5+1fECw zZK%>&z}2zd*WlvR0;iGGZ3e<=8+Nv@C{b|Q4|yz!D~ED-;<^j6cRKPD;H$y45j2LW z;}jUDWtJmN=8MM-Qs#18oSsqFj5wM%@~V3V^yhIg&!i8>?Xy?@4QQ#bC@`J(wz4To z&Aww(OpQ;cPq=)-@#98#r*OLRHElvV1ShJ#?QM#DxYX%$0TWK1O=nMaaW=(g99fi! z=iRtMo8p1^*coXYMkL>AhoI=G1$^&|c^-Q|b;`$iYS%Wk4n~@}=sa*cUD_1y>V=oG z3IVU8=N8D@?by!Z2xIvXa{ilfw4eGn*t%S&@>YNdJZDp+&5rRkTQXzqPH>)6=3 zvMDx0-XtesmA9@y-X2FDZasG&TYzg`DCT9zE5@eyvQsXY6U@oGuRvaZ1g1b!r)d@1 z6!{k8K!^24`;V6M4&WLGs5g;`IRr(&C1kcQx`_~0j7{-zB<7Z%%6l3z@E&P2!tnPu z@ExTdK;>gz!IyK@n1gQ3`9ePOYg=J(Ip)lpKDYpJJJ}T3 zSH3YeMR~6mVN=|WVxz6^LBc*za>W0V_^BW<{2D@pKPvw3i2o(=N6|1DK8XAkUYke}TZ20zV+|27z2SN501e{z%}@1pZ3k9|gWD za1iSi@rDbm5m+m5n!vdNuN3%sfnOE)guwq4_`d>Q5a{E5&2)MR93b#CfveG;UzaVB zdcCuuu)F<)Cr&EfmbjZ8J6=OI1~~f(v1gF`3H_#U-{2`?Bb?>f2nTgyBh37>?Hh#6 zfcu^fv^VfCvNv!O>>!1E18;NfZP-Hz9@zRi?hR~*{eZT+iDJ8ZH|#5gw!5hXvcU7U z+Z*_K+DuTEe!+gfCkpIlo$dDn&)a&x-*()4p)Ig*zu#4F@P0qq0?{4k_WRKWh&Fdf z_WMQCceiuTU+@O(_Z#Hw_Zw)+F|^ykAPqZR@%#N~$9voE_j5P+VbKh?^!4uPb01%V zJNq!I&<%b`-QZ_-`dL#P_WB)8o1A$w+82&doqvNjHQhp7K8<{xZ}9s)g2N4d^T3zC z!SB7K#Dk~6h7EpP%a09yKcTO~2EVV8dfv_W54c3Ds||i1gd7}#^h>ZkLDnL6^}TBN zbXVV(;mh0A_W}sm)kldv$KWaSxyR7IIBGUs0rglOFvP)tGS5s)t04|{6d{Nq?)%6a zC9wQB%&w?~r{XOBajFtZ7}`TUu*CcMw-$euP5ATAulxwXtjaqGE~>nbU~c8Z1hXr@ zN-(eTae@mfe@HOB@}~qdDq+r6!ytwZT-1?5B9(u%Os^8udC5W0`#8?5H0HMpE4hx( zpHs;>OC(c6P*+(?FspJJ!R$(^;V>m7Id@vesOLkkf;DeG!6jbuEYR11o|p_mC1*jI zPy?u2Nqs+}S6)dOFq(Z5)MjLjp@~)y6Tf5d-xxf%ved+_OcKnhJc?j;fMgZ)%th}Ax zy2|?q=2SjHFuU?=1hB2q_Ou39<@YSte-TWt3)b?%a7&vsyF1) z?aZ{s9hWv;F_oEg1vlvmZqgOpq${{d*Wxx^i+k1F0%|3Tsmw?g+(;JONEX~k7Tid- zxRq>iuX;8mo02>T)7p1)*%4Ej$&TPAJA#|+2yU_?xXF&i3ruT2XO)O)t<}LhHLbl0 zh9jeRLGe=4+Bv8^?91cl)?r%vKV;SWJFdu^Z(4gU?g#f^r(LT*CiuS(9e7*blipdu zo@=|?hu45@c&~j2UiW+O_=bS}tfTP^yYfN<8CSJ(MX@yrVd#jW#axFeU}6v=j`GwI z<;%nvz2GSaUJWVgh5}&?b3D%Vz3Li(EXUP|tK8uyp1{Q(lj-mU#JG*1t#kOe!EY|E zc?e&JOC9G8xlykXJ@ak2)IAJ*CoblJvYUZ3uDaWRXK-n{e7Q{lpSriCp)9N_vs=#m z@m%q68{S*fQs&O{ty}HA!C!lR$3CWwxEn~@1|A(_8zL*`cM6|%(qZ1nv&TG!`Fg5V zn2tB``Pi^e7$$yw%u?*J9mllj3hiSD;!A^9<1iliRyqVlPc7iP1w9*kH+9N)G6=3+ zX&P>z82i}g(aG&sVSp;{+yZ$I;E)iO1IvX_%jFW_jDs%7xQBWPB0%M>fFF3{dZ9lI zKFZN>?VbwlV-F+U1o)V4SN5?-A#ak%CQy0nfV<`Lm?Mu_)%(~2T=N3d`waq9M8s*> zjqtnjo^r~CqYjmKA8?IB5#_MArHF{rutNLTGfw_EHL3D;0M|GaF&gsr5D}+gM#lk- z?TfAtGPPa<;U~)L`vL)sy90&nmY+s>8lh`*Ms`;VkaP7Ica|q9H*5}*VKDHC(Mf=Qdf$Z<;r*29J8-}sZqy$bEI9uQ{ zLi8g)68I~DgHfKOzf0hG0v8kFS|%_f^q&gsjdEsqmB0yv$j6@qR zCZ=oBDdW1|YquteM9`Ji7!caWhH|f6L#EBcemm~9;~AR`+;4|{CXoi%H|jDir;EMp zGRIyvx)Xa@`P+0)UA62@@?o!a{zDzNu`t`pnXO9lJnHXX)&a%ZB+MiYSf;RzbA2ek{je`COZZ>N|W9TDj)WI4Ir4497a%=9B09M2xi%> zakK5#IP80y%FO-}L6yJ8U-GY(H(sgS!4SMocS zYd694NxK0z{WW)$vdEN?m^zQ80YSH zaAP|Xx{sFE>Att7T)LeZ=eVTrfW|qKt{CA=x`LZ@1vlwhJl{B1gPT5}an48e zxRETlk!{$GD8|S!ykyn9nt`Eun zpuZri=DXI1!8o@Y#<_>Cy(hTvtkL5-+4DB+^a*L~dK>$5yXS2qHl%GRddFJ>HoP6g zUbmlgvezx%{aLS&FYYi@S*C3AOk-X}*f==5V^G>?i_=bDo`O?qfQumg$;dN`dlZgt<{k^45 z&~&FF-?8DnrO(ZDpLIMI#ueJ|8lduRMF=%NKFZ{a;~FM@eT=y8!FA-NE41Mqh>sei z#$i126|={!0uw;&_0*}1lRdI> zu^cFmP~}|$oN=^!IsvvN*QvY}AOg?X@Fszeax`4)V;N}feN08V3DB5sS2ny_$eRQn zbt-Qi2(G-jjy&9Y?mo5v*St{1I><{A5vO4{!tcsk>Xb`YHoWZzkXLBKYjpD0l?`tv z6+FLk8M>qY;Kbp09b7dH|KL(1y1agw{^@$ggdM z!5jN|McMG8XaE;=BF`ZiRP#g6;j-Z^%JmIyZdi_GdD(p{pPR|P@(r@#6}`!=38h6_ z+EzkL06ZoB=fqFFh~ZqT!0@f&&xqgH>=2$6e;+ht@((2hzuEH!Nd1WPokEYI^Ps;E zA;MXo|4KHzOVDg-Gg=_Lju1dQ1`%P#ZNmm`Cb+n zWj(`B{h4r(z>@^768J%Zn*?qXc&|X+1NWr(e=P9l0%Ld~Q~qkSW0nWqYqQ;9Z(IFU z^;ZD!gL&QA?#53XU-UVdTTv!(Ion;eIfFOTcGUi{EwAZ3HqObuw>|yvRd?o|_EfK!~9y+7CTwKbN znQn?0j=IwM_`=6WA`J-jrSl%5T(BCivuqH)i3g6)P5_KFn7a=C4_^ zdf9@tYZhOjt)_d(hn7uQhd?#J-F9cYEzcV)e0a4OH(8(pc^o=?YxzKYqY+W#PzL#y z5D}+gC&RBegFc0ePmwweNM;u5L|hS z(3i4YC=Wx%oV*KxGmd?BJ@1by05m%FF0*)Uy!H|TC{M$+oEL-Urn?;J;?-u-1)58j z<1md2)Z>}wDI(%j-WvE_dDl4d*iVs<`M436E024phJvO}!`S7!@@{s@#k?aBPI(-M zX&j(lE##$$h|{o7!0*bt&B-6{Tl4oYaK=gFqHBOWo|C4ID6g*yRQfVB*v`gb&0s)K zqw;a@Sux`+Jgl zDuHc_<0!r_)v;Xj*FNUIEpuNQDEN>7`@9G`2R;V}JhvYSbD@6(aD>3Lz=;CcM=|_# zfzt%e6v#e;;qwJ97szg!^bZKUP9Wz_NawRbeU{G>;Ua+mp?-^^!;s30U@`|odc$Y# z3x5h(K8)|2$!5L>-JO1W;)#=rUYnL;BS+KZ`vbFJxo<(cYtwjUxm}x9zSqlyYtw3F zZQA>twP_c0vNmn|8@M(N-$ZUfQy8h=+C_0;2odh%?sSb4*462nrOwWNH}VR;yUX+6 zxju#K)Ozq+(5XyYpVXH2OP#acr(*9q*RJubb*^2DHskxj-j=?2ipzN3H`l2&czyRa zcpLWgN!;CDj`dQ7Yt-(;`kun`ALhDeVPK6Kcyephdg8m#ke@s6-EYpcMNmhDd1=ME zr)sRJdk$-4ct*q&S(i2y-rt(a&Jp} z?!5Kp+E%u4p54BYYrtv`e(jzqD>-l7J|}j~71vaiqwR7%Ul4C<>4S7Pqbv%~nb=*h zmhR$%SWAcXt%vl?dGytWj1{_v+-yh-0}`B+eqy)_8TH>Pjp z^jT_K){i$G6T$bTkBMipF|V%6Gw1o-n=|LV<}AN69m#flE?;?de_2Jtg;}red)X6l z{(K^Zb#>$Ix;m`AvuzaX1R)g@2{uCR}V%>Ij73YDe)PoWq6+8>W!L7TzUiOgh55n8aE_NbX5iWM(y14M1Z~y#?@T6~lRz-N$w|`+pc-pr=yCOXA z+n-Yrp7`z0s|e5hj@;U(B6sXJR?=03Cx81FRoJt?nH{;8-Xm-S@DkjVE@u_^(<_{V zz_D7b_wC@KwwD;mBC^Yz{JDuo9p9Y9gO2Zl#Ql!1F7b-vo0a&h@mcS$ zAuVdWl_p1a&%e!&#hIUCyY*yPN#!U+m95NowYcqS`wMje<@dM1#{LrMSkQ(MuWyYkjKqmE$DT)lztm!g^X&C1mU3qcH)BDx=Y?jjw zTpEWWJ_~ufh=|j$Z^2KT?Tc;|<~QAQcNoU&`vL)s<9CYP@>6+FBNT1EQP{krk-4MP z1E_q=t3DeHeh>IsiHK7^LTxJyN*8$+!VVaO*w)mkJoPJd>D|xYyE$h5wbfW@9p~%w zANm7*e|R5W#@4yHp?nN>9rspVN5#I9^Z)O0@{20<&M5Hb+XIF!g2~-1k~Ema)l$F)zr2vPB4#6Lm&rwBCXA0Yf<@n0tJYJqnWLe9P7 z|Cacl5PvHnu3riKwb0G^;*cAlewcoxz@r5oFYsJK$e$_xdV!Y-{D8pC0(k@`<$akD z@qQxke}(>{z?TKaQ2*rbD{zRwT0-P?ia>r$j(l?jE*8kWY^1M7dnG>|3?A0u9gU{u zMeq*h`;Fo3VLChSU_s;j1%DHl^_sCrz@P-Jf?*ZTqX7O{t$(+5%`ZxIMiwd+X`PWba4~%~oUXGiaQXjW+GdHu>xK>^tR~d$`W(^~CKs zujwqn>UmuGnPv`<3$OxNfYsAZ7Ge>cnJg4vt?`TzG4n zj+(jx-A8cw6Y&?}P|p7*|3>-5=_cdyFAnB={&12?=WL74-4+cn`82}#XK#z1zbzUa zO16<3_&=j$48dpPceOuHk4W>&3L4*4U5zEn@I0+mVSp;H za4h)% zY|3pU{Q8b#cx^#=?(I5se&=sEY$-J#i8;W_%1-XulYseb3_@kq5hg{?gx<$I9&k+- z0*_=k;Bf-S6QWU^DDYyTzhB^o1b$TDorK`ON8pn}XFI3dc7Y9q;A1``sHkf3*NC6( zo#6-4kH@OIo3gH3{rFwQuesWda)Qh0$9++o(d_Zp+Lkx_AMZJX zd)}3RK6@KA&OZhmhV!|kKf=G^zCK{1>Akq55i7U-;|#+LuQVFnN-{3bA7fa_HjUnk zV-FG>&-i|wjd#3>H{FZU>h90s-wFP30LIu(uOv`o80)a3ehI1XHcVt-&QE!hFIl^C;T2=@we#crF=Kyv-ja>u$HpJI zVQl;hRz>fiqw_gb$8wrd5xs?FS1v@-Qn&_*pQXZUN=2Vr{7sP?g6pFjOW?1Ta2CiE z6P~!mzaescurX>3Xtt{VfRM4ca+61^7tdc*V?GX;BVDz6*_y>QMiI%;$TrDi4dqCN zZ4xLpZ_<>EpMTn%i08+td2PCT$I{M;wYkfAC1(e(%`ck2hA#k_A+tpj4i&go<;_>^ zU*~3xw}M)4^mVprzEkMV9V ze(K>G2dKxnR;C)WcnQ>maWIG<6zw83?Yto1Odt&B@yU zT;ov2vyhh}B2L3T48JSyHVEOHhWUe;B`5D=z!@ivi;i=IKd`9zXBe-$1sWp$9>)#Z z9?4QP-Os=a5sk|CH}DmsuXDccD;fz<I`nj}ue&*6dTxsJGdH2@Xlsd?@((%O)EVEcG5T5ap$kmSxqg;F=sMHi z`$;gLPwL~t0Ewr>e*z%ial9Bl1yJ8>^m`rO1x9nv>$r3MxV+DD{?6YPM&Ct!mm{rW z^z;$r12gkVSWAeiU|tCu2tmJ0{Cws}r+P*D9RlwY`lkhcL+IZXKifUy{aEPl7eCvY ztG|yHKc5-$PZocz_~(hgLHy=^@u!gOmGRb^JtfCu($P+Wcc!n})le|Gw*Z zB!VVgV}RXL;ib2>b6-FJ9p6iBNJOAxQ&-=g@LN4^dfWbV(25pZhW_E}QTWmNe&Bm{ zpK))j^F`ckk;ckskR5!!Qadp>Dg_6-M@ce zWO$}!QuEgKV*pE#A3uwI5g0Qal}=`(>AP_3Ra0v;eO=$)UR_%>ab4@n`}hAWQkF#h zW!fe+-%#=bWyyV_Z4ca73mLUjT6@X8`QDngUQL;nO@p^&CnfG^XPbzoZ+)IT42!1M zKaczjWexhwE^5LZ|-Fz36_3xp4{X|>DZ>kEsrmPt& zo_G9SFFoCSr zmI3bR*YUdRQT`XTcn!8(uv{MP(<{p&3^Ng}rQQWCxR;S-+?&%lrS(PJ1M>^oiyp%K z%*Iya^Crp;yv{&gUo2`mW<1q*GdtW!WUQKz633cQ(^fg=YXW5^Y{B z@|d{0FP^`$D8fop*spRG<_S|+)T6ywB__^kzoj9I#F-qm(W(f zjP`-&abxQj7$19J>eAP@>$5x!@$sB~{j&&50O$S0(ROs)+faLNdqeu(_8`3|`$Q%4 zw59!LsGlJiJNHgkwN6dnTT+7bn0_sAws%-l+Sn#*5HEqW_JY3$8`&;%z(>5P5D^FB z*=@sXrK~o6N2htkx!WeM&@0PWZl)cbZs#)CR{1PbCZ5X|quvenK2TPZ)3>(Qrmt&{ zX0K~K=a(q6MxV)D&4Z2ECWhV}>MU4cGsTH~$leiPf$$Dbd~ zw#w&hEBdefKOZdJz6TDvficFJUH?5_6X|9zkCzc z5@5e2=-a@<_|O+kc|a$}`}E_epDWssRvGW#2i^zwUYh3f!FR@{){hmG1NM5hK8kmc zwkzhn&yFo6D2K8>lK(S!FUZ#iktXl67wYnpkds1tVLg5o_dgsso~f2c`Tna#T_eBI z)TY*SdUJbCYIFPWy3OsQYd7N^^KtZ{Gh3$M_#U6_6Zi9=BlmhoZi^%L7r@!SMbMtu z-dLB+%bnmSL>ZelhQ8=UhLg4$VHFPVN8x`eb#FVv$nz2SW5@%)Jx$rahM(n+{I^VM z+}zG~lEM4REgQtGjHWV`h+p+PCdwWCz4?$3o| zuU&_5wlj_YtAg;3^WFV&Ye_J&bY{H6dGHdj#82w^ZmciCU?qyZX+3+=iy4yPh&%{7 zZQR*z2YQcQIiZuv&t44+Uj!Y8 z_?0CH!hqEJiB{PO_dZ5&iOp4bwtU`nd%u!gdfbWEUpD5+s+sBo&F~LEvgd?eRD<2~qDan@DwL3@Uq9Ah`=KZ?*vW|J$BtqyW5a+4u}>gIJjSEK5?+KBWB<%AfHQI*QuC)x zAZoTm&UyuC{9>d??_7UYkE@u-#g{`$WQf-TBVe4SWw(8!g{$N48gUQY_><1g(|!zc?# zV!{h4e4+J4d!)&}$ok?vW{`8S^_BPFvHboL>q~e&d2C#@zpDHS9GbP7Pq%{jrEm#y`%h$Vz28UhL_1i%nNwln;%bn0wllke#ovQ3T{p! z_m1+oyV9o^=wBZ*o0VcOFp=0W1V>^6Pzphe8Tdmi!92>HnIschDr~9j0b?esh>eZ`P@7}6+`NuHbM*0}^qkj$( z>Di>C0_cDcJCy+OH!dQ-qD zD!ro)R1rD7DZP$5YBu z%BzlYDbDSn;IvQiSLm)a!dC0X#?7ULtr20$JrU({*S-PPlrS0|6IU26uTNdd;9i?1 z1I_4OVkmSmGPxT@fPE}CEaZm4&R!=Qp>$a5!60(1{-nEyflk$N-K%g%zN?8EHEt&o zIWMzP+Z^^arfAiv#y`&D-*XuPovQKQLYRB6?)QtwZzgdc%ivUx$DC8S_v`*$GyZfo z)&uMUPR)c1JG+$oAag)ZV0(@YqVR=aaSrGrGNYR)<$Rr)^QmM;`Oc^8VNUgN7uK~Z z=MTEV*QBd)mqUbeE3R;xF(^{sRBhU*MPh1%6c*c;Zix&wRFK zisMjzki|Yfi;aQ@gvlgJ7c|*1B|To3G+EaSX1i+Ae?r82sJ;7bhpDTygkyE9T%+5) zN{xG#S+ukLf1|5Ire2V?Iv?nqmYVkel~m`KiKp5%U_8P1zB z2W54CYl?APi*kRb+o1~POrN4we_*y}IXWlS=z3kNg*qo#g~C~C8A^2>OT`;#R}!lhTpC48QD_hBeB4(xj=ugs>Eu z6;bNHIu0{=-IvjuCZpQpb!U3hA+NI}cqTJ?OBc;ydves7iWeg_idFyE6q<6l|F|vm zM)s*!KtoOlrPH+}m`L~X~PnMf}ekb`%o&(NcBQNCvN6&|r1utQK ze=rP7P98(Sf7BG_i>G2X>by>d8LkdvVajl&Y=KU3r4@C7rn|aw%YskxV&=FUN8D?a zDMPONU1aXms%hNm&G|mde72EFiEDgPml~;6S-N7&TwSrnS-N7&TwSqh(*(;+jx}o9 zI~2N)Rc|&zDKNmkD;K=U2(2{8LEIL|)51<&M1T;B8; z?y`GUW3+$Fy_g;0nsGr+Mcf~{dZ<`t?)1l9eP1rgZjIsY+is|(!TszDKa#lMzwr7# zAyQL<|IDlYq$V*WT|?F#5*avQJ!-KW*$1~VvtJq!RY6V&-FFOCJGmEBHb$qjJe~VF zC;t;#cPf;k#)Pl(>DPd|6bn(xXv>@#$15wJ$>O8n+xzA zPhWs)HLaUsxFNQCyAeYXFZsmWnjoexLCkG&F^^Ns3oOmuMhr#l^NIO>f|xrK#N1`Y z%(#gKxrHO8x;})h6uhH0co&wG*Oy@@hSX3b;CQEonr{swzOs?g85_Kwl8TjONN1v_ zgi4wad&T-U!o`u?NX&anH8z%eSs%_U$}R9_Y>3o(Phy{kaBg067<)CedXbQ~IOJuP zct;d8BmgGgkk?^dUr-Z6<^K--bO?|n!k;sg2MOh># zT%HHdDlaXBl7v`_$fle!FFn+p6Pa0Ao|`i}FFYNUDy#4=Dk<5!)JA|U$ zrUOdanr3<3jW~{IhIdqBX>mAQP>+o;D!t55X=#pbytGDeGtE&UuPfw@3VC0rnCX#O zxyX{0Ez1q(B78bBf)X-bxt z+UQM1`6^p)V|%kSd)IC7aA4e7C8d$va8B4et)y)61>xM%yrwsED!p+f-qezmlhI<~ z8EAfQL1W6vr4Z%)Ty5Ct-Mb#`Sy)nVj>_wSCtt-{_1$Gw_4`zE$BU{j!%lUvf9fRYZ9d6VkpEOFbt*}a@sF`m<- zZ4bD;oRDn0+v(+eVcT7*m(Tj>CbyT5*n7@Q@8v_0>G>REJRd%!`8=Tv^XF_2{*45ZL{BrNIz@M{G(i z%a|4<101i-HeiAdXjR7Z9F=UndEIg}PoRqRW1{as%y8lCL;mn0v@Poj zt5Q6M_!1jkVzxqET3r)8E7q;}*60tbK^Why{9#q?9f~tuW5Xo^s_R<1Vnu7}V;$Ws z?QM!P&xH7e?JxstFwBZG$b{JHSXa-gnBpXGnDA(OXS6!j-Q3x}T5(cm3$vhoRYz;A zJEk~cvw?*$KkN3DgwwCM3RB{~ubdeS8!GqUpHSC{!K&j@*1}fg|Lo_B6s4~ z3MSqR>G(C61e#?B;wT^>aW>sPh-<)Q*@WM<_;usA20!cep`#qYJJNPE6g$JkxD4DV z`842i{H(hQJp1sQ3Z5!oxvm1w`{Y9y8xpPpYygl+8j6^KTQ ziff~=FYH{a8r!pHt}MbN7jL>E@gQ=PGn&R7?s>vZqv=!}BwX$6nAi?n@6_X7Xb z?$H-4))}p@t8b2}uI~1ZXk#0&4p+T1*3{O{|N7Rtt}Yd8>FzLj7Dfvzm&`9KN|c_^ z16Qua=IGJZSR;#By&zg#QBymwtSq{qvZA(Vc`c-N_jI;J>lzwR&@Qvf{lQz^ud3@t zu^MEe6YXe*-D7^VQFnD){RNfPMXI~GrHch$RoC@3g|&;G7>jCpBW}C1s^ipxcC=x8 zYjl2Vd;Ql;*%r;KC@d?gjxMZRQc;M#dsojcP`ag~^)Rqhv1ZiUtUfNu4uTCW zUG<$Ut6JLXy4yR4w2K+2bk|1dtL807YTeD3m6tDH;3sgY7=!CJuehwJ5M8P()_GwJ zTMF9LWtH=4ReNJ&7cP;FEr|POsk(Z7x7doZc-66{1-iG3?25|TXmNQ}Sy6crIxe%U zK|iTpP!u%{tgvi~dkvTO^K13vE;YBEzC&1xCFsg=!(V-n1a6QP77`1G`sUO##&NbQHy^6g{+rN$JeTv_2@fo z+B86J*7~~ER@^qRH65|~?pQ;#uCW`#P5eI6mv-sGs(7K6wRbis88`IRtt>?xMi8`m zQSn(7(W2!GimG&{UodaUS&M2pSfL-96EhO(Dfgo(NIZiYj&Tdy;@u!$t*qAJ7 zy4ih=GBaQG)US+>d?+isWKA^T=Hxi0coQcM1-!yIHv-S=u2@}XeX}0K%?++iI?yR` z2gIUn?QLL$NB5+zSZgE9Bci6~&df7S$_v-Cdd~2-a73-d=!|12Vx4WKxj4`kS1gJ5 zQ+wCO+OQ!DiodkDx^~IDvV?w=Fvf7mmysskO$TrFYV&w8Ll&-XH%H%=wrFQvTN9om z81))-KOAbr=2OLv*+c~RY#r1BAb?2Mzp0Bg9clS(% z4;K^^PlMqZqkm^hQ*$>SoH7_7c@&Q``#d#CFha|SSG1@$x(J3vFza89?kLYO))Fk} zin>dhwwPyzkiWh84ee+COcR{H)_Ezq4|FN9+W*T~;A1%pQzOpmFj>~F0RR3ep`9pB zM7VFJrUG9wdj|16gXzhKnVULMXuJ|>7ql-GLX($n27cr}93S81Y#MkK*zY5a6%J+o;F;n4Yp8Yy(@5YWQs$cvTtZ&d1xr`r<0!_se@`o~ak* zv3^z_zoSx~EqV(Z-sfyys}Kf%d_T8V@bTTx#@p-Bf-rx+FU^CFH^P`NXTmn$i{ZCv z;Z<2d)WsG8w3W98e!sj;XwVf%NO^2VD{l+@etFH4l`8fHSnm}>#V$+5#TT1KFG^N7|X{moVI-awnDIa4f6Ww5ohH+0h)gHFS-Y(qMgwX ztYaL1F9_Q3x}4!{j(!FP57*7|eFuD#ECICnvaH~XyGOt`5T^$D$nU#M>fSu1cA%2u z5l$Nv)|d5XoA~9m&Q|I=UqYKN*bXXTML&d9&Xl8}#P(I0{R{QG_Jh42Sa z41YXn7hruP&j+oFbBk?V#B{o4x9T3wzR52d}blLo>N7u{E*!9<0b=yUaCp z(eAY!v8Y}elYk-b*b=%j)`S-_yI777^!|XM>AA+zpz@y<&+M z3-$_5MOYR-JFg%j-5Q}ew!2?}brKOb*$U$6SY{<+0?nONooX3fQpDa3hr zwqPtLQm2miF%j`u7<04cqr8|nWGymdu3L;}7sd*=1Zs7}QZpBJAtN32JEVOqR+aUa zbl_z20doZx3N990E*KTOKya-fpLa~ZS@2te*9cxG$ax_7?ht%L@JE9GBFK3g`CbwH zh2YzQ?+Jb=$d7E~=b3y&j?css1!oG*6RZ@}$B}@qMQD!0Ot(RBtKcny_X_?{@Rx#r z5ag0O)9d{}f%Amc`+Q*7xBjMD#WjH@!5WgkiypJgNdxAd@d{R&=u^|4}q>=8w z1b;8_Nx1Kr{v^RXBKT$ro+jbNf=dPK1v><{2vVh&>Axe`C*fL=4f(t(^iGNYH^EON zT;cv_dd}U5X+)$OC#W?{LFWryLBzX9jnH+1-x9n*;_nsuMZq_SkpGt8uO&PUFMZ7K zI3nUF3Qm^rJi#*s%LUIB>=E23c$?sTM96zk@KFhWPVjZX0m1(wg8vi242*{?*Re!| z!$3=8wuGN9xKwbZ#5W4AlJIW`ULkm$;P(U{BBDLHmmBkYPVjZX_XIy8q8z^y{G)`Y z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a9/gnu/readme_threadx.txt b/ports/cortex_a9/gnu/readme_threadx.txt new file mode 100644 index 00000000..684e996f --- /dev/null +++ b/ports/cortex_a9/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A9 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A9 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a9 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a9 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a9 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a9 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A9 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a9/gnu/src/tx_thread_context_restore.S b/ports/cortex_a9/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..3e85f010 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_context_save.S b/ports/cortex_a9/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..59370609 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..2aa3606b --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..970ddfd0 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..a9e545bc --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..85bbbb41 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..54557d55 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..3f6b5de5 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..b4469688 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..955667ca --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..65a24d7f --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_schedule.S b/ports/cortex_a9/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..78d18a2e --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a9/gnu/src/tx_thread_stack_build.S b/ports/cortex_a9/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..e4724f6e --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_system_return.S b/ports/cortex_a9/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..c7123974 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..7c588776 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a9/gnu/src/tx_timer_interrupt.S b/ports/cortex_a9/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..00512a4d --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a9/iar/example_build/azure_rtos.eww b/ports/cortex_a9/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a9/iar/example_build/cstartup.s b/ports/cortex_a9/iar/example_build/cstartup.s new file mode 100644 index 00000000..647de2e8 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/cstartup.s @@ -0,0 +1,156 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #0x40000000 ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.c b/ports/cortex_a9/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c7c300cb --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.dep b/ports/cortex_a9/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..714728f2 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.dep @@ -0,0 +1,220 @@ + + + 4 + 512928594 + + Debug + + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\sample_threadx.c + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\TX_ILL.s79 + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\lib\m7Sx_tlv.a + $TOOLKIT_DIR$\inc\DLib_Threads.h + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\inc\DLib_Product.h + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + $TOOLKIT_DIR$\inc\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\tx_cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + + + [ROOT_NODE] + + + ILINK + 15 40 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 11 19 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 43 + + + __cstat + 55 + + + BICOMP + 50 + + + + + ICCARM + 57 56 21 5 35 53 45 46 41 32 20 51 49 59 58 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 2 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 29 + + + + + ICCARM + 0 1 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 42 16 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 40 + + + + + ILINK + 27 42 43 12 11 37 36 23 31 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 11 19 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 47 + + + BICOMP + 39 + + + + + ICCARM + 0 1 14 38 33 18 25 30 6 24 26 8 22 48 + + + BICOMP + 0 1 14 38 33 18 30 6 24 26 8 22 48 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 17 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 42 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.ewd b/ports/cortex_a9/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..9cfde331 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.ewp b/ports/cortex_a9/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..cdcbc403 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2136 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_api.h + + + $PROJ_DIR$\tx_initialize_low_level.s + + + $PROJ_DIR$\tx_port.h + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.ewt b/ports/cortex_a9/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..a30fa4d3 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2797 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_api.h + + + $PROJ_DIR$\tx_initialize_low_level.s + + + $PROJ_DIR$\tx_port.h + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.icf b/ports/cortex_a9/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..b0ed62eb --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 248 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0100000009002596000002000000108600001F0000000C8100000E000000048600000200000017810000070000000E81000001000000118600001F0000004681000003000000E880000004000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 00000000B4040000000A000065050000 + 000000009D040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000004001000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF400100003200000044010000990400000100000002000010040000000100000070FFFFFFD0080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E65008000000100000000000000B4040000000A000065050000000000009D040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..94aadadb --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..63278961 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..a969962f --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A9" + +"--fpu=VFPv3Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..1f2b1698 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a9/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..cd1843d2 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1397 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 139 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 5300000009002596000002000000108600001F0000000C8100000E000000048600000200000017810000070000000E81000007000000118600001F0000004681000003000000E880000004000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 2800578600001800000059920000240000001581000055000000239200000000000007E100006B00000004E10000690000000786000028000000008D00001E0000001D920000110000000D8000004700000001E100006600000004860000250000009A860000160000001781000057000000008400007800000025920000190000001481000054000000449200002200000000810000490000001A860000320000001F9200001F00000003E100006800000006860000270000008E8600003B0000002D9200002100000000E1000065000000698600003800000041E10000750000005586000006000000239600008900000016810000560000000E86000017000000518400008600000005E100006A000000C386000003000000A18600003C00000002E10000670000000586000026000000C08600000A0000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 04000000E0020000DB0500005E030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + D904000032000000DF050000C4020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 1 + 1 + + Disassembly + _I0 + + + 500 + 20 + + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A00000002010000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000D5040000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000D504000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + 210800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFF1D0800004C000000210800009A04000001000000020000100400000001000000C3F8FFFF5F010000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000D504000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000D504000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFFD504000032000000D9040000C4020000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000000062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..f612528c --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,100 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 79500869 + + + 0 + 0 + 0 + + + 1 + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..a969962f --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A9" + +"--fpu=VFPv3Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.crun b/ports/cortex_a9/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.dbgdt b/ports/cortex_a9/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.dnx b/ports/cortex_a9/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a9/iar/example_build/tx.dep b/ports/cortex_a9/iar/example_build/tx.dep new file mode 100644 index 00000000..a1dc2578 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.dep @@ -0,0 +1,9593 @@ + + + 4 + 607583892 + + Debug + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Tx_bytd.c + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Txe_bpp.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Tx_efcle.c + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Txe_sp.c + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\Debug\Obj\tx_misra.o + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 560 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 585 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 633 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 141 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 618 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 592 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 328 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 611 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 645 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 174 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 448 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 752 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 455 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 490 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 454 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 755 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 580 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 570 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 663 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 641 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 715 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 465 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 159 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 502 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 576 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 656 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 725 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 793 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 318 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 487 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 545 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 136 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 629 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 598 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 759 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 722 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 605 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 604 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 599 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 670 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 439 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 527 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 480 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 631 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 531 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 653 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 689 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 468 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 150 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 624 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 113 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 682 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 600 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 528 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 323 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 621 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 552 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 635 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 555 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 602 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 547 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 912 + + + + + [ROOT_NODE] + + + IARCHIVE + 678 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 516 + + + BICOMP + 462 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 70 + + + BICOMP + 218 720 223 524 726 62 70 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 509 + + + BICOMP + 386 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 70 + + + BICOMP + 70 524 726 269 720 62 223 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 445 + + + BICOMP + 703 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 70 + + + BICOMP + 70 524 726 269 720 62 223 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 321 + + + BICOMP + 463 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 720 70 524 726 62 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 677 + + + BICOMP + 782 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 76 + + + BICOMP + 524 735 507 269 726 521 529 62 76 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 775 + + + BICOMP + 305 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 70 + + + BICOMP + 218 720 223 524 726 62 70 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 538 + + + BICOMP + 730 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 726 529 524 521 76 735 507 62 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 566 + + + BICOMP + 478 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 720 70 524 726 62 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 129 + + + BICOMP + 168 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 720 70 524 726 62 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 152 + + + BICOMP + 127 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 70 + + + BICOMP + 70 524 726 269 720 62 223 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 637 + + + BICOMP + 808 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 76 + + + BICOMP + 726 529 524 218 521 223 735 507 62 76 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 721 + + + BICOMP + 418 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 70 + + + BICOMP + 524 726 269 720 62 70 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 779 + + + BICOMP + 769 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 76 + + + BICOMP + 726 529 524 218 521 223 735 507 62 76 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 790 + + + BICOMP + 133 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 70 + + + BICOMP + 524 726 269 720 62 70 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 313 + + + BICOMP + 517 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 76 + + + BICOMP + 524 735 507 269 726 521 529 62 76 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 563 + + + BICOMP + 121 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 76 + + + BICOMP + 524 76 735 507 269 726 521 529 62 223 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 792 + + + BICOMP + 535 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 524 529 440 97 456 567 62 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 457 + + + BICOMP + 639 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 97 + + + BICOMP + 524 529 440 223 456 567 62 97 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 626 + + + BICOMP + 515 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 726 529 524 521 76 735 507 62 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 128 + + + BICOMP + 508 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 76 + + + BICOMP + 726 529 524 521 223 218 735 507 62 76 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 642 + + + BICOMP + 691 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 100 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 472 + + + BICOMP + 170 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 100 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 402 + + + BICOMP + 593 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 76 + + + BICOMP + 524 76 735 507 269 218 726 521 529 62 223 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 447 + + + BICOMP + 764 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 522 + + + BICOMP + 719 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 97 + + + BICOMP + 97 456 567 269 524 440 529 62 223 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 142 + + + BICOMP + 138 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 100 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 330 + + + BICOMP + 116 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 726 529 524 521 76 735 507 62 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 607 + + + BICOMP + 322 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 524 529 440 97 456 567 62 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 601 + + + BICOMP + 397 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 524 529 440 97 456 567 62 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 394 + + + BICOMP + 137 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 94 223 256 207 210 97 100 70 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 94 223 256 207 210 97 100 70 76 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 745 + + + BICOMP + 143 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 97 + + + BICOMP + 218 456 567 269 524 440 529 62 97 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 380 + + + BICOMP + 396 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 424 + + + BICOMP + 497 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 488 + + + BICOMP + 164 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 97 + + + BICOMP + 218 456 567 269 524 440 529 62 97 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + BICOMP + 753 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 688 + + + BICOMP + 173 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 76 + + + BICOMP + 524 76 735 507 269 726 521 529 62 223 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 634 + + + BICOMP + 162 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 684 + + + BICOMP + 370 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 743 + + + BICOMP + 489 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 269 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 269 100 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 785 + + + BICOMP + 695 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 398 + + + BICOMP + 493 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 97 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 628 + + + BICOMP + 147 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 97 + + + BICOMP + 218 97 456 567 269 524 440 529 62 223 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 584 + + + BICOMP + 413 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 97 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 650 + + + BICOMP + 581 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 62 218 406 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 62 218 558 533 498 406 800 710 475 780 739 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 62 218 739 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 166 + + + BICOMP + 805 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 661 + + + BICOMP + 646 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 513 + + + BICOMP + 559 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 416 + + + BICOMP + 148 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 94 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 94 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 655 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 797 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 636 + + + BICOMP + 451 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 379 + + + BICOMP + 596 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 696 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 408 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 144 + + + BICOMP + 432 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 589 + + + BICOMP + 683 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 436 + + + BICOMP + 442 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 486 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 511 + + + BICOMP + 464 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 94 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 94 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 758 + + + BICOMP + 595 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 431 + + + BICOMP + 461 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 649 + + + BICOMP + 597 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 733 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 763 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 822 + + + BICOMP + 708 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 765 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 757 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 704 + + + BICOMP + 582 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 526 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 548 + + + BICOMP + 679 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 786 + + + BICOMP + 382 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 578 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 519 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 809 + + + BICOMP + 415 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 134 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 474 + + + BICOMP + 588 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 429 + + + BICOMP + 564 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 787 + + + BICOMP + 741 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 438 + + + BICOMP + 320 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 627 + + + BICOMP + 466 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 310 + + + BICOMP + 369 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 702 + + + BICOMP + 778 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 434 + + + BICOMP + 700 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 207 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 666 + + + BICOMP + 501 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 319 + + + BICOMP + 806 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 706 + + + BICOMP + 795 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 207 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 762 + + + BICOMP + 496 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 617 + + + BICOMP + 623 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 731 + + + BICOMP + 727 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 207 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 699 + + + BICOMP + 606 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 207 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 562 + + + BICOMP + 783 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 100 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 443 + + + BICOMP + 686 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 804 + + + BICOMP + 510 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 311 + + + BICOMP + 534 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 546 + + + BICOMP + 744 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 324 + + + BICOMP + 171 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 301 + + + BICOMP + 512 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 541 + + + BICOMP + 543 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 210 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 139 + + + BICOMP + 118 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 210 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 385 + + + BICOMP + 375 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 210 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 620 + + + BICOMP + 815 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 754 + + + BICOMP + 409 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 132 + + + BICOMP + 813 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 210 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 609 + + + BICOMP + 814 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 439 + + + BICOMP + 530 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 468 + + + BICOMP + 417 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 670 + + + BICOMP + 373 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 527 + + + BICOMP + 441 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 673 + + + BICOMP + 644 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 680 + + + BICOMP + 788 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 632 + + + BICOMP + 692 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 569 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 772 + + + BICOMP + 383 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 223 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 160 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 427 + + + BICOMP + 667 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 481 + + + BICOMP + 750 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 781 + + + BICOMP + 565 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 123 + + + BICOMP + 694 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 643 + + + BICOMP + 575 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 223 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 657 + + + BICOMP + 773 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 556 + + + BICOMP + 789 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 452 + + + BICOMP + 572 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 125 + + + BICOMP + 819 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 761 + + + BICOMP + 751 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 539 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 777 + + + BICOMP + 470 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 471 + + + BICOMP + 316 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 114 + + + BICOMP + 709 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 514 + + + BICOMP + 717 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 689 + + + BICOMP + 172 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 140 + + + BICOMP + 579 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 723 + + + BICOMP + 651 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 269 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 555 + + + BICOMP + 423 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 725 + + + BICOMP + 768 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 100 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 576 + + + BICOMP + 591 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 624 + + + BICOMP + 444 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 531 + + + BICOMP + 716 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 759 + + + BICOMP + 476 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 722 + + + BICOMP + 163 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 70 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 480 + + + BICOMP + 115 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 631 + + + BICOMP + 738 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 629 + + + BICOMP + 551 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 70 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 547 + + + BICOMP + 145 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 70 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 605 + + + BICOMP + 610 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 70 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 552 + + + BICOMP + 167 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 70 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 682 + + + BICOMP + 154 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 76 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 600 + + + BICOMP + 536 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 76 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 598 + + + BICOMP + 659 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 621 + + + BICOMP + 812 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 97 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 602 + + + BICOMP + 412 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 97 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 645 + + + BICOMP + 603 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 100 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 641 + + + BICOMP + 784 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 97 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 599 + + + BICOMP + 302 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 528 + + + BICOMP + 701 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 76 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 150 + + + BICOMP + 532 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 70 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 653 + + + BICOMP + 332 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 76 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 323 + + + BICOMP + 303 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 76 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 635 + + + BICOMP + 554 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 97 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 580 + + + BICOMP + 713 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 100 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 113 + + + BICOMP + 590 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 136 + + + BICOMP + 712 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 97 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 604 + + + BICOMP + 525 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 76 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 545 + + + BICOMP + 505 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 97 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 770 + + + BICOMP + 307 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 421 + + + BICOMP + 756 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 817 + + + BICOMP + 740 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 62 218 475 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 776 + + + BICOMP + 518 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 766 + + + BICOMP + 749 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 802 + + + BICOMP + 404 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 419 + + + BICOMP + 500 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 656 + + + BICOMP + 669 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 592 + + + BICOMP + 499 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 490 + + + BICOMP + 557 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 318 + + + BICOMP + 126 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 458 + + + BICOMP + 428 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 502 + + + BICOMP + 473 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 618 + + + BICOMP + 681 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 625 + + + BICOMP + 537 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 449 + + + BICOMP + 613 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 487 + + + BICOMP + 687 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 752 + + + BICOMP + 482 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 560 + + + BICOMP + 561 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 100 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 570 + + + BICOMP + 807 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 174 + + + BICOMP + 796 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 793 + + + BICOMP + 131 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 207 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 455 + + + BICOMP + 430 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 585 + + + BICOMP + 811 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 633 + + + BICOMP + 492 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 715 + + + BICOMP + 685 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 256 223 210 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 663 + + + BICOMP + 771 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 159 + + + BICOMP + 737 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 328 + + + BICOMP + 647 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 207 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 454 + + + BICOMP + 615 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + BICOMP + 729 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 448 + + + BICOMP + 390 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 465 + + + BICOMP + 616 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 374 + + + BICOMP + 460 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 384 + + + BICOMP + 728 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 611 + + + BICOMP + 652 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 141 + + + BICOMP + 711 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 755 + + + BICOMP + 577 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 207 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 62 218 558 533 498 710 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 62 218 533 710 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 62 218 533 710 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 62 218 780 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 62 218 710 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 62 218 558 533 498 800 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 62 218 533 558 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 62 218 475 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 62 218 800 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 62 218 533 498 558 739 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 62 218 780 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 62 218 558 533 498 475 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 62 218 710 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 62 218 498 533 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 62 218 558 533 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 62 218 558 533 498 475 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 62 218 558 533 498 780 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 62 218 558 533 498 406 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 62 218 800 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 62 218 498 533 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 62 218 558 533 498 780 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 62 218 739 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 62 218 558 533 498 780 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 62 218 558 533 498 710 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 62 218 558 533 498 739 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 775 516 721 152 790 566 321 129 509 445 637 779 313 563 677 538 626 330 688 128 402 457 488 522 628 745 607 792 601 398 584 142 394 380 424 852 642 743 650 634 472 447 803 684 785 562 301 541 385 443 620 310 132 311 627 787 546 754 324 139 429 434 699 438 702 706 666 804 319 762 617 731 757 733 416 636 704 763 696 486 765 379 822 589 655 526 578 797 408 431 144 513 548 436 786 511 519 166 809 758 134 474 649 661 556 643 539 772 114 723 781 673 160 123 761 657 452 427 609 680 125 632 140 777 569 481 471 514 689 555 439 670 468 527 531 598 480 759 624 599 113 631 629 547 722 605 552 150 682 528 604 653 600 323 621 635 602 545 136 641 580 725 645 576 611 560 715 570 174 159 592 448 490 487 454 752 755 328 793 141 455 502 549 585 656 318 633 663 465 618 625 458 449 374 384 766 770 776 802 419 421 817 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 62 218 800 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 62 218 533 558 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 62 218 475 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 62 218 406 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 62 218 498 533 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 62 218 558 533 498 739 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 817 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 776 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 419 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 802 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 625 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 458 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 449 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 766 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 421 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 384 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 770 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 374 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 519 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 486 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 569 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 526 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 733 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 765 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 757 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 797 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 655 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 408 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 539 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 578 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 763 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 160 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 142 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 894 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 696 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 134 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 743 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 902 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 457 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 398 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 584 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 745 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 394 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 904 898 896 901 914 899 894 912 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 642 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 792 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 607 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 424 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 650 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 472 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 447 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 785 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 634 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 684 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 402 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 601 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 380 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 488 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 301 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 385 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 628 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 541 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 443 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 522 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 852 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 562 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 128 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 688 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 637 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 677 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 566 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 779 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 538 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 626 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 152 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 330 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 790 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 516 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 721 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 321 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 129 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 509 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 445 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 313 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 563 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 775 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 511 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 904 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 556 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 809 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 643 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 114 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 609 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 125 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 471 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 548 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 123 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 632 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 140 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 758 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 166 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 657 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 514 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 786 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 649 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 661 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 772 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 474 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 723 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 761 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 452 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 673 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 427 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 680 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 777 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 781 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 481 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 436 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 617 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 513 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 416 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 904 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 666 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 139 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 434 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 731 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 706 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 546 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 438 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 699 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 636 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 620 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 311 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 627 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 804 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 704 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 822 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 319 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 702 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 589 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 431 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 429 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 787 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 762 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 132 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 379 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 310 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 754 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 144 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 324 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a9/iar/example_build/tx.ewd b/ports/cortex_a9/iar/example_build/tx.ewd new file mode 100644 index 00000000..897111f4 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a9/iar/example_build/tx.ewp b/ports/cortex_a9/iar/example_build/tx.ewp new file mode 100644 index 00000000..c5732045 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.ewp @@ -0,0 +1,2766 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a9/iar/example_build/tx.ewt b/ports/cortex_a9/iar/example_build/tx.ewt new file mode 100644 index 00000000..2149bed8 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.ewt @@ -0,0 +1,3427 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a9/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a9/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..e9a16771 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a9/iar/inc/tx_port.h b/ports/cortex_a9/iar/inc/tx_port.h new file mode 100644 index 00000000..4d6d1537 --- /dev/null +++ b/ports/cortex_a9/iar/inc/tx_port.h @@ -0,0 +1,398 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A9/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_a9/iar/readme_threadx.txt b/ports/cortex_a9/iar/readme_threadx.txt new file mode 100644 index 00000000..f2221ee0 --- /dev/null +++ b/ports/cortex_a9/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A9 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A9 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A9 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A9 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A9 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A9 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A9 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a9/iar/src/tx_iar.c b/ports/cortex_a9/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a9/iar/src/tx_thread_context_restore.s b/ports/cortex_a9/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..fbdffc78 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_context_save.s b/ports/cortex_a9/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..63f4792a --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..566dcd15 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,270 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..c60ea9a4 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..15350c38 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..75cb6a98 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a9/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..4ad92728 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..31680cbb --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..78eeeb68 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..cb0976d2 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..512ef7f2 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_schedule.s b/ports/cortex_a9/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..4c8eabbf --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_schedule.s @@ -0,0 +1,240 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts +#else + CPSID i ; Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts +#else + CPSID i ; Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_stack_build.s b/ports/cortex_a9/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..04876d27 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_system_return.s b/ports/cortex_a9/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..2e4e661d --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_system_return.s @@ -0,0 +1,166 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts +#else + CPSID i ; Disable IRQ interrupts +#endif +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..54bf3ea3 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a9/iar/src/tx_timer_interrupt.s b/ports/cortex_a9/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..629a76c5 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_m0/ac5/example_build/build_threadx.bat b/ports/cortex_m0/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..8018092d --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m0 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_search.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_set.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_initialize_high_level.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_priority_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_flush.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_front_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_receive.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_send_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_identify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_preemption_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_priority_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_relinquish.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_reset.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_resume.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_shell_entry.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_sleep.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_suspend.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_system_resume.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_system_suspend.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_terminate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_time_slice.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_timeout.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_wait_abort.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_time_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_time_set.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_activate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_deactivate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_expiration_process.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_system_activate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_thread_entry.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_enable.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_event_filter.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_disable.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_object_register.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_object_unregister.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_set.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_flush.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_front_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_receive.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_send_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_preemption_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_priority_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_relinquish.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_reset.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_resume.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_suspend.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_terminate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_wait_abort.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_activate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_deactivate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m0/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m0/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..a213bc79 --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m0 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m0/ac5/example_build/sample_threadx.c b/ports/cortex_m0/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..4d95c2ed --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..61c57b5f --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,284 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + LDR R0, =__main + BX R0 + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADDS r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + LDR r0, =0xE000ED08 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; MOVS r2, #1 +; ORRS r1, r1, r2 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD08 ; Offset to vector base register + ADD r0, r0, r2 ; Build vector base register + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOVS r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD18 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD1C ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD20 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + STACK_SIZE) + LDR R2, =(HeapMem + HEAP_SIZE) + LDR R3, =StackMem + BX LR +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, r1} + MOV lr, r1 + BX lr +; } + + EXPORT SysTick_Handler + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +SysTick_Handler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, r1} + MOV lr, r1 + BX lr +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + + diff --git a/ports/cortex_m0/ac5/inc/tx_port.h b/ports/cortex_m0/ac5/inc/tx_port.h new file mode 100644 index 00000000..31bb6d4d --- /dev/null +++ b/ports/cortex_m0/ac5/inc/tx_port.h @@ -0,0 +1,335 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M0/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M0 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M0/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m0/ac5/readme_threadx.txt b/ports/cortex_m0/ac5/readme_threadx.txt new file mode 100644 index 00000000..fb2f95c3 --- /dev/null +++ b/ports/cortex_m0/ac5/readme_threadx.txt @@ -0,0 +1,143 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M0 + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +development environment. At this point you may run the build_threadx.bat batch +file. This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M0 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M0 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r8 + 0x04 r9 + 0x08 r10 + 0x0C r11 + 0x10 r4 + 0x14 r5 + 0x18 r6 + 0x1C r7 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M0 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M0 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, r1} + MOV lr, r1 + BX lr + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M0 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m0/ac5/src/tx_thread_context_restore.s b/ports/cortex_m0/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..4ef66308 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Preemption has already been addressed - just return! */ +; + POP {r0} + MOV lr, r0 + BX lr +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_context_save.s b/ports/cortex_m0/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..52fd2828 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_context_save.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, r1} ; Recover ISR lr + MOV lr, r1 + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..7b360417 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b28496d6 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..29d0f590 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m0/ac5/src/tx_thread_schedule.s b/ports/cortex_m0/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..abcb7c2c --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_schedule.s @@ -0,0 +1,278 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M0 +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOVS r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load ICSR address + STR r0, [r1] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switch-out switch-in handler... Note that this handler is +; common for both PendSV and SVCall. */ +; + EXPORT PendSV_Handler + EXPORT __tx_PendSVHandler +PendSV_Handler +__tx_PendSVHandler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, r1} ; Recover LR + MOV lr, r1 ; + CPSIE i ; Enable interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + MOVS r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CMP r1,#0 ; If NULL, skip preservation + BEQ __tx_ts_new ; +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r3, PSP ; Pickup PSP pointer (thread's stack pointer) + SUBS r3, r3, #16 ; Allocate stack space + STM r3!, {r4-r7} ; Save its remaining registers (M3 Instruction: STMDB r12!, {r4-r11}) + MOV r4,r8 ; + MOV r5,r9 ; + MOV r6,r10 ; + MOV r7,r11 ; + SUBS r3, r3, #32 ; Allocate stack space + STM r3!, {r4-r7} ; + SUBS r3, r3, #20 ; Allocate stack space + MOV r5, LR ; + STR r5, [r3] ; Save LR on the stack + STR r3, [r1, #8] ; Save its stack pointer +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r4] ; Pickup current time-slice + CMP r5, #0 ; If not active, skip processing + BEQ __tx_ts_new ; +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + MOVS r5, #0 ; Build clear value + STR r5, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CMP r1, #0 ; + BEQ __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADDS r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r0/r1 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r3, [r1, #8] ; Pickup thread's stack pointer + LDR r5, [r3] ; Recover saved LR + ADDS r3, r3, #4 ; Position past LR + MOV lr, r5 ; Restore LR + LDM r3!,{r4-r7} ; Recover thread's registers (r4-r11) + MOV r11,r7 ; + MOV r10,r6 ; + MOV r9,r5 ; + MOV r8,r4 ; + LDM r3!,{r4-r7} ; + MSR PSP, r3 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CMP r1, #0 ; If non-NULL, a new thread is ready! + BNE __tx_ts_ready ; + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF +__tx_ts_ISB + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + LDR r7, =0x08000000 ; Build clear PendSV value + LDR r5, =0xE000ED04 ; Build base NVIC address + STR r7, [r5] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_stack_build.s b/ports/cortex_m0/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..524eb9f5 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,146 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M0 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + MOVS r3, #0x7 ; + BICS r2, r2, r3 ; Align frame for 8-byte alignment + SUBS r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOVS r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r8 + STR r3, [r2, #8] ; Store initial r9 + STR r3, [r2, #12] ; Store initial r10 + STR r3, [r2, #16] ; Store initial r11 + STR r3, [r2, #20] ; Store initial r4 + STR r3, [r2, #24] ; Store initial r5 + STR r3, [r2, #28] ; Store initial r6 + STR r3, [r2, #32] ; Store initial r7 +; +; /* Hardware stack follows. */ +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + LDR r3, =0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + LDR r3, =0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_system_return.s b/ports/cortex_m0/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..a1e11054 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_system_return.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load NVIC base + STR r0, [r1] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller + NOP +;} + END + diff --git a/ports/cortex_m0/ac5/src/tx_timer_interrupt.s b/ports/cortex_m0/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d5844d9c --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,274 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_preempt_disable +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADDS r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUBS r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOVS r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOVS r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADDS r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + PUSH {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); +; + BL _tx_thread_time_slice ; Call time-slice processing + LDR r0, =_tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CMP r1, #0 ; + BNE __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + LDR r0, =0xE000ED04 ; Build address of control register + LDR r2, =0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + POP {r0, r1} ; Recover lr register (r0 is just there for + MOV lr, r1 ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/gnu/example_build/build_threadx.bat b/ports/cortex_m0/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..c74b194e --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m0/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m0/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..96c754d5 --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb tx_vectors.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb cortexm0_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m0 -ereset_handler -T sample_threadx.ld tx_vectors.o cortexm0_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m0/gnu/example_build/cortexm0_crt0.s b/ports/cortex_m0/gnu/example_build/cortexm0_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/cortexm0_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m0/gnu/example_build/libgcc.a b/ports/cortex_m0/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..cdfd02e3dbeea78899091901afa5c2fba7c0ddfa GIT binary patch literal 1551842 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%0D}YP&K(hZs1Db1;{G{zL_9zMUiJsM-Q$jk3iWRR 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≪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 __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m0/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m0/gnu/example_build/tx_initialize_low_level.S old mode 100755 new mode 100644 similarity index 100% rename from ports/cortex_m0/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m0/gnu/example_build/tx_initialize_low_level.S diff --git a/ports/cortex_m0/gnu/src/tx_vector_table_sample.S b/ports/cortex_m0/gnu/example_build/tx_vectors.s similarity index 100% rename from ports/cortex_m0/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m0/gnu/example_build/tx_vectors.s diff --git a/ports/cortex_m0/gnu/readme_threadx.txt b/ports/cortex_m0/gnu/readme_threadx.txt new file mode 100644 index 00000000..3dd7fbf1 --- /dev/null +++ b/ports/cortex_m0/gnu/readme_threadx.txt @@ -0,0 +1,155 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M0 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M0 + +The ThreadX demonstration is designed to execute on Cortex-M0 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M0 using gnu tools uses the standard GNU +Cortex-M0 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M0 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r8 + 0x04 r9 + 0x08 r10 + 0x0C r11 + 0x10 r4 + 0x14 r5 + 0x18 r6 + 0x1C r7 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M0 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M0 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +ISRs can be written completely in C (or assembly language) without any calls to +_tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed access to the +ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + + .global your_assembly_isr + .thumb_func +your_assembly_isr: +; VOID your_assembly_isr(VOID) +; { + PUSH {r0, lr} +; +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, r1} + MOV lr, r1 + BX lr +; } + + +Note: the Cortex-M0 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M0 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m0/gnu/src/tx_thread_stack_build.S b/ports/cortex_m0/gnu/src/tx_thread_stack_build.S index ca66e1d5..85dbba6f 100755 --- a/ports/cortex_m0/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m0/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M0/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -85,14 +90,14 @@ _tx_thread_stack_build: @ @ Stack Top: @ LR Interrupted LR (LR at time of PENDSV) +@ r8 Initial value for r8 +@ r9 Initial value for r9 +@ r10 Initial value for r10 +@ r11 Initial value for r11 @ r4 Initial value for r4 @ r5 Initial value for r5 @ r6 Initial value for r6 @ r7 Initial value for r7 -@ r8 Initial value for r8 -@ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) -@ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @ r2 Initial value for r2 @@ -114,16 +119,14 @@ _tx_thread_stack_build: @ /* Actually build the stack frame. */ @ MOVS r3, #0 @ Build initial register value - STR r3, [r2, #4] @ Store initial r4 - STR r3, [r2, #8] @ Store initial r5 - STR r3, [r2, #12] @ Store initial r6 - STR r3, [r2, #16] @ Store initial r7 - STR r3, [r2, #20] @ Store initial r8 - STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOVS r3, #0 @ Build initial register value - STR r3, [r2, #32] @ Store initial r11 + STR r3, [r2, #4] @ Store initial r8 + STR r3, [r2, #8] @ Store initial r9 + STR r3, [r2, #12] @ Store initial r10 + STR r3, [r2, #16] @ Store initial r11 + STR r3, [r2, #20] @ Store initial r4 + STR r3, [r2, #24] @ Store initial r5 + STR r3, [r2, #28] @ Store initial r6 + STR r3, [r2, #32] @ Store initial r7 @ @ /* Hardware stack follows. */ @ diff --git a/ports/cortex_m0/iar/example_build/azure_rtos.eww b/ports/cortex_m0/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m0/iar/example_build/cstartup_M.s b/ports/cortex_m0/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..a498443c --- /dev/null +++ b/ports/cortex_m0/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(2) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + LDR r0, =__iar_program_start + BX r0 + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.c b/ports/cortex_m0/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..95ff3a47 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.c @@ -0,0 +1,385 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define event buffer. */ + +#ifdef TX_ENABLE_EVENT_TRACE +UCHAR trace_buffer[0x10000]; +#endif + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer; + + +#ifdef TX_ENABLE_EVENT_TRACE + tx_trace_enable(trace_buffer, sizeof(trace_buffer), 32); +#endif + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.dep b/ports/cortex_m0/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..1b9970a4 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.dep @@ -0,0 +1,118 @@ + + + 4 + 90173316 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\tx_initialize_low_level.s + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\lib\rt6M_tl.a + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\lib\dl6M_tln.a + $TOOLKIT_DIR$\lib\m6M_tl.a + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + + + [ROOT_NODE] + + + ILINK + 7 21 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 10 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 13 + + + __cstat + 16 + + + BICOMP + 31 + + + + + ICCARM + 19 24 25 27 20 26 4 22 28 8 23 14 11 12 17 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 6 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 21 + + + + + ILINK + 15 10 13 5 6 18 9 30 29 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.ewd b/ports/cortex_m0/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..8f258489 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.ewp b/ports/cortex_m0/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..a1aaca18 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2127 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.ewt b/ports/cortex_m0/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..24445b46 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.icf b/ports/cortex_m0/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..6e644f92 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.icf @@ -0,0 +1,33 @@ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..40cac5c7 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 310 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 01000000100040E100000100000013860000D0000000259600000100000010860000830000000C810000120000000486000001000000249600000100000017810000010000000E8100000100000003E100000F0000000B81000001000000118600003400000046810000090000000D810000030000000886000001000000E880000002000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000038040000000A000065050000 + 0000000021040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000007E0100001D040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF7E01000032000000820100001D0400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000001D040000000A000021040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000038040000000A0000650500000000000021040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..4fed2f46 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..1fadebf4 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..a7aa9bbc --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M0" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..aa4f02d3 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m0/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..26d198e0 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1940 @@ + + + + + + + 3 + 0 + 0 + + + 20 + 1725 + + + 20 + 1293 + 345 + 86 + + 3 + 0 + 0 + + + Debug-Log + + + + + + + 504 + 27 + 27 + 27 + + + 1 + 0 + 0 + + + SourceBrowser + + + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + Disassembly + _I0 + + + 500 + 20 + + + 0 + 0 + + + + + + + + 187 + 100 + 100 + 100 + + + + 1 + 0 + 0 + + + Workspace + + + + + + + 3 + 0 + 0 + + + 1 + 0 + + + + 3 + 0 + 0 + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + + + + + + + + TabID-5317-31676 + Register + Register + + 0 + 0 + 0 + 2 + EPSR + IPSR + + + + 0 + + + + + + TabID-10838-10193 + Disassembly + Disassembly + + + + 0 + + + + + TabID-9777-11423 + Thread List + TX-THREAD + + 1 + + + + 0 + + + + + TabID-4319-11730 + Debug Log + Debug-Log + + + + TabID-28996-20478 + Breakpoints + Breakpoints + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 48 + 1775 + 1775 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + + + + + + -2 + -2 + 452 + 276 + -2 + -2 + 208 + 203 + 137022 + 219222 + 183136 + 490281 + + + + + + + + + + + + -2 + 274 + 452 + 691 + 274 + -2 + 173 + 182 + 113966 + 196544 + 274704 + 490281 + + + + + + + + + + + -2 + -2 + 201 + 1520 + -2 + -2 + 1522 + 203 + 1002635 + 219222 + 113966 + 196544 + + + + + + + + + 199 + -2 + 381 + 1520 + -2 + 199 + 1522 + 182 + 1002635 + 196544 + 113966 + 196544 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + Access + Current CPU Registers + Value + + + 180 + 180 + 180 + + + 0 + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + BA0100001000259600000100000013860000D000000040E100000100000010860000830000000C8100001200000004860000010000001781000001000000249600000100000003E100000F0000000E810000030000000B810000010000001186000034000000468100000900000008860000010000000D81000003000000E880000002000000 + + + 0F00FFFFFFFF83860000588600007486000000DC000001DC000002DC000003DC0000439200001E920000289200002992000024960000259600001F960000 + 2900138600002F000000578600001800000059920000240000007686000039000000108600002D000000848600003A00000023920000000000000A8600002B0000001D920000130000000786000028000000008D00001E000000048600002500000056860000330000009A86000016000000259200001B000000008400007600000044920000220000001F9200001F0000005E86000035000000098600002A0000001A860000320000002D9200002100000006860000270000008E8600003B000000148600003000000069860000380000002396000087000000118600002E000000558600000600000046810000600000000E8600001700000060860000370000000B8600002C0000005D860000340000000886000029000000C386000003000000A18600003C0000002C9200002000000005860000260000001686000031000000C08600000A000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000006300000006010000B1040000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + 020800004C00000024090000FC000000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34065 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34067 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34101 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34113 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 020800004C000000820A0000DC000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 020800004C000000B0090000DC000000 + 040000003C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 020800004C00000024090000FC000000 + 0000000038020000A4060000B4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 020800004C00000008090000AC010000 + E404000032000000A4060000B4020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34083 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 020800004C00000008090000AC010000 + 040000004A000000020100009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + 020800004C00000008090000AC010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34105 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 020800004C00000024090000FC000000 + 0A01000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + 020800004C00000024090000FC000000 + 0A010000EA030000000A00009A040000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + 020800004C00000008090000AC010000 + 690800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 166 + 150 + 100 + 100 + + + + 34119 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000001000000FFFFFFFFFFFFFFFF650800004C000000690800009A0400000100000002000010040000000100000075FBFFFFB5000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000E6030000000A0000EA030000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000000020000A406000004020000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004A850000FFFF02000B004354616262656450616E650010000001000000000000006300000006010000B1040000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004A85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4A85000001000000FFFFFFFF4A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFFE004000032000000E4040000B40200000000000002000000040000000100000075FBFFFFB5000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF00000000F0010000A4060000F4010000000000000100000004000000010000000000000000000000FFFFFFFF040000001B8500001C8500001D8500001E85000001800080000000000000000000000B020000A4060000CB02000000000000F4010000A4060000B4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001E85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1B85000001000000FFFFFFFF1B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000080000000000000FFFFFFFFFFFFFFFF0000000020020000A406000024020000000000000100000004000000010000000000000000000000FFFFFFFF010000002085000001800080000000000000000000003B020000A4060000CB0200000000000024020000A4060000B4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002085000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2085000001000000FFFFFFFF20850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000F85000011850000128500001385000035850000418500000180008000000100000000000000B5040000000A000065050000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003585000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004185000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + E40300001A0000002904000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000063000000FFFEFF000000000000000000000000000100000001000000018001E100000000000064000000FFFEFF000000000000000000000000000100000001000000018003E100000000000066000000FFFEFF0000000000000000000000000001000000010000000180008100000000000047000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000000069000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000000070000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005A000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006C000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018029E10000000000006F000000FFFEFF0000000000000000000000000001000000010000000180028100000000000049000000FFFEFF000000000000000000000000000100000001000000018029810000000000005E000000FFFEFF000000000000000000000000000100000001000000018027810000000000005C000000FFFEFF000000000000000000000000000100000001000000018028810000000000005D000000FFFEFF00000000000000000000000000010000000100000001801D8100000000000056000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040057000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000004D000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004E000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000062000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000058000000FFFEFF0000000000000000000000000001000000010000000180208100000000000059000000FFFEFF0000000000000000000000000001000000010000000180468100000000020060000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34127 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34123 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..e84a61e9 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,100 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 98018242 + + + 0 + 0 + 0 + + + 1 + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups b/ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..a7aa9bbc --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M0" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.crun b/ports/cortex_m0/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.dbgdt b/ports/cortex_m0/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.dnx b/ports/cortex_m0/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m0/iar/example_build/tx.dep b/ports/cortex_m0/iar/example_build/tx.dep new file mode 100644 index 00000000..f75ac03e --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.dep @@ -0,0 +1,11975 @@ + + + 4 + 3548978476 + + Debug + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_queue_delete.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + + + [ROOT_NODE] + + + IARCHIVE + 981 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 1056 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 727 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 756 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 785 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 956 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_release.c + + + ICCARM + 14 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 544 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 1144 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 751 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 534 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 265 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 756 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 751 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 982 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 820 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 1148 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 610 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 1005 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 1144 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 1128 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 17 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 869 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 790 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 680 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 876 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 866 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 980 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 785 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 897 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 544 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 917 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 731 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 14 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 18 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 1056 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 956 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 727 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 534 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 1163 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 960 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 471 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 59 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 689 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 786 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 715 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 772 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 903 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 1153 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 966 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 1018 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 92 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 379 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 961 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 887 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 851 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 1009 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 778 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 758 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 337 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 870 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 1037 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 1159 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 762 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 3 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 456 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 973 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 373 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 855 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 4 86 73 1 0 3 5 6 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 945 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 19 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 459 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 1176 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 796 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 807 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 342 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 628 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 867 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 1191 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 1095 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 518 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 1120 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 692 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 769 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 969 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 538 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 877 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 970 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 1035 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 549 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 4 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 803 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 627 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 682 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 1022 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 1010 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 58 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 691 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 962 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 4 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 675 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 1126 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 746 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 636 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 21 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 1 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 1084 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 1047 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 713 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 1057 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 581 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 29 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 750 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 939 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 795 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 971 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 745 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 711 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 806 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 720 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 732 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 733 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 1011 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 854 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 33 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 1038 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 957 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 699 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 685 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 1096 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 824 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 744 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 925 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 977 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 1048 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 1151 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 705 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 811 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 362 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 797 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 812 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 1002 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 1158 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 810 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 1050 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 716 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 1175 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 1118 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 748 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 704 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 845 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 734 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 1021 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 626 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 653 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 598 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 710 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 1058 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 622 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 775 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 1166 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 695 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 792 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 926 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 983 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 709 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 552 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 1034 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 712 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 816 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 814 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 774 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 1063 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 1030 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 374 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 714 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 618 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 823 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 1053 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 776 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 984 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 1073 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 364 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 826 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 916 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 968 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 1070 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 878 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 1165 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 365 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 1069 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 1040 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 948 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 382 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 564 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 1179 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 650 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 930 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 721 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 51 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 1162 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 1005 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 265 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 585 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 708 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 857 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 1018 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 67 297 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 666 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 1148 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 945 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 966 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 778 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 459 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 1128 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 472 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 1159 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 960 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 379 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 456 + + + __cstat + 1167 + + + BICOMP + 20 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 297 + + + BICOMP + 1093 1014 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 19 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 1009 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 762 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 321 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 987 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 825 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_misra.c + + + ICCARM + 870 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 67 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 449 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 1007 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 809 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 928 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 982 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 917 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 887 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 1163 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 758 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 876 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 903 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 980 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 869 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 17 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 731 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 786 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 855 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 296 291 311 41 313 321 297 260 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 471 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 820 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 610 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 955 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 897 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 18 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 59 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 790 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 866 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 689 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 772 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 680 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 745 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 716 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 769 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 1058 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 1165 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 750 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 1175 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 365 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 926 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 1034 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 792 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 552 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 721 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 816 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 704 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 720 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 733 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 1069 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 699 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 854 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 803 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 734 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 1050 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 1002 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 806 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 795 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 713 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_time_set.c + + + ICCARM + 1096 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 712 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 968 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 265 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 977 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 362 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 685 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 748 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 824 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 948 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 878 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_release.c + + + ICCARM + 1162 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 1040 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 51 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 812 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 382 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 1030 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 1021 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 709 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 1118 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 983 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 823 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 29 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 564 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 1158 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 41 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 916 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 626 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 711 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 957 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 618 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 1053 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 814 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 695 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 714 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 1063 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 374 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 260 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 797 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 33 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 851 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 373 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 877 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 973 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 636 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 962 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 296 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 1010 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 1037 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 1176 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 1126 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 682 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 961 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 1153 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 1022 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 58 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 518 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 21 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 807 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 675 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 628 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 705 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 1038 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 971 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 1191 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 746 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 744 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 1095 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 342 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 538 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 970 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 313 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 1084 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 581 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 1120 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 1047 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 549 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 296 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 1035 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 1048 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 796 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_time_get.c + + + ICCARM + 732 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 1011 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 692 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 969 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 627 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 337 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 715 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 939 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 691 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 1057 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 867 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 811 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 925 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 1179 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 364 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 774 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 650 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 1070 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 260 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 776 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 826 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 1073 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 1151 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 930 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 984 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 775 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 987 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 928 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 449 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 857 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 666 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 825 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 622 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 653 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 598 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 809 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 1166 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 472 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 1007 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 710 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 810 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 845 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 708 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 720 + + + __cstat + 35 + + + BICOMP + 1142 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 774 + + + __cstat + 380 + + + BICOMP + 455 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 951 + + + BICOMP + 951 317 1160 1164 668 997 755 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 939 + + + __cstat + 537 + + + BICOMP + 862 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 691 + + + __cstat + 533 + + + BICOMP + 1029 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 1048 + + + __cstat + 9 + + + BICOMP + 606 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 692 + + + __cstat + 881 + + + BICOMP + 728 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 + + + BICOMP + 1164 1183 668 317 1180 997 919 1152 1014 1160 1157 1182 1185 702 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 58 + + + __cstat + 621 + + + BICOMP + 853 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 891 + + + BICOMP + 317 752 1160 1164 997 891 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 618 + + + __cstat + 717 + + + BICOMP + 921 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 796 + + + __cstat + 672 + + + BICOMP + 1123 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 564 + + + __cstat + 28 + + + BICOMP + 1078 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1043 + + + BICOMP + 755 1014 1160 1164 997 668 1043 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 795 + + + __cstat + 324 + + + BICOMP + 821 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 1179 + + + __cstat + 652 + + + BICOMP + 326 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 317 1157 752 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 984 + + + __cstat + 354 + + + BICOMP + 873 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 317 1160 1164 951 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 962 + + + __cstat + 348 + + + BICOMP + 818 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1014 + + + BICOMP + 1182 1014 1152 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 733 + + + __cstat + 69 + + + BICOMP + 686 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 1126 + + + __cstat + 32 + + + BICOMP + 57 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 891 + + + BICOMP + 317 752 1160 1164 997 891 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 854 + + + __cstat + 556 + + + BICOMP + 1086 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 744 + + + __cstat + 27 + + + BICOMP + 658 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 973 + + + __cstat + 45 + + + BICOMP + 352 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 317 1164 1113 919 752 1183 702 997 668 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 1038 + + + __cstat + 13 + + + BICOMP + 760 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 668 + + + BICOMP + 668 317 1157 752 1185 1160 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 969 + + + __cstat + 847 + + + BICOMP + 331 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 21 + + + __cstat + 357 + + + BICOMP + 735 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 891 + + + BICOMP + 317 752 1160 1164 997 891 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 628 + + + __cstat + 596 + + + BICOMP + 822 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 930 + + + __cstat + 600 + + + BICOMP + 943 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1043 + + + BICOMP + 755 1014 1160 1164 997 668 1043 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 712 + + + __cstat + 603 + + + BICOMP + 638 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 1180 1113 317 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 816 + + + __cstat + 340 + + + BICOMP + 879 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 1011 + + + __cstat + 62 + + + BICOMP + 1024 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 1053 + + + __cstat + 61 + + + BICOMP + 613 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 1063 + + + __cstat + 335 + + + BICOMP + 800 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 714 + + + __cstat + 582 + + + BICOMP + 625 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 + + + BICOMP + 1160 1185 317 755 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 1040 + + + __cstat + 599 + + + BICOMP + 808 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 382 + + + __cstat + 346 + + + BICOMP + 781 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 823 + + + __cstat + 46 + + + BICOMP + 1025 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 650 + + + __cstat + 384 + + + BICOMP + 976 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 374 + + + __cstat + 611 + + + BICOMP + 643 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 951 + + + BICOMP + 1180 755 317 1164 1183 1014 1182 1152 997 668 951 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 685 + + + __cstat + 34 + + + BICOMP + 740 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 1157 997 755 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 1151 + + + __cstat + 49 + + + BICOMP + 339 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 957 + + + __cstat + 619 + + + BICOMP + 946 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 1162 + + + __cstat + 55 + + + BICOMP + 932 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 581 + + + __cstat + 12 + + + BICOMP + 706 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 1120 + + + __cstat + 784 + + + BICOMP + 718 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 317 752 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 971 + + + __cstat + 641 + + + BICOMP + 1023 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 752 + + + BICOMP + 752 1157 755 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 769 + + + __cstat + 892 + + + BICOMP + 1081 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 317 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 970 + + + __cstat + 15 + + + BICOMP + 40 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1113 + + + BICOMP + 1152 317 1182 752 1164 1180 1183 997 1113 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 373 + + + __cstat + 571 + + + BICOMP + 617 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 699 + + + __cstat + 615 + + + BICOMP + 465 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 750 + + + __cstat + 345 + + + BICOMP + 649 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 317 1183 752 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 824 + + + __cstat + 602 + + + BICOMP + 723 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 33 + + + __cstat + 656 + + + BICOMP + 664 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 919 1164 997 755 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 746 + + + __cstat + 541 + + + BICOMP + 959 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 925 + + + __cstat + 517 + + + BICOMP + 1004 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 814 + + + __cstat + 662 + + + BICOMP + 898 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 811 + + + __cstat + 560 + + + BICOMP + 614 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 668 + + + BICOMP + 668 1157 752 317 1185 1160 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 626 + + + __cstat + 360 + + + BICOMP + 36 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 317 1160 1164 891 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 948 + + + __cstat + 363 + + + BICOMP + 770 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 317 1157 752 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 732 + + + __cstat + 70 + + + BICOMP + 871 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 919 1164 997 755 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 1037 + + + __cstat + 888 + + + BICOMP + 56 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 1191 + + + __cstat + 654 + + + BICOMP + 793 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 317 752 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 1022 + + + __cstat + 779 + + + BICOMP + 941 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 891 + + + BICOMP + 1180 317 1164 1183 668 1182 1152 997 891 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 867 + + + __cstat + 11 + + + BICOMP + 979 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 317 1152 891 1182 752 1164 1180 1183 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 807 + + + __cstat + 833 + + + BICOMP + 1169 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 518 + + + __cstat + 623 + + + BICOMP + 669 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 745 + + + __cstat + 329 + + + BICOMP + 940 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 549 + + + __cstat + 864 + + + BICOMP + 841 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1014 + + + BICOMP + 1182 1014 1152 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 705 + + + __cstat + 63 + + + BICOMP + 542 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 961 + + + __cstat + 835 + + + BICOMP + 1071 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 1095 + + + __cstat + 583 + + + BICOMP + 1161 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 682 + + + __cstat + 520 + + + BICOMP + 651 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 1096 + + + __cstat + 343 + + + BICOMP + 378 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 919 1164 997 755 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 1047 + + + __cstat + 39 + + + BICOMP + 529 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 317 1157 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 538 + + + __cstat + 381 + + + BICOMP + 23 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 1035 + + + __cstat + 605 + + + BICOMP + 944 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 806 + + + __cstat + 527 + + + BICOMP + 914 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 713 + + + __cstat + 30 + + + BICOMP + 601 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 675 + + + __cstat + 584 + + + BICOMP + 753 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 1010 + + + __cstat + 550 + + + BICOMP + 1143 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 1153 + + + __cstat + 578 + + + BICOMP + 707 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 636 + + + __cstat + 514 + + + BICOMP + 804 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 1050 + + + __cstat + 325 + + + BICOMP + 1064 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 1007 + + + __cstat + 473 + + + BICOMP + 985 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 317 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 845 + + + __cstat + 551 + + + BICOMP + 736 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 708 + + + __cstat + 371 + + + BICOMP + 1171 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 1157 997 755 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 666 + + + __cstat + 323 + + + BICOMP + 894 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 825 + + + __cstat + 559 + + + BICOMP + 937 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 653 + + + __cstat + 361 + + + BICOMP + 366 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 855 + + + __cstat + 620 + + + BICOMP + 694 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1014 668 755 891 1113 952 1093 951 1043 + + + BICOMP + 1164 891 951 919 752 668 952 317 1183 702 997 1014 755 1113 1093 1043 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 622 + + + __cstat + 367 + + + BICOMP + 1079 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 1157 997 755 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 778 + + + __cstat + 10 + + + BICOMP + 1138 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 1183 1093 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 756 + + + __cstat + 929 + + + BICOMP + 519 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 951 + + + BICOMP + 752 1160 1164 997 951 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 917 + + + __cstat + 920 + + + BICOMP + 789 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 952 + + + BICOMP + 1157 668 1185 1160 997 952 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 17 + + + __cstat + 900 + + + BICOMP + 846 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 951 + + + BICOMP + 1152 951 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 1005 + + + __cstat + 923 + + + BICOMP + 747 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1043 + + + BICOMP + 1043 1160 1164 752 317 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 1056 + + + __cstat + 1186 + + + BICOMP + 783 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1043 + + + BICOMP + 1043 1160 1164 752 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 1009 + + + __cstat + 683 + + + BICOMP + 475 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1093 + + + BICOMP + 317 1157 668 1185 1160 997 1093 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 790 18 756 866 956 980 897 785 17 14 869 680 751 1056 876 727 1144 544 731 534 1005 917 1163 982 820 1148 610 1128 966 762 887 456 855 19 379 870 1009 1018 1159 945 59 778 557 459 960 471 689 772 903 786 758 337 851 715 1153 961 1037 973 373 970 867 1022 58 675 1095 1126 746 1010 691 636 682 21 1084 1176 962 796 1191 518 807 692 877 627 342 1035 628 1120 769 969 538 549 803 699 1011 744 1057 854 939 806 705 811 977 1038 581 971 795 1047 1048 732 1096 733 750 745 720 713 29 33 685 711 957 824 925 1151 714 1063 618 1040 1030 826 823 650 1179 948 382 1053 814 774 374 1070 776 984 1162 564 930 1073 364 916 968 878 51 1165 365 721 1069 792 1175 1118 734 797 1034 704 926 709 362 552 748 1058 712 816 695 1158 983 812 716 1021 626 1002 1050 810 845 775 653 598 710 622 1166 449 987 825 666 857 1007 809 928 708 472 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 980 + + + __cstat + 954 + + + BICOMP + 843 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 727 + + + __cstat + 1181 + + + BICOMP + 671 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 1157 1043 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 534 + + + __cstat + 924 + + + BICOMP + 1174 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1043 + + + BICOMP + 668 317 1160 1164 997 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 869 + + + __cstat + 896 + + + BICOMP + 684 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1043 + + + BICOMP + 317 668 1160 1164 997 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 1144 + + + __cstat + 1170 + + + BICOMP + 964 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 1157 1043 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 772 + + + __cstat + 875 + + + BICOMP + 1135 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1113 + + + BICOMP + 702 1183 668 317 919 1164 997 1113 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 14 + + + __cstat + 935 + + + BICOMP + 561 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 951 + + + BICOMP + 1152 951 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 715 + + + __cstat + 633 + + + BICOMP + 1139 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 857 + + + __cstat + 480 + + + BICOMP + 768 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 928 + + + __cstat + 369 + + + BICOMP + 1036 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 731 + + + __cstat + 907 + + + BICOMP + 332 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1043 + + + BICOMP + 1043 1160 1164 752 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 1148 + + + __cstat + 933 + + + BICOMP + 860 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 952 + + + BICOMP + 317 1164 919 752 1183 702 997 952 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 1165 + + + __cstat + 453 + + + BICOMP + 609 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 952 + + + BICOMP + 702 952 1183 668 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 790 + + + __cstat + 1189 + + + BICOMP + 988 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 951 + + + BICOMP + 1180 317 1164 1183 668 1182 1152 997 951 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 1163 + + + __cstat + 910 + + + BICOMP + 884 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 952 + + + BICOMP + 317 1164 919 752 1183 702 997 952 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 610 + + + __cstat + 902 + + + BICOMP + 819 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 897 + + + __cstat + 1147 + + + BICOMP + 575 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 820 + + + __cstat + 1178 + + + BICOMP + 1168 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 952 + + + BICOMP + 317 952 1185 1160 752 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 680 + + + __cstat + 905 + + + BICOMP + 368 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1043 + + + BICOMP + 317 668 1160 1164 997 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 734 + + + __cstat + 640 + + + BICOMP + 1187 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 317 1183 1093 919 1164 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 926 + + + __cstat + 24 + + + BICOMP + 724 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 317 1180 1113 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 18 + + + __cstat + 1150 + + + BICOMP + 333 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 951 + + + BICOMP + 1180 317 1164 1183 668 1182 1152 997 951 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 866 + + + __cstat + 1184 + + + BICOMP + 801 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 951 + + + BICOMP + 1152 951 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 982 + + + __cstat + 911 + + + BICOMP + 1074 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 952 + + + BICOMP + 952 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 751 + + + __cstat + 918 + + + BICOMP + 927 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1043 + + + BICOMP + 1185 1160 752 1157 997 1043 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 987 + + + __cstat + 540 + + + BICOMP + 358 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 544 + + + __cstat + 909 + + + BICOMP + 963 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 1157 1043 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 968 + + + __cstat + 370 + + + BICOMP + 942 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1043 + + + BICOMP + 755 1014 317 1160 1164 997 668 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 365 + + + __cstat + 344 + + + BICOMP + 1032 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 317 1183 952 919 1164 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 51 + + + __cstat + 351 + + + BICOMP + 338 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 952 + + + BICOMP + 317 702 952 1183 668 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 552 + + + __cstat + 604 + + + BICOMP + 859 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 317 1180 1164 1183 1113 1182 1152 997 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 1069 + + + __cstat + 595 + + + BICOMP + 899 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 878 + + + __cstat + 587 + + + BICOMP + 700 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 952 + + + BICOMP + 317 755 1157 1014 1185 1160 997 668 952 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 826 + + + __cstat + 577 + + + BICOMP + 725 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 1118 + + + __cstat + 37 + + + BICOMP + 743 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1093 + + + BICOMP + 755 1157 1014 1185 1160 997 668 1093 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 748 + + + __cstat + 546 + + + BICOMP + 1003 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 317 1180 1164 1183 1113 1182 1152 997 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 1158 + + + __cstat + 591 + + + BICOMP + 60 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 891 + + + BICOMP + 1180 755 1164 1183 1014 1182 1152 997 668 891 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 721 + + + __cstat + 334 + + + BICOMP + 730 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 364 + + + __cstat + 355 + + + BICOMP + 616 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 317 1157 1043 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 792 + + + __cstat + 579 + + + BICOMP + 872 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1093 + + + BICOMP + 755 317 1157 1014 1185 1160 997 668 1093 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 1175 + + + __cstat + 588 + + + BICOMP + 986 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 1093 + + + BICOMP + 317 702 1093 1183 668 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 1073 + + + __cstat + 637 + + + BICOMP + 787 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 1043 + + + BICOMP + 317 1043 1157 668 1185 1160 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 695 + + + __cstat + 545 + + + BICOMP + 799 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 916 + + + __cstat + 590 + + + BICOMP + 738 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 317 1157 1043 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 1034 + + + __cstat + 341 + + + BICOMP + 1026 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 1093 + + + BICOMP + 317 1093 1014 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 812 + + + __cstat + 330 + + + BICOMP + 1124 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 891 + + + BICOMP + 891 1160 1164 668 997 755 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 337 + + + __cstat + 632 + + + BICOMP + 524 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 317 919 752 1183 702 997 668 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 557 + + + __cstat + 567 + + + BICOMP + 539 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 1183 1093 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 1018 + + + __cstat + 701 + + + BICOMP + 634 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 752 1093 + + + BICOMP + 1093 1185 1160 668 1157 997 752 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 1021 + + + __cstat + 328 + + + BICOMP + 612 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 317 1160 1164 891 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 945 + + + __cstat + 26 + + + BICOMP + 553 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 317 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 903 + + + __cstat + 631 + + + BICOMP + 1054 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1113 + + + BICOMP + 1152 1182 752 1164 1180 1183 997 1113 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 29 + + + __cstat + 322 + + + BICOMP + 1008 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 + + + BICOMP + 1160 1185 755 317 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 709 + + + __cstat + 22 + + + BICOMP + 1149 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 317 1180 1164 1183 1113 1182 1152 997 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 379 + + + __cstat + 477 + + + BICOMP + 586 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 + + + BICOMP + 1164 1183 1180 1014 1182 1152 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 1030 + + + __cstat + 48 + + + BICOMP + 1105 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 1058 + + + __cstat + 349 + + + BICOMP + 31 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 1180 1113 317 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 776 + + + __cstat + 597 + + + BICOMP + 1188 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 317 1160 1164 951 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 956 + + + __cstat + 931 + + + BICOMP + 773 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 951 + + + BICOMP + 752 1160 1164 997 951 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 362 + + + __cstat + 350 + + + BICOMP + 1190 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 1180 1113 317 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 876 + + + __cstat + 912 + + + BICOMP + 1027 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1043 + + + BICOMP + 1185 1160 752 1157 997 1043 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 1128 + + + __cstat + 901 + + + BICOMP + 842 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 1070 + + + __cstat + 38 + + + BICOMP + 1016 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 951 + + + BICOMP + 317 951 1160 1164 668 997 755 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 59 + + + __cstat + 536 + + + BICOMP + 1172 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1093 + + + BICOMP + 1164 919 752 1183 702 997 1093 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 983 + + + __cstat + 356 + + + BICOMP + 889 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 891 + + + BICOMP + 317 891 1160 1164 668 997 755 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 704 + + + __cstat + 377 + + + BICOMP + 703 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 755 668 1113 + + + BICOMP + 317 702 668 1183 1014 919 1164 997 755 1113 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 797 + + + __cstat + 327 + + + BICOMP + 25 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 317 1183 1093 919 1164 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 716 + + + __cstat + 68 + + + BICOMP + 516 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 317 1160 1164 891 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 471 + + + __cstat + 589 + + + BICOMP + 742 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1093 + + + BICOMP + 317 1157 668 1185 1160 997 1093 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 689 + + + __cstat + 353 + + + BICOMP + 722 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 598 + + + __cstat + 376 + + + BICOMP + 777 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 472 + + + __cstat + 16 + + + BICOMP + 1173 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 851 + + + __cstat + 630 + + + BICOMP + 1072 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1113 + + + BICOMP + 1152 1182 752 1164 1180 1183 997 1113 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 1002 + + + __cstat + 347 + + + BICOMP + 729 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 1159 + + + __cstat + 543 + + + BICOMP + 936 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 809 + + + __cstat + 525 + + + BICOMP + 690 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 887 + + + __cstat + 1177 + + + BICOMP + 782 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 952 + + + BICOMP + 1164 317 919 752 1183 702 997 952 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 459 + + + __cstat + 336 + + + BICOMP + 1062 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 1183 1093 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 449 + + + __cstat + 359 + + + BICOMP + 52 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 1166 + + + __cstat + 562 + + + BICOMP + 726 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 758 + + + __cstat + 624 + + + BICOMP + 688 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 960 + + + __cstat + 372 + + + BICOMP + 593 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 785 + + + __cstat + 908 + + + BICOMP + 958 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 710 + + + __cstat + 383 + + + BICOMP + 693 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 810 + + + __cstat + 470 + + + BICOMP + 830 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 775 + + + __cstat + 375 + + + BICOMP + 629 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 966 + + + __cstat + 922 + + + BICOMP + 868 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 762 + + + __cstat + 904 + + + BICOMP + 608 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 952 + + + BICOMP + 952 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 19 + + + __cstat + 635 + + + BICOMP + 978 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 786 + + + __cstat + 576 + + + BICOMP + 1033 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m0/iar/example_build/tx.ewd b/ports/cortex_m0/iar/example_build/tx.ewd new file mode 100644 index 00000000..1cc7709f --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m0/iar/example_build/tx.ewp b/ports/cortex_m0/iar/example_build/tx.ewp new file mode 100644 index 00000000..94481d2e --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.ewp @@ -0,0 +1,2745 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m0/iar/example_build/tx.ewt b/ports/cortex_m0/iar/example_build/tx.ewt new file mode 100644 index 00000000..efc25ef4 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.ewt @@ -0,0 +1,3406 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m0/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m0/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..4d7fdbea --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,190 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 50000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: + +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + MOVS r2, #1 + ORRS r1, r1, r2 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD08 ; Offset to vector base register + ADD r0, r0, r2 ; Build vector base register + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOVS r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD18 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD1C ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD20 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +__tx_SysTickHandler: +SysTick_Handler: +; VOID SysTick_Handler (VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, r1} + MOV lr, r1 + BX lr +; } + END diff --git a/ports/cortex_m0/iar/inc/tx_port.h b/ports/cortex_m0/iar/inc/tx_port.h new file mode 100644 index 00000000..d4501e76 --- /dev/null +++ b/ports/cortex_m0/iar/inc/tx_port.h @@ -0,0 +1,365 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M0/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M0 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M0/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_m0/iar/readme_threadx.txt b/ports/cortex_m0/iar/readme_threadx.txt new file mode 100644 index 00000000..4b6e3f6c --- /dev/null +++ b/ports/cortex_m0/iar/readme_threadx.txt @@ -0,0 +1,158 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M0 + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-M0 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-M0 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M0 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M0 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0} + MOV lr, r0 + BX lr + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-M0 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m0/iar/src/tx_iar.c b/ports/cortex_m0/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m0/iar/src/tx_thread_context_restore.s b/ports/cortex_m0/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..9191562a --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_context_restore.s @@ -0,0 +1,106 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Preemption has already been addressed - just return! */ +; + POP {r0} + MOV lr, r0 + BX lr +; +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_context_save.s b/ports/cortex_m0/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..c598b3fe --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_context_save.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, r1} ; Recover return address + MOV lr, r1 ; +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END diff --git a/ports/cortex_m0/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m0/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..6f870e9b --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..32f155cb --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..cadf01e4 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m0/iar/src/tx_thread_schedule.s b/ports/cortex_m0/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..6b9830cf --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_schedule.s @@ -0,0 +1,272 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M0 +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOVS r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load ICSR address + STR r0, [r1] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switch-out switch-in handler... */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, r1} ; Recover LR + MOV lr, r1 ; + CPSIE i ; Enable interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + MOVS r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CMP r1,#0 ; If NULL, skip preservation + BEQ __tx_ts_new ; +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r3, PSP ; Pickup PSP pointer (thread's stack pointer) + SUBS r3, r3, #16 ; Allocate stack space + STM r3!, {r4-r7} ; Save its remaining registers (M3 Instruction: STMDB r12!, {r4-r11}) + MOV r4,r8 ; + MOV r5,r9 ; + MOV r6,r10 ; + MOV r7,r11 ; + SUBS r3, r3, #32 ; Allocate stack space + STM r3!, {r4-r7} ; + SUBS r3, r3, #20 ; Allocate stack space + MOV r5, LR ; + STR r5, [r3] ; Save LR on the stack + STR r3, [r1, #8] ; Save its stack pointer +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r4] ; Pickup current time-slice + CMP r5, #0 ; If not active, skip processing + BEQ __tx_ts_new ; +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + MOVS r5, #0 ; Build clear value + STR r5, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CMP r1, #0 ; + BEQ __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADDS r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r3, [r1, #8] ; Pickup thread's stack pointer + LDR r5, [r3] ; Recover saved LR + ADDS r3, r3, #4 ; Position past LR + MOV lr, r5 ; Restore LR + LDM r3!,{r4-r7} ; Recover thread's registers (r4-r11) + MOV r11,r7 ; + MOV r10,r6 ; + MOV r9,r5 ; + MOV r8,r4 ; + LDM r3!,{r4-r7} ; + MSR PSP, r3 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CMP r1, #0 ; If non-NULL, a new thread is ready! + BNE __tx_ts_ready ; +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + LDR r7, =0x08000000 ; Build clear PendSV value + LDR r5, =0xE000ED04 ; Build base NVIC address + STR r7, [r5] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_stack_build.s b/ports/cortex_m0/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..f1073d54 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_stack_build.s @@ -0,0 +1,145 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M0 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + MOVS r3, #0x7 ; + BICS r2, r2, r3 ; Align frame for 8-byte alignment + SUBS r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOVS r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r8 + STR r3, [r2, #8] ; Store initial r9 + STR r3, [r2, #12] ; Store initial r10 + STR r3, [r2, #16] ; Store initial r11 + STR r3, [r2, #20] ; Store initial r4 + STR r3, [r2, #24] ; Store initial r5 + STR r3, [r2, #28] ; Store initial r6 + STR r3, [r2, #32] ; Store initial r7 +; +; /* Hardware stack follows. */ +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + LDR r3, =0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + LDR r3, =0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_system_return.s b/ports/cortex_m0/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..3035fd25 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_system_return.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load NVIC base + STR r0, [r1] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_timer_interrupt.s b/ports/cortex_m0/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..a04ccf59 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADDS r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUBS r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOVS r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOVS r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADDS r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired: +; +; + PUSH {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + LDR r0, =_tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CMP r1, #0 ; + BNE __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + LDR r0, =0xE000ED04 ; Build address of control register + LDR r2, =0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + POP {r0, r1} ; Recover lr register (r0 is just there for + MOV lr, r1 ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_m3/ac5/example_build/build_threadx.bat b/ports/cortex_m3/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..8fc64ee9 --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m3 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m3/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m3/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..f1f517c4 --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m3 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m3 -O2 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m3/ac5/example_build/sample_threadx.c b/ports/cortex_m3/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..3e92d7ca --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + LDR R0, =__main + BX R0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + STACK_SIZE) + LDR R2, =(HeapMem + HEAP_SIZE) + LDR R3, =StackMem + BX LR +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END diff --git a/ports/cortex_m3/ac5/inc/tx_port.h b/ports/cortex_m3/ac5/inc/tx_port.h new file mode 100644 index 00000000..259deceb --- /dev/null +++ b/ports/cortex_m3/ac5/inc/tx_port.h @@ -0,0 +1,342 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M3/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M3/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif diff --git a/ports/cortex_m3/ac5/readme_threadx.txt b/ports/cortex_m3/ac5/readme_threadx.txt new file mode 100644 index 00000000..523279a3 --- /dev/null +++ b/ports/cortex_m3/ac5/readme_threadx.txt @@ -0,0 +1,145 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Using ARM Compiler 5 (AC5) + + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +development environment. At this point you may run the build_threadx.bat batch +file. This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M3 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/ac5/src/tx_thread_context_restore.s b/ports/cortex_m3/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..eb6c205f --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_context_save.s b/ports/cortex_m3/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..4dfc3352 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_context_save.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..8951fc9d --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,80 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..d7fd0951 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,78 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..f5c6d3ba --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,77 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_schedule.s b/ports/cortex_m3/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..a0cbd6a7 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_schedule.s @@ -0,0 +1,248 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + ALIGN + LTORG + END + diff --git a/ports/cortex_m3/ac5/src/tx_thread_stack_build.s b/ports/cortex_m3/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..023e14c4 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,138 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M3 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/ac5/src/tx_thread_system_return.s b/ports/cortex_m3/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..0e88b617 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_system_return.s @@ -0,0 +1,91 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/ac5/src/tx_timer_interrupt.s b/ports/cortex_m3/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..e9a43031 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,266 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m3/gnu/CMakeLists.txt b/ports/cortex_m3/gnu/CMakeLists.txt index cb3091b9..71e2d4f2 100644 --- a/ports/cortex_m3/gnu/CMakeLists.txt +++ b/ports/cortex_m3/gnu/CMakeLists.txt @@ -9,7 +9,6 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_stack_build.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.S - # {{END_TARGET_SOURCES}} ) diff --git a/ports/cortex_m3/gnu/example_build/build_threadx.bat b/ports/cortex_m3/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..79f240b0 --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m3/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m3/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..cc93371f --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb tx_simulator_startup.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb cortexm3_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m3 -ereset_handler -T sample_threadx.ld tx_simulator_startup.o cortexm3_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m3/gnu/example_build/cortexm3_crt0.s b/ports/cortex_m3/gnu/example_build/cortexm3_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/cortexm3_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m3/gnu/example_build/libc.a b/ports/cortex_m3/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..6c1567d15e3b2f049d1acd9038ac4fcd28005c18 GIT binary patch literal 743432 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 O)*~DyMuzP+-v0+$^S6Nj literal 0 HcmV?d00001 diff --git a/ports/cortex_m3/gnu/example_build/sample_threadx.c b/ports/cortex_m3/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..597f373c --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m3/gnu/example_build/sample_threadx.ld b/ports/cortex_m3/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m3/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m3/gnu/example_build/tx_initialize_low_level.S similarity index 95% rename from ports/cortex_m3/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m3/gnu/example_build/tx_initialize_low_level.S index bfa6e423..3eaf5731 100644 --- a/ports/cortex_m3/gnu/src/tx_initialize_low_level_sample.S +++ b/ports/cortex_m3/gnu/example_build/tx_initialize_low_level.S @@ -59,7 +59,7 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M3/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -93,6 +93,9 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), fixed */ +@/* GNU assembly comment, */ +@/* resulting in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_initialize_low_level(VOID) @@ -191,14 +194,14 @@ __tx_IntHandler: @ { PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif @ /* Do interrupt handler work here */ @ /* BL .... */ #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR @@ -216,11 +219,11 @@ SysTick_Handler: @ PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif BL _tx_timer_interrupt #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR diff --git a/ports/cortex_m3/gnu/src/tx_vector_table_sample.S b/ports/cortex_m3/gnu/example_build/tx_simulator_startup.s similarity index 100% rename from ports/cortex_m3/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m3/gnu/example_build/tx_simulator_startup.s diff --git a/ports/cortex_m3/gnu/readme_threadx.txt b/ports/cortex_m3/gnu/readme_threadx.txt new file mode 100644 index 00000000..92c2045d --- /dev/null +++ b/ports/cortex_m3/gnu/readme_threadx.txt @@ -0,0 +1,153 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M3 + +The ThreadX demonstration is designed to execute on Cortex-M3 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using gnu tools uses the standard GNU +Cortex-M3 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +ISRs can be written completely in C (or assembly language) without any calls to +_tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed access to the +ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + + .global your_assembly_isr + .thumb_func +your_assembly_isr: +; VOID your_assembly_isr(VOID) +; { + PUSH {r0, lr} +; +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, lr} + BX lr +; } + +Note: the Cortex-M3 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M3 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/gnu/src/tx_thread_stack_build.S b/ports/cortex_m3/gnu/src/tx_thread_stack_build.S index bec56d45..35d6e2ca 100644 --- a/ports/cortex_m3/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m3/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M3/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -91,7 +96,7 @@ _tx_thread_stack_build: @ r7 Initial value for r7 @ r8 Initial value for r8 @ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) +@ r10 Initial value for r10 @ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @@ -119,9 +124,7 @@ _tx_thread_stack_build: STR r3, [r2, #16] @ Store initial r7 STR r3, [r2, #20] @ Store initial r8 STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOV r3, #0 @ Build initial register value + STR r3, [r2, #28] @ Store initial r10 STR r3, [r2, #32] @ Store initial r11 @ @ /* Hardware stack follows. */ diff --git a/ports/cortex_m3/iar/example_build/azure_rtos.eww b/ports/cortex_m3/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m3/iar/example_build/cstartup_M.s b/ports/cortex_m3/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..75d9369b --- /dev/null +++ b/ports/cortex_m3/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(1) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + B __iar_program_start + + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.c b/ports/cortex_m3/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c67d75d0 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.c @@ -0,0 +1,385 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define event buffer. */ + +#ifdef TX_ENABLE_EVENT_TRACE +UCHAR trace_buffer[0x10000]; +#endif + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + +#ifdef TX_ENABLE_EVENT_TRACE + tx_trace_enable(trace_buffer, sizeof(trace_buffer), 32); +#endif + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.dep b/ports/cortex_m3/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..55bb03a6 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.dep @@ -0,0 +1,128 @@ + + + 4 + 3533065436 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\src\tx_initialize_low_level.s + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\lib\dl7M_tln.a + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\lib\m7M_tl.a + + + [ROOT_NODE] + + + ILINK + 15 31 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 7 + + + + + $PROJ_DIR$\..\src\tx_initialize_low_level.s + + + AARM + 7 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 31 + + + + + ILINK + 19 23 14 27 7 28 29 32 30 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 23 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 14 + + + __cstat + 0 + + + BICOMP + 13 + + + + + ICCARM + 24 9 2 4 17 12 8 11 21 3 16 18 5 1 20 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.ewd b/ports/cortex_m3/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..9df387fc --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.ewp b/ports/cortex_m3/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..488ff799 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2127 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.ewt b/ports/cortex_m3/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..72ce9e69 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.icf b/ports/cortex_m3/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..eae0fd73 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.icf @@ -0,0 +1,34 @@ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..97c89213 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 280 + 30 + 30 + 30 + + + <ws> + + + + 14 + 26 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 020000003000578600000100000029810000020000001386000008000000259600000100000000DA000001000000268100000100000059920000010000000184000001000000108600002B00000029E10000020000000F810000010000002081000001000000ED8000000100000008DA000001000000EA800000010000001D8100000200000001E10000010000000D800000010000000C8100000600000003DC0000010000000486000001000000038400000500000056860000010000001781000003000000249600000100000007B000000100000014810000010000000C8600000100000000810000020000000E81000001000000EC800000010000001A8600000100000003E10000020000000B81000002000000E98000000200000014860000020000005586000001000000F48000000100000000860000010000000284000001000000118600002A00000046810000020000002481000001000000EB800000020000000D81000003000000088600000100000006DA000001000000E880000001000000 + + + 10000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000484000006840000008800000188000002880000038800000488000005880000 + 040030840000520000000E840000500000000B8100001F0000000D81000021000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000007040000000A000065050000 + 00000000F0030000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m3\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m3\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 000000003200000060010000EC030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF600100003200000064010000EC0300000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF00000000EC030000000A0000F0030000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000007040000000A00006505000000000000F0030000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..00208544 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..2894c7df --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..11a77ea1 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M3" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..ce257367 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m3/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..aebcbbc8 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1623 @@ + + + + + + + 3 + 0 + 0 + + + Build + + + + 20 + 1725 + + + 20 + 1293 + 345 + 86 + + 3 + 0 + 0 + + + Debug-Log + + + + + + + 523 + 27 + 27 + 27 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + + 2 + 0 + 0 + + + + + + + + + 100 + 100 + 100 + 100 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 192 + 150 + 100 + 100 + + + + + + + + TabID-30473-31614 + Workspace + Workspace + + + <ws> + sample_threadx + + + + + 0 + + + + + + + TabID-29348-22201 + Debug Log + Debug-Log + + + + 0 + + + + + TabID-22784-19201 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 0 + 0 + 0 + 0 + 51 + 1984 + 1984 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + + + + -2 + -2 + 647 + 597 + -2 + -2 + 248 + 222 + 143022 + 237179 + 345444 + 693376 + + + + + + + + + + + -2 + -2 + 647 + 385 + -2 + -2 + 200 + 200 + 115340 + 213675 + 223183 + 693376 + + + + + + + + + + + + + + -2 + -2 + 220 + 1736 + -2 + -2 + 1738 + 222 + 1002307 + 237179 + 143022 + 237179 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + _tx_timer_system_clock + + + + Expression + Location + Type + Value + + + 176 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 6B00000030002596000001000000138600000800000029810000020000005786000001000000108600002B00000001840000010000005992000001000000268100000100000000DA00000100000029E1000002000000ED8000000100000020810000010000000F810000010000000C810000060000000D8000000100000001E10000010000001D81000002000000EA8000000100000008DA000001000000048600000100000003DC0000010000002496000001000000178100000300000056860000010000000384000005000000148100000100000007B000000100000000810000020000000C8600000100000003E10000020000001A86000001000000EC800000010000000E81000001000000E9800000020000000B810000020000001486000002000000118600002A00000002840000010000000086000001000000F48000000100000055860000010000002481000001000000468100000200000008860000010000000D81000002000000EB80000002000000E88000000100000006DA000001000000 + + + 1500FFFFFFFF748600007784000007840000808C000044D500008386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 45005786000018000000048400007A000000138600002F000000158100005300000059920000240000007686000039000000108600002D00000007E100006900000023920000000000003184000081000000848600003A00000004E100006700000020810000590000000F8100005100000001E10000640000000D800000450000001D920000110000000786000028000000008D00001E0000000C8100004E0000000486000025000000068400007C00000017810000550000009A8600001600000003840000790000005686000033000000148100005200000025920000190000000084000076000000008100004700000044920000220000000E8400007E000000308400008000000003E10000660000001F9200001F0000001A860000320000001F810000580000000E810000500000005E8600003500000000E10000630000002D9200002100000006860000270000008E8600003B0000000B8100004D00000041E10000730000006986000038000000058400007B00000014860000300000001681000054000000239600008700000055860000060000000284000078000000118600002E0000000E86000017000000108400007F0000003284000082000000468100006000000005E10000680000005184000084000000608600003700000002E1000065000000C386000003000000A18600003C0000000A8400007D0000000D8100004F0000005D860000340000002C920000200000000586000026000000C08600000A000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000CA020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + F6070000930000001809000043010000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34065 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34067 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34101 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34113 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + F607000093000000760A000023010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + F607000093000000A409000023010000 + 040000003B0200009F06000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + F6070000930000001809000043010000 + 0000000037020000A3060000B3020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + F607000093000000FC080000F3010000 + 040000004A0000000201000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + F607000093000000FC080000F3010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34105 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + F607000093000000A409000053010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + F607000093000000A409000053010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + F6070000930000001809000043010000 + 0A01000003020000A3060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + F6070000930000001809000043010000 + 0A01000003020000A3060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + F607000093000000FC080000F3010000 + B90700004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34119 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000001000000FFFFFFFFFFFFFFFFB50700004C000000B90700009A040000010000000200001004000000010000005AF9FFFFF6010000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A306000003020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A306000003020000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004A850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CA020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004A85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4A85000001000000FFFFFFFF4A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EF010000A3060000F3010000000000000100000004000000010000000000000000000000FFFFFFFF040000001B8500001C8500001D8500001E85000001800080000000000000000000000A020000A3060000CA02000000000000F3010000A3060000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001E85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1B85000001000000FFFFFFFF1B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000080000000000000FFFFFFFFFFFFFFFF000000001F020000A306000023020000000000000100000004000000010000000000000000000000FFFFFFFF010000002085000001800080000000000000000000003A020000A3060000CA0200000000000023020000A3060000B3020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002085000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2085000001000000FFFFFFFF20850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000F85000011850000128500001385000035850000418500000180008000000100000000000000CE020000A40600007E030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003585000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004185000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000063000000FFFEFF000000000000000000000000000100000001000000018001E100000000000064000000FFFEFF000000000000000000000000000100000001000000018003E100000000040066000000FFFEFF0000000000000000000000000001000000010000000180008100000000000047000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000040069000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040070000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005A000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018029E10000000004006F000000FFFEFF0000000000000000000000000001000000010000000180028100000000040049000000FFFEFF000000000000000000000000000100000001000000018029810000000004005E000000FFFEFF000000000000000000000000000100000001000000018027810000000004005C000000FFFEFF000000000000000000000000000100000001000000018028810000000004005D000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040056000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040057000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004D000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004E000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000062000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000058000000FFFEFF0000000000000000000000000001000000010000000180208100000000000059000000FFFEFF0000000000000000000000000001000000010000000180468100000000000060000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34127 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34123 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..0fa79328 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 1618778298 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..11a77ea1 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M3" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.crun b/ports/cortex_m3/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.dbgdt b/ports/cortex_m3/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.dnx b/ports/cortex_m3/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m3/iar/example_build/tx.dep b/ports/cortex_m3/iar/example_build/tx.dep new file mode 100644 index 00000000..1bcebb99 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.dep @@ -0,0 +1,9780 @@ + + + 4 + 1228130052 + + Debug + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\src\tx_initialize_low_level.s + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\tx_misra.s + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_misra.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\tx_misra.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\List\tx_misra.lst + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\List\tx_misra.s + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_event_flags.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\..\src\tx_misra.s + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + [ROOT_NODE] + + + IARCHIVE + 484 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 712 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 895 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 857 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 771 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 851 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 537 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 752 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 663 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 541 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 544 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 720 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 462 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 474 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 587 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 476 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 875 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 788 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 818 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 695 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 577 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 901 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 763 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 728 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 770 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 573 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 447 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 419 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 919 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 772 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 580 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 873 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 755 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 570 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 838 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 4 10 18 20 9 3 8 1 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 810 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 811 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 8 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 656 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 626 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 443 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 549 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 515 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 504 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 871 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 867 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 843 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 786 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 756 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\src\tx_initialize_low_level.s + + + AARM + 998 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 627 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 848 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 814 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 860 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 5 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 947 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 603 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 912 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 3 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 731 + + + __cstat + 411 + + + BICOMP + 617 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 699 540 1000 191 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 643 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 806 + + + __cstat + 881 + + + BICOMP + 183 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 973 699 693 972 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 829 + + + __cstat + 448 + + + BICOMP + 888 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 819 + + + __cstat + 441 + + + BICOMP + 804 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 154 + + + BICOMP + 154 675 191 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 561 + + + __cstat + 679 + + + BICOMP + 482 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 896 + + + __cstat + 456 + + + BICOMP + 721 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 816 + + + __cstat + 633 + + + BICOMP + 830 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 973 520 154 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 590 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 624 + + + __cstat + 107 + + + BICOMP + 620 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 533 + + + __cstat + 404 + + + BICOMP + 600 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 973 675 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 454 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 517 + + + __cstat + 574 + + + BICOMP + 599 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 124 + + + __cstat + 948 + + + BICOMP + 852 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 973 523 699 960 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 795 + + + __cstat + 480 + + + BICOMP + 518 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 120 + + + BICOMP + 520 973 704 154 584 699 693 1000 120 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 786 + + + __cstat + 516 + + + BICOMP + 719 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 960 + + + BICOMP + 704 699 154 735 523 1000 960 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 405 + + + __cstat + 631 + + + BICOMP + 531 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 120 + + + BICOMP + 520 973 704 154 584 699 693 1000 120 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 506 + + + __cstat + 845 + + + BICOMP + 842 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 973 120 699 154 735 523 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 700 + + + __cstat + 501 + + + BICOMP + 634 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 741 + + + __cstat + 636 + + + BICOMP + 779 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 872 + + + __cstat + 623 + + + BICOMP + 390 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 973 960 540 154 745 1000 113 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + __cstat + 429 + + + BICOMP + 571 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 940 + + + __cstat + 556 + + + BICOMP + 485 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 706 + + + __cstat + 473 + + + BICOMP + 849 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 973 520 154 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 431 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 372 + + + __cstat + 606 + + + BICOMP + 471 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 628 + + + __cstat + 676 + + + BICOMP + 525 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 536 + + + __cstat + 421 + + + BICOMP + 777 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 113 + + + BICOMP + 113 675 154 973 540 704 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 580 + + + __cstat + 934 + + + BICOMP + 457 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 766 + + + __cstat + 727 + + + BICOMP + 937 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 510 + + + __cstat + 493 + + + BICOMP + 492 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 973 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 916 + + + __cstat + 530 + + + BICOMP + 874 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 461 + + + __cstat + 828 + + + BICOMP + 836 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 619 + + + __cstat + 661 + + + BICOMP + 781 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 973 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 468 + + + __cstat + 524 + + + BICOMP + 757 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 730 + + + __cstat + 435 + + + BICOMP + 538 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 113 + + + BICOMP + 113 973 675 154 540 704 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 543 + + + __cstat + 692 + + + BICOMP + 800 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 973 520 704 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 586 + + + __cstat + 893 + + + BICOMP + 931 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 443 + + + __cstat + 597 + + + BICOMP + 445 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 973 540 154 745 1000 113 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 801 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 393 + + + __cstat + 412 + + + BICOMP + 382 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 815 + + + __cstat + 846 + + + BICOMP + 929 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 809 + + + __cstat + 635 + + + BICOMP + 853 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 960 + + + BICOMP + 704 973 699 154 735 523 1000 960 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 847 + + + __cstat + 433 + + + BICOMP + 553 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 532 + + + __cstat + 420 + + + BICOMP + 887 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 422 + + + __cstat + 646 + + + BICOMP + 803 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 886 + + + __cstat + 702 + + + BICOMP + 775 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 772 + + + __cstat + 840 + + + BICOMP + 718 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 792 + + + __cstat + 519 + + + BICOMP + 585 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 865 + + + __cstat + 906 + + + BICOMP + 469 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 923 + + + BICOMP + 699 923 704 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 717 + + + __cstat + 551 + + + BICOMP + 798 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 783 + + + __cstat + 564 + + + BICOMP + 820 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 120 + + + BICOMP + 520 973 704 154 584 699 693 1000 120 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 479 + + + __cstat + 522 + + + BICOMP + 734 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 + + + BICOMP + 745 113 973 523 699 1000 704 923 540 735 675 584 520 693 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 737 + + + __cstat + 384 + + + BICOMP + 773 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 699 540 1000 191 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 715 + + + __cstat + 503 + + + BICOMP + 607 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 608 + + + __cstat + 394 + + + BICOMP + 894 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 120 + + + BICOMP + 523 699 973 735 113 704 1000 120 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 834 + + + __cstat + 494 + + + BICOMP + 879 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 973 745 154 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 945 + + + __cstat + 649 + + + BICOMP + 701 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 968 + + + BICOMP + 704 191 520 923 584 699 693 1000 113 968 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 391 + + + __cstat + 487 + + + BICOMP + 527 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 428 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 914 + + + __cstat + 678 + + + BICOMP + 414 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 120 + + + BICOMP + 973 584 120 699 693 113 520 704 1000 191 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 862 + + + __cstat + 650 + + + BICOMP + 610 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 885 + + + __cstat + 502 + + + BICOMP + 475 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 604 + + + __cstat + 162 + + + BICOMP + 514 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 489 + + + __cstat + 638 + + + BICOMP + 579 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 973 745 915 699 540 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 640 + + + __cstat + 908 + + + BICOMP + 612 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 523 699 960 973 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 769 + + + __cstat + 949 + + + BICOMP + 759 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 973 523 699 735 960 704 1000 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 710 + + + __cstat + 438 + + + BICOMP + 744 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 738 + + + __cstat + 660 + + + BICOMP + 802 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 973 745 915 699 540 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 645 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 446 + + + __cstat + 395 + + + BICOMP + 831 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 973 675 154 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 629 + + + __cstat + 423 + + + BICOMP + 822 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 453 + + + __cstat + 450 + + + BICOMP + 825 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 436 + + + __cstat + 567 + + + BICOMP + 918 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 990 + + + BICOMP + 990 745 113 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 472 + + + __cstat + 410 + + + BICOMP + 724 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 496 + + + __cstat + 927 + + + BICOMP + 508 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 120 + + + BICOMP + 523 699 191 735 923 704 1000 113 120 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 464 + + + __cstat + 938 + + + BICOMP + 136 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 973 523 699 735 960 704 1000 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 890 + + + __cstat + 545 + + + BICOMP + 616 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 523 699 960 973 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 808 + + + __cstat + 942 + + + BICOMP + 396 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 392 + + + __cstat + 459 + + + BICOMP + 832 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 699 540 1000 191 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 632 + + + __cstat + 463 + + + BICOMP + 615 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 925 + + + __cstat + 340 + + + BICOMP + 899 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 397 + + + __cstat + 378 + + + BICOMP + 630 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 582 + + + __cstat + 328 + + + BICOMP + 583 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 559 + + + __cstat + 369 + + + BICOMP + 614 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 675 1000 191 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 826 + + + __cstat + 426 + + + BICOMP + 511 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 732 + + + __cstat + 322 + + + BICOMP + 416 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 386 + + + __cstat + 677 + + + BICOMP + 892 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 973 699 693 972 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 924 + + + __cstat + 542 + + + BICOMP + 910 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 900 + + + __cstat + 455 + + + BICOMP + 797 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 787 + + + __cstat + 439 + + + BICOMP + 179 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 833 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 593 + + + __cstat + 558 + + + BICOMP + 576 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 973 675 968 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 548 + + + __cstat + 409 + + + BICOMP + 591 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 703 + + + __cstat + 667 + + + BICOMP + 509 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 523 699 960 973 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 812 + + + __cstat + 642 + + + BICOMP + 922 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 973 699 693 120 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + __cstat + 415 + + + BICOMP + 742 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 418 + + + __cstat + 575 + + + BICOMP + 425 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 923 + + + BICOMP + 699 923 704 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 402 + + + __cstat + 743 + + + BICOMP + 767 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 990 + + + BICOMP + 973 191 675 923 540 704 1000 113 990 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 793 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 790 + + + __cstat + 326 + + + BICOMP + 736 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 972 + + + BICOMP + 584 972 973 699 693 113 520 704 1000 191 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 805 + + + __cstat + 407 + + + BICOMP + 782 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 529 + + + __cstat + 413 + + + BICOMP + 444 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 861 + + + __cstat + 164 + + + BICOMP + 442 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 973 675 154 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 756 + + + __cstat + 535 + + + BICOMP + 102 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 835 + + + __cstat + 500 + + + BICOMP + 451 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 481 + + + __cstat + 491 + + + BICOMP + 707 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 437 + + + __cstat + 659 + + + BICOMP + 824 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 990 + + + BICOMP + 973 990 745 113 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 764 + + + __cstat + 539 + + + BICOMP + 733 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 596 + + + __cstat + 86 + + + BICOMP + 398 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 850 + + + __cstat + 891 + + + BICOMP + 497 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 191 113 960 + + + BICOMP + 973 113 745 923 699 540 1000 191 960 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 529 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 536 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 372 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 737 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 629 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 925 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 885 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 388 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 787 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 730 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 834 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 586 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 645 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 454 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 819 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 342 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 392 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 559 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 632 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 533 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 393 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 833 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 731 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 431 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 510 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 418 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 4 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 847 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 805 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 532 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 700 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 792 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 916 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 795 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 405 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 717 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 428 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 766 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 706 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 886 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 896 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 481 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 924 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 590 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 816 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 643 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 835 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 608 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 506 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 624 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 793 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 872 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 809 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 9 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 801 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 940 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 461 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 783 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 715 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 479 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 865 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 4 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 764 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 468 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 582 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 829 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 604 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 472 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 453 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 861 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 732 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 397 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 790 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 941 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 841 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 391 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 778 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 596 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 486 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 389 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 618 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 826 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 900 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 386 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 768 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 593 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 355 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 446 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 402 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 806 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 437 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 436 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 945 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 427 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 548 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 710 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 765 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 124 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 780 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 914 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 609 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 812 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 907 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 561 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 738 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 647 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 517 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 464 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 751 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 789 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 859 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 640 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 697 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 489 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 703 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 611 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 694 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 682 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 496 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 850 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 722 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 713 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 478 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 862 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 890 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 769 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 808 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 546 + + + __cstat + 796 + + + BICOMP + 754 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 342 + + + __cstat + 495 + + + BICOMP + 921 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 + + + BICOMP + 704 540 191 973 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 478 + + + __cstat + 681 + + + BICOMP + 377 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 841 + + + __cstat + 753 + + + BICOMP + 335 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 968 + + + BICOMP + 704 191 520 923 584 699 693 1000 113 968 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 859 + + + __cstat + 651 + + + BICOMP + 601 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 768 + + + __cstat + 595 + + + BICOMP + 748 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 968 + + + BICOMP + 973 968 675 113 540 704 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 389 + + + __cstat + 655 + + + BICOMP + 637 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 486 + + + __cstat + 685 + + + BICOMP + 555 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 972 + + + BICOMP + 523 699 191 973 735 923 704 1000 113 972 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 903 + + + __cstat + 671 + + + BICOMP + 705 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 355 + + + __cstat + 562 + + + BICOMP + 823 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 968 + + + BICOMP + 704 191 520 923 973 584 699 693 1000 113 968 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 856 + + + __cstat + 889 + + + BICOMP + 505 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 761 + + + __cstat + 666 + + + BICOMP + 458 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 751 + + + __cstat + 673 + + + BICOMP + 534 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 973 699 693 120 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 911 + + + __cstat + 664 + + + BICOMP + 424 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 778 + + + __cstat + 683 + + + BICOMP + 670 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 972 + + + BICOMP + 973 584 972 699 693 113 520 704 1000 191 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 765 + + + __cstat + 565 + + + BICOMP + 877 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 915 + + + BICOMP + 191 973 675 923 540 704 1000 113 915 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 611 + + + __cstat + 408 + + + BICOMP + 776 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 915 + + + BICOMP + 973 704 915 520 923 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 388 + + + __cstat + 452 + + + BICOMP + 385 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 609 + + + __cstat + 863 + + + BICOMP + 552 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 120 + + + BICOMP + 584 120 699 693 113 520 704 1000 191 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 696 + + + __cstat + 662 + + + BICOMP + 762 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 780 + + + __cstat + 658 + + + BICOMP + 648 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 973 523 699 735 960 704 1000 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 427 + + + __cstat + 119 + + + BICOMP + 920 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 + + + BICOMP + 704 973 540 191 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 941 + + + __cstat + 430 + + + BICOMP + 791 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 696 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 930 + + + __cstat + 813 + + + BICOMP + 334 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 675 1000 191 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 903 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 789 + + + __cstat + 760 + + + BICOMP + 866 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 856 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 422 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 907 + + + __cstat + 882 + + + BICOMP + 528 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 761 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 815 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 697 + + + __cstat + 690 + + + BICOMP + 794 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 915 + + + BICOMP + 973 915 745 113 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 618 + + + __cstat + 876 + + + BICOMP + 401 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 973 675 968 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 619 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 647 + + + __cstat + 592 + + + BICOMP + 387 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 973 745 990 699 540 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 911 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 628 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 741 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 546 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 400 + + + __cstat + 686 + + + BICOMP + 625 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 675 1000 191 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 682 + + + __cstat + 434 + + + BICOMP + 654 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 915 + + + BICOMP + 191 675 923 540 704 1000 113 915 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 722 + + + __cstat + 652 + + + BICOMP + 951 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 973 699 693 120 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 543 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 930 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 713 + + + __cstat + 680 + + + BICOMP + 644 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 694 + + + __cstat + 641 + + + BICOMP + 470 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 400 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 763 857 537 587 818 476 474 695 728 541 770 663 544 720 771 577 901 712 875 895 851 462 752 788 848 447 873 755 814 912 603 656 838 626 549 811 860 419 871 947 515 627 573 504 570 867 843 810 919 772 443 786 580 756 461 766 872 468 809 506 608 795 764 886 783 916 835 481 717 792 405 590 643 865 715 706 940 624 479 428 793 801 896 924 816 510 372 925 418 833 632 532 529 645 723 787 847 586 536 454 730 805 819 774 533 393 737 731 629 834 700 885 388 342 392 559 431 829 391 826 604 427 548 941 710 582 596 472 453 446 861 732 900 397 790 486 778 386 806 389 945 841 768 618 593 355 402 437 436 647 517 859 765 697 682 489 738 611 850 124 780 640 464 769 703 890 862 808 496 914 609 751 722 812 713 789 907 561 694 478 911 856 400 422 628 741 619 761 696 543 903 815 930 546 + + + + + $PROJ_DIR$\tx_misra.s + + + AARM + 749 + + + + + $PROJ_DIR$\tx_misra.c + + + ICCARM + 665 657 749 + + + BICOMP + 639 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 569 554 540 745 693 675 113 154 + + + BICOMP + 704 699 745 113 973 520 540 674 1000 154 735 675 569 584 554 693 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 818 + + + __cstat + 827 + + + BICOMP + 521 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 972 + + + BICOMP + 520 704 154 584 699 693 1000 972 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 947 + + + __cstat + 578 + + + BICOMP + 332 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 915 + + + BICOMP + 699 540 154 745 1000 915 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 419 + + + __cstat + 594 + + + BICOMP + 785 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 755 + + + __cstat + 572 + + + BICOMP + 460 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 860 + + + __cstat + 550 + + + BICOMP + 383 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 154 915 + + + BICOMP + 540 915 704 113 675 1000 154 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 867 + + + __cstat + 174 + + + BICOMP + 483 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 603 + + + __cstat + 560 + + + BICOMP + 883 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 990 + + + BICOMP + 699 973 540 154 745 1000 990 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 873 + + + __cstat + 729 + + + BICOMP + 854 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 626 + + + __cstat + 669 + + + BICOMP + 784 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 627 + + + __cstat + 621 + + + BICOMP + 507 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 745 915 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 912 + + + __cstat + 716 + + + BICOMP + 598 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 990 + + + BICOMP + 540 990 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 515 + + + __cstat + 557 + + + BICOMP + 547 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 745 915 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 811 + + + __cstat + 726 + + + BICOMP + 839 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 915 + + + BICOMP + 973 675 113 540 704 1000 915 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 504 + + + __cstat + 466 + + + BICOMP + 588 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 462 + + + __cstat + 739 + + + BICOMP + 689 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 990 + + + BICOMP + 675 113 540 704 1000 990 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 573 + + + __cstat + 403 + + + BICOMP + 467 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 745 915 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 848 + + + __cstat + 688 + + + BICOMP + 351 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 990 + + + BICOMP + 540 973 990 704 154 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 771 + + + __cstat + 725 + + + BICOMP + 880 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 968 + + + BICOMP + 540 704 154 675 1000 968 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 919 + + + __cstat + 581 + + + BICOMP + 817 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 474 + + + __cstat + 868 + + + BICOMP + 498 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 663 + + + __cstat + 884 + + + BICOMP + 935 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 968 + + + BICOMP + 704 973 520 113 584 699 693 1000 968 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 544 + + + __cstat + 672 + + + BICOMP + 432 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 968 + + + BICOMP + 540 704 154 675 1000 968 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 549 + + + __cstat + 855 + + + BICOMP + 897 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 + + + BICOMP + 735 523 699 923 704 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 541 + + + __cstat + 821 + + + BICOMP + 488 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 972 + + + BICOMP + 704 972 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 720 + + + __cstat + 668 + + + BICOMP + 417 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 968 + + + BICOMP + 584 968 699 693 154 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 851 + + + __cstat + 711 + + + BICOMP + 905 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 968 + + + BICOMP + 584 968 699 693 154 973 520 704 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 871 + + + __cstat + 568 + + + BICOMP + 499 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 973 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 656 + + + __cstat + 714 + + + BICOMP + 740 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 915 + + + BICOMP + 704 915 520 923 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 814 + + + __cstat + 602 + + + BICOMP + 613 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 728 + + + __cstat + 747 + + + BICOMP + 449 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 972 + + + BICOMP + 704 972 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 838 + + + __cstat + 708 + + + BICOMP + 512 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 923 113 191 120 960 990 915 972 968 + + + BICOMP + 120 699 972 540 154 113 990 973 745 1000 923 191 960 915 968 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 695 + + + __cstat + 870 + + + BICOMP + 477 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 788 + + + __cstat + 687 + + + BICOMP + 320 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 990 + + + BICOMP + 540 990 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 476 + + + __cstat + 807 + + + BICOMP + 909 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 752 + + + __cstat + 750 + + + BICOMP + 878 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 990 + + + BICOMP + 699 973 540 154 745 1000 990 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 843 + + + __cstat + 917 + + + BICOMP + 837 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 960 + + + BICOMP + 745 113 973 699 540 1000 960 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 537 + + + __cstat + 858 + + + BICOMP + 526 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 972 + + + BICOMP + 520 704 154 584 699 693 1000 972 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 447 + + + __cstat + 698 + + + BICOMP + 399 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 990 + + + BICOMP + 699 973 540 154 745 1000 990 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 570 + + + __cstat + 406 + + + BICOMP + 898 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 915 + + + BICOMP + 973 675 113 540 704 1000 915 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 810 + + + __cstat + 589 + + + BICOMP + 709 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 960 + + + BICOMP + 704 699 154 735 523 1000 960 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 749 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 895 + + + __cstat + 691 + + + BICOMP + 440 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 968 + + + BICOMP + 704 520 113 973 584 699 693 1000 968 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 712 + + + __cstat + 869 + + + BICOMP + 513 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 675 968 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 857 + + + __cstat + 902 + + + BICOMP + 844 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 972 + + + BICOMP + 523 699 973 735 113 704 1000 972 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 577 + + + __cstat + 758 + + + BICOMP + 563 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 675 968 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 770 + + + __cstat + 864 + + + BICOMP + 622 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 968 + + + BICOMP + 704 973 520 113 584 699 693 1000 968 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 875 + + + __cstat + 684 + + + BICOMP + 490 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 968 + + + BICOMP + 584 968 699 693 154 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 763 + + + __cstat + 913 + + + BICOMP + 465 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 972 + + + BICOMP + 523 699 973 735 113 704 1000 972 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 587 + + + __cstat + 799 + + + BICOMP + 605 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 972 + + + BICOMP + 704 972 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\..\src\tx_misra.s + + + AARM + 749 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 901 + + + __cstat + 746 + + + BICOMP + 904 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 675 968 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_time_set.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_timer_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_time_slice.c + C-STAT + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + C-STAT + + + $PROJ_DIR$\tx_thread_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_preemption_change.c + C-STAT + + + $PROJ_DIR$\tx_thread_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_timeout.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_set.c + C-STAT + + + $PROJ_DIR$\txe_queue_delete.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_create.c + C-STAT + + + $PROJ_DIR$\tx_queue_info_get.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_put_notify.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + C-STAT + + + $PROJ_DIR$\tx_timer_create.c + C-STAT + + + $PROJ_DIR$\txe_thread_terminate.c + C-STAT + + + $PROJ_DIR$\tx_queue_receive.c + C-STAT + + + $PROJ_DIR$\tx_thread_time_slice_change.c + C-STAT + + + $PROJ_DIR$\tx_thread_identify.c + C-STAT + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + C-STAT + + + $PROJ_DIR$\tx_thread_relinquish.c + C-STAT + + + $PROJ_DIR$\txe_thread_suspend.c + C-STAT + + + $PROJ_DIR$\tx_thread_system_resume.c + C-STAT + + + $PROJ_DIR$\tx_queue_initialize.c + C-STAT + + + $PROJ_DIR$\tx_queue_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_thread_priority_change.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_initialize.c + C-STAT + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\txe_thread_time_slice_change.c + C-STAT + + + $PROJ_DIR$\tx_queue_send.c + C-STAT + + + $PROJ_DIR$\tx_thread_system_suspend.c + C-STAT + + + $PROJ_DIR$\txe_timer_change.c + C-STAT + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + C-STAT + + + $PROJ_DIR$\tx_queue_front_send.c + C-STAT + + + $PROJ_DIR$\tx_thread_wait_abort.c + C-STAT + + + $PROJ_DIR$\txe_timer_deactivate.c + C-STAT + + + $PROJ_DIR$\tx_queue_send_notify.c + C-STAT + + + $PROJ_DIR$\tx_thread_suspend.c + C-STAT + + + $PROJ_DIR$\tx_thread_sleep.c + C-STAT + + + $PROJ_DIR$\txe_thread_resume.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_get.c + C-STAT + + + $PROJ_DIR$\tx_queue_flush.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_put.c + C-STAT + + + $PROJ_DIR$\tx_thread_create.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_initialize.c + C-STAT + + + $PROJ_DIR$\tx_time_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_delete.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_timer_change.c + C-STAT + + + $PROJ_DIR$\txe_byte_allocate.c + C-STAT + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_delete.c + C-STAT + + + $PROJ_DIR$\txe_queue_send_notify.c + C-STAT + + + $PROJ_DIR$\tx_timer_deactivate.c + C-STAT + + + $PROJ_DIR$\tx_timer_system_deactivate.c + C-STAT + + + $PROJ_DIR$\txe_mutex_info_get.c + C-STAT + + + $PROJ_DIR$\txe_queue_front_send.c + C-STAT + + + $PROJ_DIR$\txe_queue_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_trace_enable.c + C-STAT + + + $PROJ_DIR$\txe_mutex_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + C-STAT + + + $PROJ_DIR$\tx_timer_activate.c + C-STAT + + + $PROJ_DIR$\tx_trace_interrupt_control.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_get.c + C-STAT + + + $PROJ_DIR$\tx_trace_initialize.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_create.c + C-STAT + + + $PROJ_DIR$\txe_queue_info_get.c + C-STAT + + + $PROJ_DIR$\txe_queue_send.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + C-STAT + + + $PROJ_DIR$\tx_timer_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_shell_entry.c + C-STAT + + + $PROJ_DIR$\tx_thread_reset.c + C-STAT + + + $PROJ_DIR$\tx_trace_user_event_insert.c + C-STAT + + + $PROJ_DIR$\tx_trace_event_filter.c + C-STAT + + + $PROJ_DIR$\tx_timer_initialize.c + C-STAT + + + $PROJ_DIR$\tx_timer_system_activate.c + C-STAT + + + $PROJ_DIR$\tx_trace_object_register.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_trace_object_unregister.c + C-STAT + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + C-STAT + + + $PROJ_DIR$\txe_queue_receive.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_put.c + C-STAT + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + C-STAT + + + $PROJ_DIR$\tx_thread_resume.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_create.c + C-STAT + + + $PROJ_DIR$\txe_block_allocate.c + C-STAT + + + $PROJ_DIR$\tx_thread_terminate.c + C-STAT + + + $PROJ_DIR$\tx_thread_stack_analyze.c + C-STAT + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + C-STAT + + + $PROJ_DIR$\tx_queue_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_delete.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_delete.c + C-STAT + + + $PROJ_DIR$\tx_trace_event_unfilter.c + C-STAT + + + $PROJ_DIR$\txe_queue_create.c + C-STAT + + + $PROJ_DIR$\txe_timer_info_get.c + C-STAT + + + $PROJ_DIR$\tx_timer_expiration_process.c + C-STAT + + + $PROJ_DIR$\txe_thread_preemption_change.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_create.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_set_notify.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_delete.c + C-STAT + + + $PROJ_DIR$\txe_block_release.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_create.c + C-STAT + + + $PROJ_DIR$\txe_timer_create.c + C-STAT + + + $PROJ_DIR$\txe_byte_release.c + C-STAT + + + $PROJ_DIR$\txe_thread_relinquish.c + C-STAT + + + $PROJ_DIR$\txe_thread_wait_abort.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_info_get.c + C-STAT + + + $PROJ_DIR$\txe_thread_priority_change.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_delete.c + C-STAT + + + $PROJ_DIR$\txe_mutex_create.c + C-STAT + + + $PROJ_DIR$\txe_mutex_put.c + C-STAT + + + $PROJ_DIR$\tx_timer_delete.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_get.c + C-STAT + + + $PROJ_DIR$\txe_timer_activate.c + C-STAT + + + $PROJ_DIR$\txe_queue_flush.c + C-STAT + + + $PROJ_DIR$\tx_timer_thread_entry.c + C-STAT + + + $PROJ_DIR$\tx_trace_disable.c + C-STAT + + + $PROJ_DIR$\txe_timer_delete.c + C-STAT + + + $PROJ_DIR$\txe_thread_create.c + C-STAT + + + $PROJ_DIR$\txe_thread_delete.c + C-STAT + + + $PROJ_DIR$\txe_mutex_delete.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_info_get.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_info_get.c + C-STAT + + + $PROJ_DIR$\txe_thread_reset.c + C-STAT + + + $PROJ_DIR$\txe_mutex_get.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_prioritize.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_put_notify.c + C-STAT + + + $PROJ_DIR$\txe_thread_info_get.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_delete.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_create.c + C-STAT + + + $PROJ_DIR$\tx_mutex_put.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_set_notify.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_initialize.c + C-STAT + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + C-STAT + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_set.c + C-STAT + + + $PROJ_DIR$\tx_mutex_initialize.c + C-STAT + + + $PROJ_DIR$\tx_mutex_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_mutex_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_get.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_info_get.c + C-STAT + + + $PROJ_DIR$\tx_queue_delete.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_create.c + C-STAT + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + C-STAT + + + $PROJ_DIR$\tx_block_release.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_delete.c + C-STAT + + + $PROJ_DIR$\tx_byte_release.c + C-STAT + + + $PROJ_DIR$\tx_mutex_get.c + C-STAT + + + $PROJ_DIR$\tx_iar.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_initialize_high_level.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_delete.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_initialize.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_create.c + C-STAT + + + $PROJ_DIR$\tx_queue_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_create.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_priority_change.c + C-STAT + + + $PROJ_DIR$\tx_queue_create.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_search.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_initialize.c + C-STAT + + + $PROJ_DIR$\tx_byte_allocate.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_block_allocate.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_delete.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + C-STAT + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + ICCARM + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m3/iar/example_build/tx.ewd b/ports/cortex_m3/iar/example_build/tx.ewd new file mode 100644 index 00000000..b2b3f2fe --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m3/iar/example_build/tx.ewp b/ports/cortex_m3/iar/example_build/tx.ewp new file mode 100644 index 00000000..101935ef --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.ewp @@ -0,0 +1,2743 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m3/iar/example_build/tx.ewt b/ports/cortex_m3/iar/example_build/tx.ewt new file mode 100644 index 00000000..bfd5f907 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.ewt @@ -0,0 +1,3403 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m3/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m3/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..ab6a346c --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,181 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 7200000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + ORR r1, r1, #1 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define SystTick Handler. */ +; + + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +SysTick_Handler: +__tx_SysTickHandler: +; VOID SysTickHandler (VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, lr} + BX LR +; } + + END + + diff --git a/ports/cortex_m3/iar/inc/tx_port.h b/ports/cortex_m3/iar/inc/tx_port.h new file mode 100644 index 00000000..538187c6 --- /dev/null +++ b/ports/cortex_m3/iar/inc/tx_port.h @@ -0,0 +1,375 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M3/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef signed int INT; +typedef unsigned int UINT; +typedef signed long LONG; +typedef unsigned long ULONG; +typedef signed short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024UL) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT)__CLZ(__RBIT((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M3/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + + diff --git a/ports/cortex_m3/iar/readme_threadx.txt b/ports/cortex_m3/iar/readme_threadx.txt new file mode 100644 index 00000000..22a46139 --- /dev/null +++ b/ports/cortex_m3/iar/readme_threadx.txt @@ -0,0 +1,158 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-M3 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-M3 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {lr} + + ; ISR processing goes here, including any needed function calls. + + POP {lr} + BX lr + + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-M3 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/iar/src/tx_iar.c b/ports/cortex_m3/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m3/iar/src/tx_misra.s b/ports/cortex_m3/iar/src/tx_misra.s new file mode 100644 index 00000000..62559a05 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_misra.s @@ -0,0 +1,1003 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** ThreadX MISRA Compliance */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + #define SHT_PROGBITS 0x1 + + EXTERN __aeabi_memset + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_interrupt_disable + EXTERN _tx_thread_interrupt_restore + EXTERN _tx_thread_stack_analyze + EXTERN _tx_thread_stack_error_handler + EXTERN _tx_thread_system_state +#ifdef TX_ENABLE_EVENT_TRACE + EXTERN _tx_trace_buffer_current_ptr + EXTERN _tx_trace_buffer_end_ptr + EXTERN _tx_trace_buffer_start_ptr + EXTERN _tx_trace_event_enable_bits + EXTERN _tx_trace_full_notify_function + EXTERN _tx_trace_header_ptr +#endif + + PUBLIC _tx_misra_always_true + PUBLIC _tx_misra_block_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_byte_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_char_to_uchar_pointer_convert + PUBLIC _tx_misra_const_char_to_char_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_entry_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_indirect_void_to_uchar_pointer_convert + PUBLIC _tx_misra_memset + PUBLIC _tx_misra_message_copy +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_object_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_pointer_to_ulong_convert + PUBLIC _tx_misra_status_get + PUBLIC _tx_misra_thread_stack_check +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_time_stamp_get +#endif + PUBLIC _tx_misra_timer_indirect_to_void_pointer_convert + PUBLIC _tx_misra_timer_pointer_add + PUBLIC _tx_misra_timer_pointer_dif +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_trace_event_insert +#endif + PUBLIC _tx_misra_uchar_pointer_add + PUBLIC _tx_misra_uchar_pointer_dif + PUBLIC _tx_misra_uchar_pointer_sub + PUBLIC _tx_misra_uchar_to_align_type_pointer_convert + PUBLIC _tx_misra_uchar_to_block_pool_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_entry_pointer_convert + PUBLIC _tx_misra_uchar_to_header_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_indirect_byte_pool_pointer_convert + PUBLIC _tx_misra_uchar_to_indirect_uchar_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_object_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_void_pointer_convert + PUBLIC _tx_misra_ulong_pointer_add + PUBLIC _tx_misra_ulong_pointer_dif + PUBLIC _tx_misra_ulong_pointer_sub + PUBLIC _tx_misra_ulong_to_pointer_convert + PUBLIC _tx_misra_ulong_to_thread_pointer_convert + PUBLIC _tx_misra_user_timer_pointer_get + PUBLIC _tx_misra_void_to_block_pool_pointer_convert + PUBLIC _tx_misra_void_to_byte_pool_pointer_convert + PUBLIC _tx_misra_void_to_event_flags_pointer_convert + PUBLIC _tx_misra_void_to_indirect_uchar_pointer_convert + PUBLIC _tx_misra_void_to_mutex_pointer_convert + PUBLIC _tx_misra_void_to_queue_pointer_convert + PUBLIC _tx_misra_void_to_semaphore_pointer_convert + PUBLIC _tx_misra_void_to_thread_pointer_convert + PUBLIC _tx_misra_void_to_uchar_pointer_convert + PUBLIC _tx_misra_void_to_ulong_pointer_convert + PUBLIC _tx_misra_ipsr_get + PUBLIC _tx_version_id + + + SECTION `.data`:DATA:REORDER:NOROOT(2) + DATA +// 51 CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.0 MISRA C Compliant *"; +_tx_version_id: + DC8 43H, 6FH, 70H, 79H, 72H, 69H, 67H, 68H + DC8 74H, 20H, 28H, 63H, 29H, 20H, 31H, 39H + DC8 39H, 36H, 2DH, 32H, 30H, 31H, 38H, 20H + DC8 45H, 78H, 70H, 72H, 65H, 73H, 73H, 20H + DC8 4CH, 6FH, 67H, 69H, 63H, 20H, 49H, 6EH + DC8 63H, 2EH, 20H, 2AH, 20H, 54H, 68H, 72H + DC8 65H, 61H, 64H, 58H, 20H, 35H, 2EH, 38H + DC8 20H, 4DH, 49H, 53H, 52H, 41H, 20H, 43H + DC8 20H, 43H, 6FH, 6DH, 70H, 6CH, 69H, 61H + DC8 6EH, 74H, 20H, 2AH, 0 + DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_memset: + PUSH {R4,LR} + MOVS R4,R0 + MOVS R0,R2 + MOVS R2,R1 + MOVS R1,R0 + MOVS R0,R4 + BL __aeabi_memset + POP {R4,PC} ;; return + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_add: + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_sub: + RSBS R1,R1,#+0 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_dif: + SUBS R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_pointer_to_ulong_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_sub: + MVNS R2,#+3 + MULS R1,R2,R1 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ +/** UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_message_copy: + PUSH {R4,R5} + LDR R3,[R0, #+0] + LDR R4,[R1, #+0] + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + CMP R2,#+2 + BCC.N ??_tx_misra_message_copy_0 + SUBS R2,R2,#+1 + B.N ??_tx_misra_message_copy_1 +??_tx_misra_message_copy_2: + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + SUBS R2,R2,#+1 +??_tx_misra_message_copy_1: + CMP R2,#+0 + BNE.N ??_tx_misra_message_copy_2 +??_tx_misra_message_copy_0: + STR R3,[R0, #+0] + STR R4,[R1, #+0] + POP {R4,R5} + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ +/** TX_TIMER_INTERNAL **ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ +/** **ptr1, ULONG size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ +/** *internal_timer, TX_TIMER **user_timer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_user_timer_pointer_get: + ADDS R2,R0,#+8 + SUBS R2,R2,R0 + RSBS R2,R2,#+0 + ADD R0,R0,R2 + STR R0,[R1, #+0] + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ +/** VOID **highest_stack); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_thread_stack_check: + PUSH {R3-R5,LR} + MOVS R4,R0 + MOVS R5,R1 + BL _tx_thread_interrupt_disable + CMP R4,#+0 + BEQ.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+0] + LDR.N R2,??DataTable2 ;; 0x54485244 + CMP R1,R2 + BNE.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+8] + LDR R2,[R5, #+0] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_1 + LDR R1,[R4, #+8] + STR R1,[R5, #+0] +??_tx_misra_thread_stack_check_1: + LDR R1,[R4, #+12] + LDR R1,[R1, #+0] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R4, #+16] + LDR R1,[R1, #+1] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R5, #+0] + LDR R2,[R4, #+12] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_3 +??_tx_misra_thread_stack_check_2: + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_error_handler + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_3: + LDR R1,[R5, #+0] + LDR R1,[R1, #-4] + CMP R1,#-269488145 + BEQ.N ??_tx_misra_thread_stack_check_0 + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_analyze + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_0: + BL _tx_thread_interrupt_restore + POP {R0,R4,R5,PC} ;; return + +#ifdef TX_ENABLE_EVENT_TRACE + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_trace_event_insert(ULONG event_id, */ +/** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ +/** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_trace_event_insert: + PUSH {R3-R7,LR} + LDR.N R4,??DataTable2_1 + LDR R4,[R4, #+0] + CMP R4,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_2 + LDR R5,[R5, #+0] + LDR R6,[SP, #+28] + TST R5,R6 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_3 + LDR R5,[R5, #+0] + LDR.N R6,??DataTable2_4 + LDR R6,[R6, #+0] + CMP R5,#+0 + BNE.N ??_tx_misra_trace_event_insert_1 + LDR R5,[R6, #+44] + LDR R7,[R6, #+60] + LSLS R7,R7,#+16 + ORRS R7,R7,#0x80000000 + ORRS R5,R7,R5 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_1: + CMP R5,#-252645136 + BCS.N ??_tx_misra_trace_event_insert_3 + MOVS R5,R6 + MOVS R6,#-1 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_3: + MOVS R6,#-252645136 + MOVS R5,#+0 +??_tx_misra_trace_event_insert_2: + STR R6,[R4, #+0] + STR R5,[R4, #+4] + STR R0,[R4, #+8] + LDR R0,[SP, #+32] + STR R0,[R4, #+12] + STR R1,[R4, #+16] + STR R2,[R4, #+20] + STR R3,[R4, #+24] + LDR R0,[SP, #+24] + STR R0,[R4, #+28] + ADDS R4,R4,#+32 + LDR.N R0,??DataTable2_5 + LDR R0,[R0, #+0] + CMP R4,R0 + BCC.N ??_tx_misra_trace_event_insert_4 + LDR.N R0,??DataTable2_6 + LDR R4,[R0, #+0] + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] + LDR.N R0,??DataTable2_8 + LDR R0,[R0, #+0] + CMP R0,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + LDR.N R1,??DataTable2_8 + LDR R1,[R1, #+0] + BLX R1 + B.N ??_tx_misra_trace_event_insert_0 +??_tx_misra_trace_event_insert_4: + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] +??_tx_misra_trace_event_insert_0: + POP {R0,R4-R7,PC} ;; return + + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_1: + DC32 _tx_trace_buffer_current_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_2: + DC32 _tx_trace_event_enable_bits + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_5: + DC32 _tx_trace_buffer_end_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_6: + DC32 _tx_trace_buffer_start_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_7: + DC32 _tx_trace_header_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_8: + DC32 _tx_trace_full_notify_function + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_time_stamp_get(VOID); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_time_stamp_get: + MOVS R0,#+0 + BX LR ;; return + +#endif + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2: + DC32 0x54485244 + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_3: + DC32 _tx_thread_system_state + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_4: + DC32 _tx_thread_current_ptr + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_always_true(void); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_always_true: + MOVS R0,#+1 + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_indirect_void_to_uchar_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************/ +/***********************************************************************************/ +/** */ +/** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ +/** */ +/***********************************************************************************/ +/***********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_block_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_block_pool_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************/ +/************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************/ +/************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_block_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************/ +/**************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************/ +/**************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_byte_pool_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_byte_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_align_type_pointer_convert: + BX LR ;; return + + +/****************************************************************************************************/ +/****************************************************************************************************/ +/** */ +/** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/****************************************************************************************************/ +/****************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_byte_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************************/ +/**************************************************************************************************/ +/** */ +/** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************************/ +/**************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_event_flags_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_ulong_pointer_convert: + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_mutex_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_status_get(UINT status); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_status_get: + MOVS R0,#+0 + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_queue_pointer_convert: + BX LR ;; return + + +/****************************************************************************************/ +/****************************************************************************************/ +/** */ +/** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ +/** */ +/****************************************************************************************/ +/****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_semaphore_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_void_pointer_convert: + BX LR ;; return + + +/*********************************************************************************/ +/*********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ +/** */ +/*********************************************************************************/ +/*********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_thread_pointer_convert: + BX LR ;; return + + +/***************************************************************************************************/ +/***************************************************************************************************/ +/** */ +/** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ +/** */ +/***************************************************************************************************/ +/***************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_indirect_to_void_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_const_char_to_char_pointer_convert: + BX LR ;; return + + +/**********************************************************************************/ +/**********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ +/** */ +/**********************************************************************************/ +/**********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_thread_pointer_convert: + BX LR ;; return + + +#ifdef TX_ENABLE_EVENT_TRACE + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_object_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_object_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_header_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_entry_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_entry_to_uchar_pointer_convert: + BX LR ;; return +#endif + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_char_to_uchar_pointer_convert: + BX LR ;; return + + +***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_ipsr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ipsr_get: + MRS R0, IPSR + BX LR ;; return + + + SECTION `.iar_vfe_header`:DATA:NOALLOC:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA + DC32 0 + + END diff --git a/ports/cortex_m3/iar/src/tx_thread_context_restore.s b/ports/cortex_m3/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..e3e42286 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_context_restore.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* [_tx_execution_isr_exit] Execution profiling ISR exit */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr +#endif +; + POP {lr} + BX lr +; +;} + END diff --git a/ports/cortex_m3/iar/src/tx_thread_context_save.s b/ports/cortex_m3/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..49e11d68 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_context_save.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* [_tx_execution_isr_enter] Execution profiling ISR enter */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover return address +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m3/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..d956fd6d --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..38a2083d --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..356c8aac --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m3/iar/src/tx_thread_schedule.s b/ports/cortex_m3/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..aa5f7764 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_schedule.s @@ -0,0 +1,250 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context PendSV handler. */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts +#endif + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_stack_build.s b/ports/cortex_m3/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..96526cc1 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_stack_build.s @@ -0,0 +1,144 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_system_return.s b/ports/cortex_m3/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..fa0ef7a3 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_system_return.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_timer_interrupt.s b/ports/cortex_m3/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..94af5d87 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_timer_interrupt.s @@ -0,0 +1,268 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* expiration functions are called. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired: +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt new file mode 100644 index 00000000..5fcedc85 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt @@ -0,0 +1,300 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Demo + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(152=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T5F + + + 0 + UL2CM3 + -UV0289BJE -O14 -S0 -C0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_16 -FS00 -FL04000 + + + + + + 0 + 1 + thread_0_counter + + + 1 + 1 + thread_1_counter + + + 2 + 1 + thread_2_counter + + + 3 + 1 + thread_3_counter + + + 4 + 1 + thread_4_counter + + + 5 + 1 + thread_5_counter + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + .\tx_initialize_low_level.s + tx_initialize_low_level.s + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\sample_threadx.c + sample_threadx.c + 0 + 0 + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 56 + 12 + 1633 + 671 + + + + + + + Library_Group + 0 + 0 + 0 + 0 + + 2 + 3 + 4 + 0 + 0 + 0 + .\ThreadX_Library.lib + ThreadX_Library.lib + 0 + 0 + + + + diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj new file mode 100644 index 00000000..3847190f --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj @@ -0,0 +1,573 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Demo + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M3 + ARM + CLOCK(12000000) CPUTYPE("Cortex-M3") ESEL ELITTLE + + + + 4349 + + + + + + + + + + + + 0 + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\ + ThreadX_Demo + 1 + 0 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 0 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ../inc;../../../../common/inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0x00000000 + 0x20000000 + + + + + --first __tx_vectors --entry=__main + + + + + + + + Source Group + + + 0 + 1 + 1 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 0 + + + + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + tx_initialize_low_level.s + 2 + .\tx_initialize_low_level.s + + + 2 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + sample_threadx.c + 1 + .\sample_threadx.c + + + + + Library_Group + + + ThreadX_Library.lib + 4 + .\ThreadX_Library.lib + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Library.plg b/ports/cortex_m3/keil/example_build/ThreadX_Library.plg new file mode 100644 index 00000000..6b87c5cf --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Library.plg @@ -0,0 +1,9 @@ + + +
+

µVision Build Log

+

Project:

+C:\threadx\cortex-m3\keil\ThreadX_Library.uvproj +Project File Date: 07/19/2012 + +

Output:

diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt new file mode 100644 index 00000000..ac554f54 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt @@ -0,0 +1,2664 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Library_Project + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_16 -FS00 -FL04000 + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_disable.s + tx_thread_interrupt_disable.s + 0 + 0 + + + 1 + 2 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_control.s + tx_thread_interrupt_control.s + 0 + 0 + + + 1 + 3 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_restore.s + tx_thread_context_restore.s + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_save.s + tx_thread_context_save.s + 0 + 0 + + + 1 + 5 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_restore.s + tx_thread_interrupt_restore.s + 0 + 0 + + + 1 + 6 + 2 + 0 + 0 + 0 + ..\src\tx_thread_schedule.s + tx_thread_schedule.s + 0 + 0 + + + 1 + 7 + 2 + 0 + 0 + 0 + ..\src\tx_thread_stack_build.s + tx_thread_stack_build.s + 0 + 0 + + + 1 + 8 + 2 + 0 + 0 + 0 + ..\src\tx_thread_system_return.s + tx_thread_system_return.s + 0 + 0 + + + 1 + 9 + 2 + 0 + 0 + 0 + ..\src\tx_timer_interrupt.s + tx_timer_interrupt.s + 0 + 0 + + + 1 + 10 + 5 + 0 + 0 + 0 + ..\inc\tx_port.h + tx_port.h + 0 + 0 + + + 1 + 11 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_api.h + tx_api.h + 0 + 0 + + + 1 + 12 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_block_pool.h + tx_block_pool.h + 0 + 0 + + + 1 + 13 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_byte_pool.h + tx_byte_pool.h + 0 + 0 + + + 1 + 14 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_event_flags.h + tx_event_flags.h + 0 + 0 + + + 1 + 15 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_initialize.h + tx_initialize.h + 0 + 0 + + + 1 + 16 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_mutex.h + tx_mutex.h + 0 + 0 + + + 1 + 17 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_queue.h + tx_queue.h + 0 + 0 + + + 1 + 18 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_semaphore.h + tx_semaphore.h + 0 + 0 + + + 1 + 19 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_thread.h + tx_thread.h + 0 + 0 + + + 1 + 20 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_timer.h + tx_timer.h + 0 + 0 + + + 1 + 21 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_trace.h + tx_trace.h + 0 + 0 + + + 1 + 22 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_user.h + tx_user.h + 0 + 0 + + + 1 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_allocate.c + tx_block_allocate.c + 0 + 0 + + + 1 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + tx_block_pool_cleanup.c + 0 + 0 + + + 1 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_create.c + tx_block_pool_create.c + 0 + 0 + + + 1 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_delete.c + tx_block_pool_delete.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_info_get.c + tx_block_pool_info_get.c + 0 + 0 + + + 1 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_initialize.c + tx_block_pool_initialize.c + 0 + 0 + + + 1 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + tx_block_pool_performance_info_get.c + 0 + 0 + + + 1 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + tx_block_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + tx_block_pool_prioritize.c + 0 + 0 + + + 1 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_release.c + tx_block_release.c + 0 + 0 + + + 1 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_allocate.c + tx_byte_allocate.c + 0 + 0 + + + 1 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + tx_byte_pool_cleanup.c + 0 + 0 + + + 1 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_create.c + tx_byte_pool_create.c + 0 + 0 + + + 1 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_delete.c + tx_byte_pool_delete.c + 0 + 0 + + + 1 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + tx_byte_pool_info_get.c + 0 + 0 + + + 1 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + tx_byte_pool_initialize.c + 0 + 0 + + + 1 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + tx_byte_pool_performance_info_get.c + 0 + 0 + + + 1 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + tx_byte_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + tx_byte_pool_prioritize.c + 0 + 0 + + + 1 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_search.c + tx_byte_pool_search.c + 0 + 0 + + + 1 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_release.c + tx_byte_release.c + 0 + 0 + + + 1 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + tx_event_flags_cleanup.c + 0 + 0 + + + 1 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_create.c + tx_event_flags_create.c + 0 + 0 + + + 1 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_delete.c + tx_event_flags_delete.c + 0 + 0 + + + 1 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_get.c + tx_event_flags_get.c + 0 + 0 + + + 1 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_info_get.c + tx_event_flags_info_get.c + 0 + 0 + + + 1 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_initialize.c + tx_event_flags_initialize.c + 0 + 0 + + + 1 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + tx_event_flags_performance_info_get.c + 0 + 0 + + + 1 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + tx_event_flags_performance_system_info_get.c + 0 + 0 + + + 1 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set.c + tx_event_flags_set.c + 0 + 0 + + + 1 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + tx_event_flags_set_notify.c + 0 + 0 + + + 1 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_high_level.c + tx_initialize_high_level.c + 0 + 0 + + + 1 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + tx_initialize_kernel_enter.c + 0 + 0 + + + 1 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + tx_initialize_kernel_setup.c + 0 + 0 + + + 1 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_misra.c + tx_misra.c + 0 + 0 + + + 1 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_cleanup.c + tx_mutex_cleanup.c + 0 + 0 + + + 1 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_create.c + tx_mutex_create.c + 0 + 0 + + + 1 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_delete.c + tx_mutex_delete.c + 0 + 0 + + + 1 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_get.c + tx_mutex_get.c + 0 + 0 + + + 1 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_info_get.c + tx_mutex_info_get.c + 0 + 0 + + + 1 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_initialize.c + tx_mutex_initialize.c + 0 + 0 + + + 1 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + tx_mutex_performance_info_get.c + 0 + 0 + + + 1 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + tx_mutex_performance_system_info_get.c + 0 + 0 + + + 1 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_prioritize.c + tx_mutex_prioritize.c + 0 + 0 + + + 1 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_priority_change.c + tx_mutex_priority_change.c + 0 + 0 + + + 1 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_put.c + tx_mutex_put.c + 0 + 0 + + + 1 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_cleanup.c + tx_queue_cleanup.c + 0 + 0 + + + 1 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_create.c + tx_queue_create.c + 0 + 0 + + + 1 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_delete.c + tx_queue_delete.c + 0 + 0 + + + 1 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_flush.c + tx_queue_flush.c + 0 + 0 + + + 1 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_front_send.c + tx_queue_front_send.c + 0 + 0 + + + 1 + 74 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_info_get.c + tx_queue_info_get.c + 0 + 0 + + + 1 + 75 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_initialize.c + tx_queue_initialize.c + 0 + 0 + + + 1 + 76 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + tx_queue_performance_info_get.c + 0 + 0 + + + 1 + 77 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + tx_queue_performance_system_info_get.c + 0 + 0 + + + 1 + 78 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_prioritize.c + tx_queue_prioritize.c + 0 + 0 + + + 1 + 79 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_receive.c + tx_queue_receive.c + 0 + 0 + + + 1 + 80 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send.c + tx_queue_send.c + 0 + 0 + + + 1 + 81 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send_notify.c + tx_queue_send_notify.c + 0 + 0 + + + 1 + 82 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + tx_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 83 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + tx_semaphore_cleanup.c + 0 + 0 + + + 1 + 84 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_create.c + tx_semaphore_create.c + 0 + 0 + + + 1 + 85 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_delete.c + tx_semaphore_delete.c + 0 + 0 + + + 1 + 86 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_get.c + tx_semaphore_get.c + 0 + 0 + + + 1 + 87 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_info_get.c + tx_semaphore_info_get.c + 0 + 0 + + + 1 + 88 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_initialize.c + tx_semaphore_initialize.c + 0 + 0 + + + 1 + 89 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + tx_semaphore_performance_info_get.c + 0 + 0 + + + 1 + 90 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + tx_semaphore_performance_system_info_get.c + 0 + 0 + + + 1 + 91 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + tx_semaphore_prioritize.c + 0 + 0 + + + 1 + 92 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put.c + tx_semaphore_put.c + 0 + 0 + + + 1 + 93 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + tx_semaphore_put_notify.c + 0 + 0 + + + 1 + 94 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_create.c + tx_thread_create.c + 0 + 0 + + + 1 + 95 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_delete.c + tx_thread_delete.c + 0 + 0 + + + 1 + 96 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + tx_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 97 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_identify.c + tx_thread_identify.c + 0 + 0 + + + 1 + 98 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_info_get.c + tx_thread_info_get.c + 0 + 0 + + + 1 + 99 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_initialize.c + tx_thread_initialize.c + 0 + 0 + + + 1 + 100 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + tx_thread_performance_info_get.c + 0 + 0 + + + 1 + 101 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + tx_thread_performance_system_info_get.c + 0 + 0 + + + 1 + 102 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_preemption_change.c + tx_thread_preemption_change.c + 0 + 0 + + + 1 + 103 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_priority_change.c + tx_thread_priority_change.c + 0 + 0 + + + 1 + 104 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_relinquish.c + tx_thread_relinquish.c + 0 + 0 + + + 1 + 105 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_reset.c + tx_thread_reset.c + 0 + 0 + + + 1 + 106 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_resume.c + tx_thread_resume.c + 0 + 0 + + + 1 + 107 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_shell_entry.c + tx_thread_shell_entry.c + 0 + 0 + + + 1 + 108 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_sleep.c + tx_thread_sleep.c + 0 + 0 + + + 1 + 109 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + tx_thread_stack_analyze.c + 0 + 0 + + + 1 + 110 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + tx_thread_stack_error_handler.c + 0 + 0 + + + 1 + 111 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + tx_thread_stack_error_notify.c + 0 + 0 + + + 1 + 112 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_suspend.c + tx_thread_suspend.c + 0 + 0 + + + 1 + 113 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + tx_thread_system_preempt_check.c + 0 + 0 + + + 1 + 114 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_resume.c + tx_thread_system_resume.c + 0 + 0 + + + 1 + 115 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_suspend.c + tx_thread_system_suspend.c + 0 + 0 + + + 1 + 116 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_terminate.c + tx_thread_terminate.c + 0 + 0 + + + 1 + 117 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice.c + tx_thread_time_slice.c + 0 + 0 + + + 1 + 118 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + tx_thread_time_slice_change.c + 0 + 0 + + + 1 + 119 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_timeout.c + tx_thread_timeout.c + 0 + 0 + + + 1 + 120 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_wait_abort.c + tx_thread_wait_abort.c + 0 + 0 + + + 1 + 121 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_get.c + tx_time_get.c + 0 + 0 + + + 1 + 122 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_set.c + tx_time_set.c + 0 + 0 + + + 1 + 123 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_activate.c + tx_timer_activate.c + 0 + 0 + + + 1 + 124 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_change.c + tx_timer_change.c + 0 + 0 + + + 1 + 125 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_create.c + tx_timer_create.c + 0 + 0 + + + 1 + 126 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_deactivate.c + tx_timer_deactivate.c + 0 + 0 + + + 1 + 127 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_delete.c + tx_timer_delete.c + 0 + 0 + + + 1 + 128 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_expiration_process.c + tx_timer_expiration_process.c + 0 + 0 + + + 1 + 129 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_info_get.c + tx_timer_info_get.c + 0 + 0 + + + 1 + 130 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_initialize.c + tx_timer_initialize.c + 0 + 0 + + + 1 + 131 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + tx_timer_performance_info_get.c + 0 + 0 + + + 1 + 132 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + tx_timer_performance_system_info_get.c + 0 + 0 + + + 1 + 133 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_activate.c + tx_timer_system_activate.c + 0 + 0 + + + 1 + 134 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + tx_timer_system_deactivate.c + 0 + 0 + + + 1 + 135 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_thread_entry.c + tx_timer_thread_entry.c + 0 + 0 + + + 1 + 136 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + tx_trace_buffer_full_notify.c + 0 + 0 + + + 1 + 137 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_disable.c + tx_trace_disable.c + 0 + 0 + + + 1 + 138 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_enable.c + tx_trace_enable.c + 0 + 0 + + + 1 + 139 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_filter.c + tx_trace_event_filter.c + 0 + 0 + + + 1 + 140 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + tx_trace_event_unfilter.c + 0 + 0 + + + 1 + 141 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_initialize.c + tx_trace_initialize.c + 0 + 0 + + + 1 + 142 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + tx_trace_interrupt_control.c + 0 + 0 + + + 1 + 143 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + tx_trace_isr_enter_insert.c + 0 + 0 + + + 1 + 144 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + tx_trace_isr_exit_insert.c + 0 + 0 + + + 1 + 145 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_register.c + tx_trace_object_register.c + 0 + 0 + + + 1 + 146 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_unregister.c + tx_trace_object_unregister.c + 0 + 0 + + + 1 + 147 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + tx_trace_user_event_insert.c + 0 + 0 + + + 1 + 148 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_allocate.c + txe_block_allocate.c + 0 + 0 + + + 1 + 149 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_create.c + txe_block_pool_create.c + 0 + 0 + + + 1 + 150 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_delete.c + txe_block_pool_delete.c + 0 + 0 + + + 1 + 151 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_info_get.c + txe_block_pool_info_get.c + 0 + 0 + + + 1 + 152 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + txe_block_pool_prioritize.c + 0 + 0 + + + 1 + 153 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_release.c + txe_block_release.c + 0 + 0 + + + 1 + 154 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_allocate.c + txe_byte_allocate.c + 0 + 0 + + + 1 + 155 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_create.c + txe_byte_pool_create.c + 0 + 0 + + + 1 + 156 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_delete.c + txe_byte_pool_delete.c + 0 + 0 + + + 1 + 157 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + txe_byte_pool_info_get.c + 0 + 0 + + + 1 + 158 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + txe_byte_pool_prioritize.c + 0 + 0 + + + 1 + 159 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_release.c + txe_byte_release.c + 0 + 0 + + + 1 + 160 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_create.c + txe_event_flags_create.c + 0 + 0 + + + 1 + 161 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_delete.c + txe_event_flags_delete.c + 0 + 0 + + + 1 + 162 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_get.c + txe_event_flags_get.c + 0 + 0 + + + 1 + 163 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_info_get.c + txe_event_flags_info_get.c + 0 + 0 + + + 1 + 164 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set.c + txe_event_flags_set.c + 0 + 0 + + + 1 + 165 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + txe_event_flags_set_notify.c + 0 + 0 + + + 1 + 166 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_create.c + txe_mutex_create.c + 0 + 0 + + + 1 + 167 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_delete.c + txe_mutex_delete.c + 0 + 0 + + + 1 + 168 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_get.c + txe_mutex_get.c + 0 + 0 + + + 1 + 169 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_info_get.c + txe_mutex_info_get.c + 0 + 0 + + + 1 + 170 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_prioritize.c + txe_mutex_prioritize.c + 0 + 0 + + + 1 + 171 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_put.c + txe_mutex_put.c + 0 + 0 + + + 1 + 172 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_create.c + txe_queue_create.c + 0 + 0 + + + 1 + 173 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_delete.c + txe_queue_delete.c + 0 + 0 + + + 1 + 174 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_flush.c + txe_queue_flush.c + 0 + 0 + + + 1 + 175 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_front_send.c + txe_queue_front_send.c + 0 + 0 + + + 1 + 176 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_info_get.c + txe_queue_info_get.c + 0 + 0 + + + 1 + 177 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_prioritize.c + txe_queue_prioritize.c + 0 + 0 + + + 1 + 178 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_receive.c + txe_queue_receive.c + 0 + 0 + + + 1 + 179 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send.c + txe_queue_send.c + 0 + 0 + + + 1 + 180 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send_notify.c + txe_queue_send_notify.c + 0 + 0 + + + 1 + 181 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + txe_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 182 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_create.c + txe_semaphore_create.c + 0 + 0 + + + 1 + 183 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_delete.c + txe_semaphore_delete.c + 0 + 0 + + + 1 + 184 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_get.c + txe_semaphore_get.c + 0 + 0 + + + 1 + 185 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_info_get.c + txe_semaphore_info_get.c + 0 + 0 + + + 1 + 186 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + txe_semaphore_prioritize.c + 0 + 0 + + + 1 + 187 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put.c + txe_semaphore_put.c + 0 + 0 + + + 1 + 188 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + txe_semaphore_put_notify.c + 0 + 0 + + + 1 + 189 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_create.c + txe_thread_create.c + 0 + 0 + + + 1 + 190 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_delete.c + txe_thread_delete.c + 0 + 0 + + + 1 + 191 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + txe_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 192 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_info_get.c + txe_thread_info_get.c + 0 + 0 + + + 1 + 193 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_preemption_change.c + txe_thread_preemption_change.c + 0 + 0 + + + 1 + 194 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_priority_change.c + txe_thread_priority_change.c + 0 + 0 + + + 1 + 195 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_relinquish.c + txe_thread_relinquish.c + 0 + 0 + + + 1 + 196 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_reset.c + txe_thread_reset.c + 0 + 0 + + + 1 + 197 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_resume.c + txe_thread_resume.c + 0 + 0 + + + 1 + 198 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_suspend.c + txe_thread_suspend.c + 0 + 0 + + + 1 + 199 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_terminate.c + txe_thread_terminate.c + 0 + 0 + + + 1 + 200 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + txe_thread_time_slice_change.c + 0 + 0 + + + 1 + 201 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_wait_abort.c + txe_thread_wait_abort.c + 0 + 0 + + + 1 + 202 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_activate.c + txe_timer_activate.c + 0 + 0 + + + 1 + 203 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_change.c + txe_timer_change.c + 0 + 0 + + + 1 + 204 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_create.c + txe_timer_create.c + 0 + 0 + + + 1 + 205 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_deactivate.c + txe_timer_deactivate.c + 0 + 0 + + + 1 + 206 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_delete.c + txe_timer_delete.c + 0 + 0 + + + 1 + 207 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_info_get.c + txe_timer_info_get.c + 0 + 0 + + + +
diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj new file mode 100644 index 00000000..222522d0 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj @@ -0,0 +1,1550 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Library_Project + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M3 + ARM + CLOCK(12000000) CPUTYPE("Cortex-M3") ESEL ELITTLE + + + + 4349 + + + + + + + + + + + + 0 + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\ + ThreadX_Library + 0 + 1 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 1 + + 0 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1000 + + + 1 + 0x0 + 0x4000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + noTX_ENABLE_EXECUTION_CHANGE_NOTIFY + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Group + + + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + ../inc;../../../../common/inc + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + tx_thread_interrupt_disable.s + 2 + ..\src\tx_thread_interrupt_disable.s + + + tx_thread_interrupt_control.s + 2 + ..\src\tx_thread_interrupt_control.s + + + tx_thread_context_restore.s + 2 + ..\src\tx_thread_context_restore.s + + + tx_thread_context_save.s + 2 + ..\src\tx_thread_context_save.s + + + tx_thread_interrupt_restore.s + 2 + ..\src\tx_thread_interrupt_restore.s + + + tx_thread_schedule.s + 2 + ..\src\tx_thread_schedule.s + + + tx_thread_stack_build.s + 2 + ..\src\tx_thread_stack_build.s + + + tx_thread_system_return.s + 2 + ..\src\tx_thread_system_return.s + + + tx_timer_interrupt.s + 2 + ..\src\tx_timer_interrupt.s + + + tx_port.h + 5 + ..\inc\tx_port.h + + + tx_api.h + 5 + ..\..\..\..\common\inc\tx_api.h + + + tx_block_pool.h + 5 + ..\..\..\..\common\inc\tx_block_pool.h + + + tx_byte_pool.h + 5 + ..\..\..\..\common\inc\tx_byte_pool.h + + + tx_event_flags.h + 5 + ..\..\..\..\common\inc\tx_event_flags.h + + + tx_initialize.h + 5 + ..\..\..\..\common\inc\tx_initialize.h + + + tx_mutex.h + 5 + ..\..\..\..\common\inc\tx_mutex.h + + + tx_queue.h + 5 + ..\..\..\..\common\inc\tx_queue.h + + + tx_semaphore.h + 5 + ..\..\..\..\common\inc\tx_semaphore.h + + + tx_thread.h + 5 + ..\..\..\..\common\inc\tx_thread.h + + + tx_timer.h + 5 + ..\..\..\..\common\inc\tx_timer.h + + + tx_trace.h + 5 + ..\..\..\..\common\inc\tx_trace.h + + + tx_user.h + 5 + ..\..\..\..\common\inc\tx_user.h + + + tx_block_allocate.c + 1 + ..\..\..\..\common\src\tx_block_allocate.c + + + tx_block_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + + + tx_block_pool_create.c + 1 + ..\..\..\..\common\src\tx_block_pool_create.c + + + tx_block_pool_delete.c + 1 + ..\..\..\..\common\src\tx_block_pool_delete.c + + + tx_block_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_info_get.c + + + tx_block_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_block_pool_initialize.c + + + tx_block_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + tx_block_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + tx_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + + + tx_block_release.c + 1 + ..\..\..\..\common\src\tx_block_release.c + + + tx_byte_allocate.c + 1 + ..\..\..\..\common\src\tx_byte_allocate.c + + + tx_byte_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + tx_byte_pool_create.c + 1 + ..\..\..\..\common\src\tx_byte_pool_create.c + + + tx_byte_pool_delete.c + 1 + ..\..\..\..\common\src\tx_byte_pool_delete.c + + + tx_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + + + tx_byte_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + + + tx_byte_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + tx_byte_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + tx_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + tx_byte_pool_search.c + 1 + ..\..\..\..\common\src\tx_byte_pool_search.c + + + tx_byte_release.c + 1 + ..\..\..\..\common\src\tx_byte_release.c + + + tx_event_flags_cleanup.c + 1 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + + + tx_event_flags_create.c + 1 + ..\..\..\..\common\src\tx_event_flags_create.c + + + tx_event_flags_delete.c + 1 + ..\..\..\..\common\src\tx_event_flags_delete.c + + + tx_event_flags_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_get.c + + + tx_event_flags_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_info_get.c + + + tx_event_flags_initialize.c + 1 + ..\..\..\..\common\src\tx_event_flags_initialize.c + + + tx_event_flags_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + tx_event_flags_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + tx_event_flags_set.c + 1 + ..\..\..\..\common\src\tx_event_flags_set.c + + + tx_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + + + tx_initialize_high_level.c + 1 + ..\..\..\..\common\src\tx_initialize_high_level.c + + + tx_initialize_kernel_enter.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + tx_initialize_kernel_setup.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + tx_misra.c + 1 + ..\..\..\..\common\src\tx_misra.c + + + tx_mutex_cleanup.c + 1 + ..\..\..\..\common\src\tx_mutex_cleanup.c + + + tx_mutex_create.c + 1 + ..\..\..\..\common\src\tx_mutex_create.c + + + tx_mutex_delete.c + 1 + ..\..\..\..\common\src\tx_mutex_delete.c + + + tx_mutex_get.c + 1 + ..\..\..\..\common\src\tx_mutex_get.c + + + tx_mutex_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_info_get.c + + + tx_mutex_initialize.c + 1 + ..\..\..\..\common\src\tx_mutex_initialize.c + + + tx_mutex_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + tx_mutex_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + tx_mutex_prioritize.c + 1 + ..\..\..\..\common\src\tx_mutex_prioritize.c + + + tx_mutex_priority_change.c + 1 + ..\..\..\..\common\src\tx_mutex_priority_change.c + + + tx_mutex_put.c + 1 + ..\..\..\..\common\src\tx_mutex_put.c + + + tx_queue_cleanup.c + 1 + ..\..\..\..\common\src\tx_queue_cleanup.c + + + tx_queue_create.c + 1 + ..\..\..\..\common\src\tx_queue_create.c + + + tx_queue_delete.c + 1 + ..\..\..\..\common\src\tx_queue_delete.c + + + tx_queue_flush.c + 1 + ..\..\..\..\common\src\tx_queue_flush.c + + + tx_queue_front_send.c + 1 + ..\..\..\..\common\src\tx_queue_front_send.c + + + tx_queue_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_info_get.c + + + tx_queue_initialize.c + 1 + ..\..\..\..\common\src\tx_queue_initialize.c + + + tx_queue_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + + + tx_queue_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + tx_queue_prioritize.c + 1 + ..\..\..\..\common\src\tx_queue_prioritize.c + + + tx_queue_receive.c + 1 + ..\..\..\..\common\src\tx_queue_receive.c + + + tx_queue_send.c + 1 + ..\..\..\..\common\src\tx_queue_send.c + + + tx_queue_send_notify.c + 1 + ..\..\..\..\common\src\tx_queue_send_notify.c + + + tx_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + tx_semaphore_cleanup.c + 1 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + + + tx_semaphore_create.c + 1 + ..\..\..\..\common\src\tx_semaphore_create.c + + + tx_semaphore_delete.c + 1 + ..\..\..\..\common\src\tx_semaphore_delete.c + + + tx_semaphore_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_get.c + + + tx_semaphore_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_info_get.c + + + tx_semaphore_initialize.c + 1 + ..\..\..\..\common\src\tx_semaphore_initialize.c + + + tx_semaphore_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + tx_semaphore_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + tx_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + + + tx_semaphore_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_put.c + + + tx_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + + + tx_thread_create.c + 1 + ..\..\..\..\common\src\tx_thread_create.c + + + tx_thread_delete.c + 1 + ..\..\..\..\common\src\tx_thread_delete.c + + + tx_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + tx_thread_identify.c + 1 + ..\..\..\..\common\src\tx_thread_identify.c + + + tx_thread_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_info_get.c + + + tx_thread_initialize.c + 1 + ..\..\..\..\common\src\tx_thread_initialize.c + + + tx_thread_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + + + tx_thread_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + tx_thread_preemption_change.c + 1 + ..\..\..\..\common\src\tx_thread_preemption_change.c + + + tx_thread_priority_change.c + 1 + ..\..\..\..\common\src\tx_thread_priority_change.c + + + tx_thread_relinquish.c + 1 + ..\..\..\..\common\src\tx_thread_relinquish.c + + + tx_thread_reset.c + 1 + ..\..\..\..\common\src\tx_thread_reset.c + + + tx_thread_resume.c + 1 + ..\..\..\..\common\src\tx_thread_resume.c + + + tx_thread_shell_entry.c + 1 + ..\..\..\..\common\src\tx_thread_shell_entry.c + + + tx_thread_sleep.c + 1 + ..\..\..\..\common\src\tx_thread_sleep.c + + + tx_thread_stack_analyze.c + 1 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + + + tx_thread_stack_error_handler.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + tx_thread_stack_error_notify.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + tx_thread_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_suspend.c + + + tx_thread_system_preempt_check.c + 1 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + tx_thread_system_resume.c + 1 + ..\..\..\..\common\src\tx_thread_system_resume.c + + + tx_thread_system_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_system_suspend.c + + + tx_thread_terminate.c + 1 + ..\..\..\..\common\src\tx_thread_terminate.c + + + tx_thread_time_slice.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice.c + + + tx_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + + + tx_thread_timeout.c + 1 + ..\..\..\..\common\src\tx_thread_timeout.c + + + tx_thread_wait_abort.c + 1 + ..\..\..\..\common\src\tx_thread_wait_abort.c + + + tx_time_get.c + 1 + ..\..\..\..\common\src\tx_time_get.c + + + tx_time_set.c + 1 + ..\..\..\..\common\src\tx_time_set.c + + + tx_timer_activate.c + 1 + ..\..\..\..\common\src\tx_timer_activate.c + + + tx_timer_change.c + 1 + ..\..\..\..\common\src\tx_timer_change.c + + + tx_timer_create.c + 1 + ..\..\..\..\common\src\tx_timer_create.c + + + tx_timer_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_deactivate.c + + + tx_timer_delete.c + 1 + ..\..\..\..\common\src\tx_timer_delete.c + + + tx_timer_expiration_process.c + 1 + ..\..\..\..\common\src\tx_timer_expiration_process.c + + + tx_timer_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_info_get.c + + + tx_timer_initialize.c + 1 + ..\..\..\..\common\src\tx_timer_initialize.c + + + tx_timer_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + + + tx_timer_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + tx_timer_system_activate.c + 1 + ..\..\..\..\common\src\tx_timer_system_activate.c + + + tx_timer_system_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + + + tx_timer_thread_entry.c + 1 + ..\..\..\..\common\src\tx_timer_thread_entry.c + + + tx_trace_buffer_full_notify.c + 1 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + tx_trace_disable.c + 1 + ..\..\..\..\common\src\tx_trace_disable.c + + + tx_trace_enable.c + 1 + ..\..\..\..\common\src\tx_trace_enable.c + + + tx_trace_event_filter.c + 1 + ..\..\..\..\common\src\tx_trace_event_filter.c + + + tx_trace_event_unfilter.c + 1 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + + + tx_trace_initialize.c + 1 + ..\..\..\..\common\src\tx_trace_initialize.c + + + tx_trace_interrupt_control.c + 1 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + + + tx_trace_isr_enter_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + tx_trace_isr_exit_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + tx_trace_object_register.c + 1 + ..\..\..\..\common\src\tx_trace_object_register.c + + + tx_trace_object_unregister.c + 1 + ..\..\..\..\common\src\tx_trace_object_unregister.c + + + tx_trace_user_event_insert.c + 1 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + + + txe_block_allocate.c + 1 + ..\..\..\..\common\src\txe_block_allocate.c + + + txe_block_pool_create.c + 1 + ..\..\..\..\common\src\txe_block_pool_create.c + + + txe_block_pool_delete.c + 1 + ..\..\..\..\common\src\txe_block_pool_delete.c + + + txe_block_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_block_pool_info_get.c + + + txe_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + + + txe_block_release.c + 1 + ..\..\..\..\common\src\txe_block_release.c + + + txe_byte_allocate.c + 1 + ..\..\..\..\common\src\txe_byte_allocate.c + + + txe_byte_pool_create.c + 1 + ..\..\..\..\common\src\txe_byte_pool_create.c + + + txe_byte_pool_delete.c + 1 + ..\..\..\..\common\src\txe_byte_pool_delete.c + + + txe_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + + + txe_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + txe_byte_release.c + 1 + ..\..\..\..\common\src\txe_byte_release.c + + + txe_event_flags_create.c + 1 + ..\..\..\..\common\src\txe_event_flags_create.c + + + txe_event_flags_delete.c + 1 + ..\..\..\..\common\src\txe_event_flags_delete.c + + + txe_event_flags_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_get.c + + + txe_event_flags_info_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_info_get.c + + + txe_event_flags_set.c + 1 + ..\..\..\..\common\src\txe_event_flags_set.c + + + txe_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + + + txe_mutex_create.c + 1 + ..\..\..\..\common\src\txe_mutex_create.c + + + txe_mutex_delete.c + 1 + ..\..\..\..\common\src\txe_mutex_delete.c + + + txe_mutex_get.c + 1 + ..\..\..\..\common\src\txe_mutex_get.c + + + txe_mutex_info_get.c + 1 + ..\..\..\..\common\src\txe_mutex_info_get.c + + + txe_mutex_prioritize.c + 1 + ..\..\..\..\common\src\txe_mutex_prioritize.c + + + txe_mutex_put.c + 1 + ..\..\..\..\common\src\txe_mutex_put.c + + + txe_queue_create.c + 1 + ..\..\..\..\common\src\txe_queue_create.c + + + txe_queue_delete.c + 1 + ..\..\..\..\common\src\txe_queue_delete.c + + + txe_queue_flush.c + 1 + ..\..\..\..\common\src\txe_queue_flush.c + + + txe_queue_front_send.c + 1 + ..\..\..\..\common\src\txe_queue_front_send.c + + + txe_queue_info_get.c + 1 + ..\..\..\..\common\src\txe_queue_info_get.c + + + txe_queue_prioritize.c + 1 + ..\..\..\..\common\src\txe_queue_prioritize.c + + + txe_queue_receive.c + 1 + ..\..\..\..\common\src\txe_queue_receive.c + + + txe_queue_send.c + 1 + ..\..\..\..\common\src\txe_queue_send.c + + + txe_queue_send_notify.c + 1 + ..\..\..\..\common\src\txe_queue_send_notify.c + + + txe_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + txe_semaphore_create.c + 1 + ..\..\..\..\common\src\txe_semaphore_create.c + + + txe_semaphore_delete.c + 1 + ..\..\..\..\common\src\txe_semaphore_delete.c + + + txe_semaphore_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_get.c + + + txe_semaphore_info_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_info_get.c + + + txe_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + + + txe_semaphore_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_put.c + + + txe_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + + + txe_thread_create.c + 1 + ..\..\..\..\common\src\txe_thread_create.c + + + txe_thread_delete.c + 1 + ..\..\..\..\common\src\txe_thread_delete.c + + + txe_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + txe_thread_info_get.c + 1 + ..\..\..\..\common\src\txe_thread_info_get.c + + + txe_thread_preemption_change.c + 1 + ..\..\..\..\common\src\txe_thread_preemption_change.c + + + txe_thread_priority_change.c + 1 + ..\..\..\..\common\src\txe_thread_priority_change.c + + + txe_thread_relinquish.c + 1 + ..\..\..\..\common\src\txe_thread_relinquish.c + + + txe_thread_reset.c + 1 + ..\..\..\..\common\src\txe_thread_reset.c + + + txe_thread_resume.c + 1 + ..\..\..\..\common\src\txe_thread_resume.c + + + txe_thread_suspend.c + 1 + ..\..\..\..\common\src\txe_thread_suspend.c + + + txe_thread_terminate.c + 1 + ..\..\..\..\common\src\txe_thread_terminate.c + + + txe_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + + + txe_thread_wait_abort.c + 1 + ..\..\..\..\common\src\txe_thread_wait_abort.c + + + txe_timer_activate.c + 1 + ..\..\..\..\common\src\txe_timer_activate.c + + + txe_timer_change.c + 1 + ..\..\..\..\common\src\txe_timer_change.c + + + txe_timer_create.c + 1 + ..\..\..\..\common\src\txe_timer_create.c + + + txe_timer_deactivate.c + 1 + ..\..\..\..\common\src\txe_timer_deactivate.c + + + txe_timer_delete.c + 1 + ..\..\..\..\common\src\txe_timer_delete.c + + + txe_timer_info_get.c + 1 + ..\..\..\..\common\src\txe_timer_info_get.c + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m3/keil/example_build/sample_threadx.c b/ports/cortex_m3/keil/example_build/sample_threadx.c new file mode 100644 index 00000000..9b94bcd4 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/sample_threadx.c @@ -0,0 +1,262 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of six + threads of different priorities, using a message queue, semaphore, and an event flags group. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_QUEUE_SIZE 10 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_EVENT_FLAGS_GROUP event_flags_0; + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; + + +/* Define the thread stacks. */ + +UCHAR thread_0_stack[DEMO_STACK_SIZE]; +UCHAR thread_1_stack[DEMO_STACK_SIZE]; +UCHAR thread_2_stack[DEMO_STACK_SIZE]; +UCHAR thread_3_stack[DEMO_STACK_SIZE]; +UCHAR thread_4_stack[DEMO_STACK_SIZE]; +UCHAR thread_5_stack[DEMO_STACK_SIZE]; + + +/* Define the queue area. */ + +UCHAR queue_0_area[DEMO_QUEUE_SIZE*sizeof(ULONG)]; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); + + +volatile unsigned int bootloop; + +/* Define main entry point. */ + + + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + + + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + thread_0_stack, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + thread_1_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + thread_2_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + thread_3_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + thread_4_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + thread_5_stack, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, queue_0_area, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} diff --git a/ports/cortex_m3/keil/example_build/tx_initialize_low_level.s b/ports/cortex_m3/keil/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..4b55621a --- /dev/null +++ b/ports/cortex_m3/keil/example_build/tx_initialize_low_level.s @@ -0,0 +1,266 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + LDR R0, =__main + BX R0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M3/RVDS */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + STACK_SIZE) + LDR R2, =(HeapMem + HEAP_SIZE) + LDR R3, =StackMem + BX LR +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + + diff --git a/ports/cortex_m3/keil/inc/tx_port.h b/ports/cortex_m3/keil/inc/tx_port.h new file mode 100644 index 00000000..6b0adb0d --- /dev/null +++ b/ports/cortex_m3/keil/inc/tx_port.h @@ -0,0 +1,346 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M3/Keil */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M3/Keil Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m3/keil/readme_threadx.txt b/ports/cortex_m3/keil/readme_threadx.txt new file mode 100644 index 00000000..e0c99485 --- /dev/null +++ b/ports/cortex_m3/keil/readme_threadx.txt @@ -0,0 +1,152 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Thumb & 32-bit Mode + + Using the Keil Microcontroller Development Kit + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy, simply load the project file +ThreadX_Library.Uv2, which is located inside the "example_build" directory. + +Once the ThreadX library files are displayed in the project window, +select the "Build Target" operation and observe the compilation and assembly +of the ThreadX library. This project build produces the ThreadX library +file ThreadX_Library.lib. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the Keil simulator or +Cortex-M3 hardware. This demonstration is slightly smaller than typical ThreadX +demonstrations, and thus requires less than 7KB of Flash and less than 4KB of RAM. + +Building the demonstration is easy; simply open the ThreadX demonstration +project file ThreadX_Demo.Uv2, which is located inside the "example_build" +directory. + +Once open, select the "Build Target" operation and observe the compilation of +sample_threadx.c (which is the demonstration application) and linking with +ThreadX_Library.lib. The resulting file ThreadX_Demo.axf is a binary file that +can be downloaded and executed under the uVision simulator or Cortex-M3 hardware. + +For simulator execution, the following memory regions need to be defined via +the "Debug -> Memory Map" dialog: + +0x20000000, 0x20080000 [check read and write access] +0xE0000000, 0xE8000000 [check read and write access] + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using Keil tools is at label +__main. This is defined within the Keil compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M3 using Keil tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/keil/src/tx_thread_context_restore.s b/ports/cortex_m3/keil/src/tx_thread_context_restore.s new file mode 100644 index 00000000..d78da55e --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_context_restore.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/keil/src/tx_thread_context_save.s b/ports/cortex_m3/keil/src/tx_thread_context_save.s new file mode 100644 index 00000000..5645d361 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_context_save.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/keil/src/tx_thread_interrupt_control.s b/ports/cortex_m3/keil/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..de8f1029 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_interrupt_control.s @@ -0,0 +1,85 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s b/ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..2ff46cad --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s b/ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..43c20a0f --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m3/keil/src/tx_thread_schedule.s b/ports/cortex_m3/keil/src/tx_thread_schedule.s new file mode 100644 index 00000000..3b9f2cda --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_schedule.s @@ -0,0 +1,253 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + ALIGN + LTORG + END + diff --git a/ports/cortex_m3/keil/src/tx_thread_stack_build.s b/ports/cortex_m3/keil/src/tx_thread_stack_build.s new file mode 100644 index 00000000..bfc38038 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_stack_build.s @@ -0,0 +1,143 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M3 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/keil/src/tx_thread_system_return.s b/ports/cortex_m3/keil/src/tx_thread_system_return.s new file mode 100644 index 00000000..59d59bc6 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_system_return.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/keil/src/tx_timer_interrupt.s b/ports/cortex_m3/keil/src/tx_timer_interrupt.s new file mode 100644 index 00000000..e8c34551 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/ac5/example_build/build_threadx.bat b/ports/cortex_m4/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..8971b7fa --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m4 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m4/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m4/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..cf7a2d50 --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m4 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m4 -O2 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m4/ac5/example_build/sample_threadx.c b/ports/cortex_m4/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..dc0fdd8b --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,267 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, =0xE000ED88 ; Pickup address of CPACR + LDR r1, [r0] ; Pickup CPACR + MOV32 r2, 0x00F00000 ; Build enable value + ORR r1, r1, r2 ; Or in enable value + STR r1, [r0] ; Setup CPACR + ENDIF + LDR r0, =__main + BX r0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation. */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =HeapMem + LDR r1, =(StackMem + STACK_SIZE) + LDR r2, =(HeapMem + HEAP_SIZE) + LDR r3, =StackMem + BX lr +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/ac5/inc/tx_port.h b/ports/cortex_m4/ac5/inc/tx_port.h new file mode 100644 index 00000000..76bccfa6 --- /dev/null +++ b/ports/cortex_m4/ac5/inc/tx_port.h @@ -0,0 +1,471 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M4/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +#ifdef __TARGET_FPU_VFP + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#else + +#ifdef TX_SOURCE_CODE + +register ULONG _control __asm("control"); + +#endif +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +void _tx_vfp_access(void); + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_vfp_access(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + +/* Define FPU extension for the Cortex-M4. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M4/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m4/ac5/readme_threadx.txt b/ports/cortex_m4/ac5/readme_threadx.txt new file mode 100644 index 00000000..cfd9ae0b --- /dev/null +++ b/ports/cortex_m4/ac5/readme_threadx.txt @@ -0,0 +1,207 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Using ARM Compiler 5 (AC5) + + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +development environment. At this point you may run the build_threadx.bat batch +file. This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 s0 + 0x04 s1 + 0x08 s2 + 0x0C s3 + 0x10 s4 + 0x14 s5 + 0x18 s6 + 0x1C s7 + 0x20 s8 + 0x24 s9 + 0x28 s10 + 0x2C s11 + 0x30 s12 + 0x34 s13 + 0x38 s14 + 0x3C s15 + 0x40 s16 + 0x44 s17 + 0x48 s18 + 0x4C s19 + 0x50 s20 + 0x54 s21 + 0x58 s22 + 0x5C s23 + 0x60 s24 + 0x64 s25 + 0x68 s26 + 0x6C s27 + 0x70 s28 + 0x74 s29 + 0x78 s30 + 0x7C s31 + 0x80 fpscr + 0x84 r4 + 0x88 r5 + 0x8C r6 + 0x90 r7 + 0x94 r8 + 0x98 r9 + 0x9C r10 (sl) + 0xA0 r11 + 0xA4 r0 (Hardware stack starts here!!) + 0xA8 r1 + 0xAC r2 + 0xB0 r3 + 0xB4 r12 + 0xB8 lr + 0xBC pc + 0xC0 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M4 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. FPU Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M4 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/ac5/src/tx_thread_context_restore.s b/ports/cortex_m4/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..6d310a17 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_context_save.s b/ports/cortex_m4/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..052c3e5a --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_context_save.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr0, r} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..e97c7a47 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,80 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..e366e44b --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,78 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation. */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..1d0bffb6 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,77 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation. */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_schedule.s b/ports/cortex_m4/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..e78a040d --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_schedule.s @@ -0,0 +1,293 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; + IF {TARGET_FPU_VFP} = {TRUE} + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register + ENDIF +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save + ENDIF + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore + ENDIF + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_fpu_enable +tx_thread_fpu_enable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT tx_thread_fpu_disable +tx_thread_fpu_disable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT _tx_vfp_access +_tx_vfp_access + VMOV.F32 s0, s0 ; Simply access the VFP + BX lr ; Return to caller + + + ENDIF + + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/ac5/src/tx_thread_stack_build.s b/ports/cortex_m4/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..d9cf2a1f --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,138 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M4 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/ac5/src/tx_thread_system_return.s b/ports/cortex_m4/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..c61d0e53 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_system_return.s @@ -0,0 +1,91 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/ac5/src/tx_timer_interrupt.s b/ports/cortex_m4/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..af94c70c --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,266 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/gnu/CMakeLists.txt b/ports/cortex_m4/gnu/CMakeLists.txt index cb3091b9..71e2d4f2 100644 --- a/ports/cortex_m4/gnu/CMakeLists.txt +++ b/ports/cortex_m4/gnu/CMakeLists.txt @@ -9,7 +9,6 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_stack_build.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.S - # {{END_TARGET_SOURCES}} ) diff --git a/ports/cortex_m4/gnu/example_build/build_threadx.bat b/ports/cortex_m4/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..062092d3 --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m4/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m4/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..fd75f7bd --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb tx_simulator_startup.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb cortexm4_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m4 -ereset_handler -T sample_threadx.ld tx_simulator_startup.o cortexm4_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m4/gnu/example_build/cortexm4_crt0.s b/ports/cortex_m4/gnu/example_build/cortexm4_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/cortexm4_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m4/gnu/example_build/libc.a b/ports/cortex_m4/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..6c1567d15e3b2f049d1acd9038ac4fcd28005c18 GIT binary patch literal 743432 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 O)*~DyMuzP+-v0+$^S6Nj literal 0 HcmV?d00001 diff --git a/ports/cortex_m4/gnu/example_build/sample_threadx.c b/ports/cortex_m4/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..597f373c --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m4/gnu/example_build/sample_threadx.ld b/ports/cortex_m4/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m4/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S similarity index 95% rename from ports/cortex_m4/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S index ce57f6e7..00db7ac2 100644 --- a/ports/cortex_m4/gnu/src/tx_initialize_low_level_sample.S +++ b/ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S @@ -59,7 +59,7 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M4/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -93,6 +93,9 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), fixed */ +@/* GNU assembly comment, */ +@/* resulting in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_initialize_low_level(VOID) @@ -191,14 +194,14 @@ __tx_IntHandler: @ { PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif @ /* Do interrupt handler work here */ @ /* BL .... */ #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR @@ -216,11 +219,11 @@ SysTick_Handler: @ PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif BL _tx_timer_interrupt #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR diff --git a/ports/cortex_m4/gnu/src/tx_vector_table_sample.S b/ports/cortex_m4/gnu/example_build/tx_simulator_startup.s similarity index 100% rename from ports/cortex_m4/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m4/gnu/example_build/tx_simulator_startup.s diff --git a/ports/cortex_m4/gnu/readme_threadx.txt b/ports/cortex_m4/gnu/readme_threadx.txt new file mode 100644 index 00000000..a8c7c684 --- /dev/null +++ b/ports/cortex_m4/gnu/readme_threadx.txt @@ -0,0 +1,218 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M4 + +The ThreadX demonstration is designed to execute on Cortex-M4 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using gnu tools uses the standard GNU +Cortex-M4 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 s0 + 0x08 s1 + 0x0C s2 + 0x10 s3 + 0x14 s4 + 0x18 s5 + 0x1C s6 + 0x20 s7 + 0x24 s8 + 0x28 s9 + 0x2C s10 + 0x30 s11 + 0x34 s12 + 0x38 s13 + 0x3C s14 + 0x40 s15 + 0x44 s16 + 0x48 s17 + 0x4C s18 + 0x50 s19 + 0x54 s20 + 0x58 s21 + 0x5C s22 + 0x60 s23 + 0x64 s24 + 0x68 s25 + 0x6C s26 + 0x70 s27 + 0x74 s28 + 0x78 s29 + 0x7C s30 + 0x80 s31 + 0x84 fpscr + 0x88 r4 + 0x8C r5 + 0x90 r6 + 0x94 r7 + 0x98 r8 + 0x9C r9 + 0xA0 r10 (sl) + 0xA4 r11 + 0xA8 r0 (Hardware stack starts here!!) + 0xAC r1 + 0xB0 r2 + 0xB4 r3 + 0xB8 r12 + 0xBC lr + 0xC0 pc + 0xC4 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M4 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +ISRs can be written completely in C (or assembly language) without any calls to +_tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed access to the +ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + + .global your_assembly_isr + .thumb_func +your_assembly_isr: +; VOID your_assembly_isr(VOID) +; { + PUSH {r0, lr} +; +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, lr} + BX lr +; } + +Note: the Cortex-M4 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. FPU Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context. If saving the context of the FPU registers is needed, the ThreadX library should be re-built +with TX_ENABLE_FPU_SUPPORT defined. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M4 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/gnu/src/tx_thread_stack_build.S b/ports/cortex_m4/gnu/src/tx_thread_stack_build.S index f9ca6842..9307686e 100644 --- a/ports/cortex_m4/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m4/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M4/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -91,7 +96,7 @@ _tx_thread_stack_build: @ r7 Initial value for r7 @ r8 Initial value for r8 @ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) +@ r10 Initial value for r10 @ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @@ -119,9 +124,7 @@ _tx_thread_stack_build: STR r3, [r2, #16] @ Store initial r7 STR r3, [r2, #20] @ Store initial r8 STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOV r3, #0 @ Build initial register value + STR r3, [r2, #28] @ Store initial r10 STR r3, [r2, #32] @ Store initial r11 @ @ /* Hardware stack follows. */ diff --git a/ports/cortex_m4/iar/example_build/azure_rtos.eww b/ports/cortex_m4/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m4/iar/example_build/cstartup_M.s b/ports/cortex_m4/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..75d9369b --- /dev/null +++ b/ports/cortex_m4/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(1) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + B __iar_program_start + + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.c b/ports/cortex_m4/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..60f5a3d3 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.c @@ -0,0 +1,389 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define event buffer. */ + +#ifdef TX_ENABLE_EVENT_TRACE +UCHAR trace_buffer[0x10000]; +#endif + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + +#ifdef TX_ENABLE_EVENT_TRACE + tx_trace_enable(trace_buffer, sizeof(trace_buffer), 32); +#endif + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.dep b/ports/cortex_m4/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..d9c41b76 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.dep @@ -0,0 +1,112 @@ + + + 4 + 1715762055 + + Debug + + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\lib\dl7M_tln.a + $TOOLKIT_DIR$\lib\m7M_tl.a + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + [ROOT_NODE] + + + ILINK + 23 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 25 + + + __cstat + 26 + + + BICOMP + 19 + + + + + ICCARM + 27 29 20 17 6 9 18 5 13 12 16 24 14 30 28 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 21 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 4 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 10 21 25 2 4 15 11 8 7 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.ewd b/ports/cortex_m4/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..22c813a3 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.ewp b/ports/cortex_m4/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..4d3848a5 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2137 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.ewt b/ports/cortex_m4/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..24445b46 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.icf b/ports/cortex_m4/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..246d387e --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.icf @@ -0,0 +1,42 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define symbol FlashConfig_start__= 0x00000400; +define symbol FlashConfig_end__ = 0x0000040f; + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to (FlashConfig_start__ - 1)] | [from (FlashConfig_end__+1) to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +define region FlashConfig_region = mem:[from FlashConfig_start__ to FlashConfig_end__]; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; + +place in FlashConfig_region + {section FlashConfig}; + +place in RAM_region { last section FREE_MEM}; + diff --git a/ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..e7b3c139 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 265 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0100000030002596000002000000138600000800000029810000020000005786000001000000108600003600000001840000010000005992000001000000268100000100000000DA00000100000029E1000002000000ED8000000100000020810000010000000F810000010000000C8100000E0000000D8000000100000001E10000010000001D81000002000000EA8000000100000008DA000001000000048600000200000003DC0000010000002496000001000000178100000400000056860000010000000384000005000000148100000100000007B000000100000000810000020000000C8600000100000003E10000020000001A86000001000000EC800000010000000E81000001000000E9800000020000000B810000020000001486000002000000118600003500000002840000010000000086000001000000F48000000100000055860000010000002481000001000000468100000200000008860000010000000D81000002000000EB80000002000000E88000000300000006DA000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000033040000000A000065050000 + 000000001C040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000005101000018040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF510100003200000055010000180400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000018040000000A00001C040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000033040000000A000065050000000000001C040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..82a22cfe --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..e2a56b8d --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..22bc90ef --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M4" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..bb613a13 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m4/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..d85ff638 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1701 @@ + + + + + + 20 + 1350 + + + 20 + 1012 + 270 + 67 + + + + 124 + 27 + 27 + 27 + + + + 1 + 1 + 1 + + + + + + + 171 + 100 + 100 + 100 + + + + + + + TabID-19457-10101 + Debug Log + Debug-Log + + + + TabID-18934-10111 + Build + Build + + + + 0 + + + + + TabID-30205-10105 + Workspace + Workspace + + + sample_threadx + + + + + 0 + + + + + TabID-8186-10108 + Disassembly + Disassembly + + + + 0 + + + + + TabID-23179-10441 + Thread List + TX-THREAD + + + TabID-22657-10451 + Message Queues + TX-MESSAGEQUEUE + + + TabID-22134-10461 + Semaphores + TX-SEMAPHORE + + + TabID-32359-10474 + Mutexes + TX-MUTEX + + + TabID-9817-10487 + Byte Pools + TX-BYTEPOOL + + + TabID-9294-10497 + Block Pools + TX-BLOCKPOOL + + + TabID-19520-10510 + Timers + TX-TIMER + + + TabID-29745-10523 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + TabID-17429-10549 + Watch + Watch + + + + thread_0_counter + + + thread_1_counter + + + thread_2_counter + + + thread_3_counter + + + thread_4_counter + + + thread_5_counter + + + thread_6_counter + + + thread_7_counter + + + 0 + 171 + 100 + 100 + 100 + + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 216 + 7445 + 7445 + + + TextEditor + $WS_DIR$\tx_queue_send.c + 0 + 155 + 10012 + 10012 + + 1 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 519 + 198 + -2 + -2 + 200 + 200 + 141945 + 195122 + 141945 + 508293 + + + + + + + + + + + -2 + -2 + 519 + 350 + -2 + -2 + 200 + 200 + 141945 + 195122 + 249823 + 508293 + + + + + + + + + -2 + 348 + 519 + 635 + 348 + -2 + 200 + 200 + 141945 + 195122 + 203691 + 508293 + + + + + + + + + + + -2 + -2 + 198 + 1411 + -2 + -2 + 1413 + 200 + 1002839 + 195122 + 141945 + 195122 + + + + + + + + + 196 + -2 + 413 + 1411 + -2 + 196 + 1413 + 217 + 1002839 + 211707 + 141945 + 195122 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 136 + 150 + 100 + 100 + + + + 1 + 1 + + Disassembly + _I0 + + + 500 + 20 + + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 4D00000030002596000002000000138600000800000029810000020000005786000001000000108600003600000001840000010000005992000001000000268100000100000000DA00000100000029E1000002000000ED8000000100000020810000010000000F810000010000000C8100000E0000000D8000000100000001E10000010000001D81000002000000EA8000000100000008DA000001000000048600000200000003DC0000010000002496000001000000178100000400000056860000010000000384000005000000148100000100000007B000000100000000810000020000000C8600000100000003E10000020000001A86000001000000EC800000010000000E81000004000000E9800000020000000B810000020000001486000002000000118600003500000002840000010000000086000001000000F48000000100000055860000010000002481000001000000468100000200000008860000010000000D81000002000000EB80000002000000E88000000300000006DA000001000000 + + + 15007784000007840000FFFFFFFF808C000044D500008386000058860000008D0000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 390004840000790000005786000018000000599200002300000015810000520000003184000080000000239200000000000007E10000680000000F81000050000000208100005800000004E10000660000000C8100004D00000007860000270000001D920000110000000D8000004400000001E1000063000000068400007B000000048600002400000003840000780000009A860000160000001781000054000000008400007500000025920000190000001481000051000000308400007F0000000E8400007D000000449200002100000000810000460000000E8100004F0000001F810000570000001A860000310000001F9200001E00000003E10000650000000B8100004C0000008E8600003A00000006860000260000002D9200002000000000E1000062000000058400007A000000698600003700000041E100007200000002840000770000005586000006000000239600008600000016810000530000003284000081000000108400007E0000000E86000017000000518400008300000005E10000670000000D8100004E0000000A8400007C000000A18600003B000000C38600000300000002E1000064000000C08600000A00000005860000250000002C9200001F000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000CA020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34062 + 46080000610000006809000011010000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34064 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34100 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34112 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 4608000061000000C60A0000F1000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34060 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 46080000610000004C090000C1010000 + 9E05000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34067 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 46080000610000004C090000C1010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 46080000610000004C090000C1010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34104 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 4608000061000000F409000021010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 4608000061000000F409000021010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 46080000610000006809000011010000 + 0A01000003020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34115 + 46080000610000006809000011010000 + 0A01000003020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 46080000610000004C090000C1010000 + FA0800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34118 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000001000000FFFFFFFFFFFFFFFFF60800004C000000FA0800009A040000010000000200001004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A406000003020000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A406000003020000000000000100000004000000010000000000000000000000428500000000000000000000000000000000000001000000428500000100000042850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF0100000049850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CA020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004985000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4985000001000000FFFFFFFF49850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EF010000A4060000F3010000000000000100000004000000010000000000000000000000FFFFFFFF040000001A8500001B8500001C8500001D85000001800080000000000000000000000A020000A4060000CA02000000000000F3010000A4060000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001A85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001D85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1A85000001000000FFFFFFFF1A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF9A050000320000009E050000B30200000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000E85000010850000118500001285000034850000408500000180008000000100000000000000CE020000A40600007E030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003485000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004085000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004B85000000000000000000000000000000000000010000004B850000010000004B850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000062000000FFFEFF000000000000000000000000000100000001000000018001E100000000000063000000FFFEFF000000000000000000000000000100000001000000018003E100000000040065000000FFFEFF0000000000000000000000000001000000010000000180008100000000000046000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000040068000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018022E100000000040069000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE10000000004006F000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF00960000000000000000000180218100000000040059000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018029E10000000004006E000000FFFEFF0000000000000000000000000001000000010000000180028100000000040048000000FFFEFF000000000000000000000000000100000001000000018029810000000004005D000000FFFEFF000000000000000000000000000100000001000000018027810000000004005B000000FFFEFF000000000000000000000000000100000001000000018028810000000004005C000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040055000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040056000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004C000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004D000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000061000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000057000000FFFEFF0000000000000000000000000001000000010000000180208100000000000058000000FFFEFF000000000000000000000000000100000001000000018046810000000000005F000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34123 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34126 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34122 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..cf1f427a --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,100 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 4132951230 + + + 1 + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..22bc90ef --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M4" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.crun b/ports/cortex_m4/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.dbgdt b/ports/cortex_m4/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.dnx b/ports/cortex_m4/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m4/iar/example_build/tx.dep b/ports/cortex_m4/iar/example_build/tx.dep new file mode 100644 index 00000000..53d58a7c --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.dep @@ -0,0 +1,8968 @@ + + + 4 + 2672330084 + + Debug + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_misra.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 831 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 841 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 188 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 544 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 688 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 715 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 296 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 733 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 308 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 760 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 763 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 612 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 839 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 302 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 496 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 680 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 164 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 489 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 676 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 641 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 752 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 786 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 772 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 293 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 673 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 707 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 751 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 557 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 613 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 807 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 265 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + [ROOT_NODE] + + + IARCHIVE + 498 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 540 + + + __cstat + 472 + + + BICOMP + 175 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 139 + + + BICOMP + 583 663 836 670 816 139 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 727 + + + __cstat + 475 + + + BICOMP + 737 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 139 + + + BICOMP + 678 714 753 139 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 187 + + + __cstat + 456 + + + BICOMP + 832 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 670 139 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 817 + + + __cstat + 470 + + + BICOMP + 840 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 670 139 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 263 + + + __cstat + 474 + + + BICOMP + 499 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 670 139 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 286 + + + __cstat + 460 + + + BICOMP + 726 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 139 + + + BICOMP + 678 714 753 139 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 730 + + + __cstat + 550 + + + BICOMP + 762 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 139 + + + BICOMP + 678 714 753 139 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 687 + + + __cstat + 467 + + + BICOMP + 592 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 268 + + + BICOMP + 663 681 583 693 670 816 268 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 532 + + + __cstat + 577 + + + BICOMP + 719 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 268 + + + BICOMP + 663 681 583 693 670 816 268 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 279 + + + __cstat + 465 + + + BICOMP + 288 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 139 + + + BICOMP + 583 663 836 670 816 139 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 299 + + + __cstat + 469 + + + BICOMP + 595 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 139 + + + BICOMP + 801 681 693 678 818 714 753 816 139 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 808 + + + __cstat + 561 + + + BICOMP + 582 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 139 + + + BICOMP + 801 681 693 678 818 714 753 816 139 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 584 + + + __cstat + 215 + + + BICOMP + 622 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 663 654 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 440 + + + __cstat + 466 + + + BICOMP + 285 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 268 + + + BICOMP + 640 818 836 753 816 268 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 580 + + + __cstat + 198 + + + BICOMP + 692 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 663 654 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 300 + + + __cstat + 732 + + + BICOMP + 305 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 663 654 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 686 + + + __cstat + 618 + + + BICOMP + 819 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 276 + + + __cstat + 638 + + + BICOMP + 295 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 663 509 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 709 + + + __cstat + 672 + + + BICOMP + 792 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 663 509 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 586 + + + __cstat + 773 + + + BICOMP + 834 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 756 693 306 545 759 509 654 139 268 + + + BICOMP + 663 711 545 139 836 693 509 681 816 756 306 759 654 268 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 820 + + + __cstat + 213 + + + BICOMP + 513 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 509 + + + BICOMP + 753 693 640 818 816 509 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 150 + + + __cstat + 717 + + + BICOMP + 184 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 836 654 + + + BICOMP + 640 818 654 693 753 816 836 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 771 + + + __cstat + 206 + + + BICOMP + 799 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 + + + BICOMP + 801 756 678 818 714 753 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 479 + + + __cstat + 700 + + + BICOMP + 192 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 509 + + + BICOMP + 711 663 681 836 816 509 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 694 + + + __cstat + 746 + + + BICOMP + 271 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 753 268 640 818 816 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 677 + + + __cstat + 668 + + + BICOMP + 698 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 753 268 640 818 816 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 151 + + + __cstat + 749 + + + BICOMP + 697 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 268 + + + BICOMP + 268 670 836 663 583 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 791 + + + __cstat + 766 + + + BICOMP + 531 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 268 + + + BICOMP + 663 583 693 681 670 816 268 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 294 + + + __cstat + 620 + + + BICOMP + 501 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 509 + + + BICOMP + 640 818 509 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 581 + + + __cstat + 658 + + + BICOMP + 755 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 654 + + + BICOMP + 663 654 583 756 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 602 + + + __cstat + 517 + + + BICOMP + 512 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 670 306 756 663 583 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 275 + + + __cstat + 649 + + + BICOMP + 741 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 663 509 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 546 + + + __cstat + 186 + + + BICOMP + 824 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 509 + + + BICOMP + 681 711 663 836 816 509 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 137 + + + __cstat + 761 + + + BICOMP + 533 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 654 + + + BICOMP + 753 681 693 640 818 816 654 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 617 + + + __cstat + 482 + + + BICOMP + 722 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 654 + + + BICOMP + 711 663 836 816 654 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 685 + + + __cstat + 461 + + + BICOMP + 838 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 268 + + + BICOMP + 640 818 836 753 816 268 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 537 + + + __cstat + 651 + + + BICOMP + 810 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 509 + + + BICOMP + 640 818 509 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 740 + + + __cstat + 457 + + + BICOMP + 528 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 753 268 640 818 816 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 683 + + + __cstat + 661 + + + BICOMP + 503 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 509 + + + BICOMP + 681 711 663 836 816 509 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 743 + + + __cstat + 185 + + + BICOMP + 163 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 268 + + + BICOMP + 268 670 836 681 663 583 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 543 + + + __cstat + 468 + + + BICOMP + 802 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 268 + + + BICOMP + 268 670 836 663 583 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 813 + + + __cstat + 203 + + + BICOMP + 297 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 509 + + + BICOMP + 681 640 818 509 836 753 816 693 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 712 + + + __cstat + 214 + + + BICOMP + 534 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 180 + + + __cstat + 473 + + + BICOMP + 837 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 681 753 816 693 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 452 + + + __cstat + 659 + + + BICOMP + 281 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 795 + + + __cstat + 616 + + + BICOMP + 777 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 681 836 816 693 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 767 + + + __cstat + 230 + + + BICOMP + 738 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 545 + + + BICOMP + 583 681 663 836 670 816 545 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 168 + + + __cstat + 657 + + + BICOMP + 675 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 785 + + + __cstat + 596 + + + BICOMP + 805 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 670 545 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 161 + + + __cstat + 463 + + + BICOMP + 666 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 823 + + + __cstat + 619 + + + BICOMP + 160 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 654 + + + BICOMP + 681 753 693 640 818 816 654 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 713 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 280 + + + __cstat + 691 + + + BICOMP + 829 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 756 + + + BICOMP + 818 756 678 714 753 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 304 + + + __cstat + 774 + + + BICOMP + 728 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 145 + + + __cstat + 650 + + + BICOMP + 529 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 759 + + + BICOMP + 678 714 753 818 836 801 816 759 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 147 + + + __cstat + 231 + + + BICOMP + 521 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 190 + + + __cstat + 480 + + + BICOMP + 629 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 681 678 714 753 545 818 836 801 816 693 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 655 + + + __cstat + 201 + + + BICOMP + 144 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 801 759 678 818 714 753 816 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 525 + + + __cstat + 202 + + + BICOMP + 149 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 681 711 663 759 836 816 693 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 827 + + + __cstat + 623 + + + BICOMP + 530 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 545 + + + BICOMP + 583 681 663 836 670 816 545 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 614 + + + __cstat + 695 + + + BICOMP + 708 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 321 + + + __cstat + 679 + + + BICOMP + 822 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 759 + + + BICOMP + 678 714 753 818 836 801 816 759 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 284 + + + __cstat + 776 + + + BICOMP + 289 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 801 759 678 818 714 753 816 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 628 + + + __cstat + 830 + + + BICOMP + 510 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 191 + + + __cstat + 483 + + + BICOMP + 604 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 801 759 678 818 714 753 816 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 429 + + + __cstat + 674 + + + BICOMP + 798 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 759 + + + BICOMP + 678 714 753 681 818 836 801 816 759 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 780 + + + __cstat + 563 + + + BICOMP + 303 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 545 + + + BICOMP + 801 681 693 678 818 714 753 816 545 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 182 + + + __cstat + 459 + + + BICOMP + 682 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 516 + + + __cstat + 471 + + + BICOMP + 591 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 670 545 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 292 + + + __cstat + 590 + + + BICOMP + 731 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 670 545 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 821 + + + __cstat + 790 + + + BICOMP + 536 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 312 + + + __cstat + 611 + + + BICOMP + 605 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 703 + + + __cstat + 744 + + + BICOMP + 589 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 759 + + + BICOMP + 663 693 681 711 816 759 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 588 + + + __cstat + 729 + + + BICOMP + 542 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 545 + + + BICOMP + 583 681 663 836 670 816 545 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 601 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 274 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 159 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 547 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 478 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 690 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 788 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 632 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 775 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 825 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 270 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 153 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 609 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 745 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 484 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 757 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 814 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 502 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 718 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 505 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 170 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 706 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 627 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 172 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 634 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 154 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 526 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 155 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 523 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 158 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 497 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 508 + + + __cstat + 228 + + + BICOMP + 199 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 681 693 663 583 816 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 515 + + + __cstat + 225 + + + BICOMP + 169 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 693 + + + BICOMP + 753 693 836 681 640 818 816 306 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 797 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 140 + + + __cstat + 218 + + + BICOMP + 704 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 753 306 836 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 625 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 282 + + + __cstat + 229 + + + BICOMP + 793 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 804 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 173 + + + __cstat + 261 + + + BICOMP + 277 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 + + + BICOMP + 693 681 801 816 711 818 714 753 756 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 613 + + + __cstat + 254 + + + BICOMP + 439 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 753 711 836 818 816 693 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 430 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 557 + + + __cstat + 220 + + + BICOMP + 493 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 306 678 663 836 816 693 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 179 + + + __cstat + 454 + + + BICOMP + 298 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 681 583 836 670 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 615 + + + __cstat + 257 + + + BICOMP + 725 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 784 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + __cstat + 240 + + + BICOMP + 290 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 760 + + + __cstat + 258 + + + BICOMP + 828 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 663 693 681 678 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 188 + + + __cstat + 208 + + + BICOMP + 787 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 836 + + + BICOMP + 753 836 306 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 485 + + + __cstat + 194 + + + BICOMP + 626 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 681 663 583 816 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 772 + + + __cstat + 219 + + + BICOMP + 511 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 753 306 836 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 807 + + + __cstat + 251 + + + BICOMP + 504 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 624 + + + __cstat + 210 + + + BICOMP + 631 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 681 670 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 520 + + + __cstat + 237 + + + BICOMP + 789 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 291 + + + __cstat + 197 + + + BICOMP + 152 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 842 + + + __cstat + 255 + + + BICOMP + 710 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 587 + + + __cstat + 200 + + + BICOMP + 809 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 841 + + + __cstat + 238 + + + BICOMP + 438 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 693 + + + BICOMP + 753 693 681 836 640 818 816 306 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 724 + + + __cstat + 462 + + + BICOMP + 535 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 681 663 583 816 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 597 + + + __cstat + 243 + + + BICOMP + 739 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 681 663 583 836 670 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 539 + + + __cstat + 209 + + + BICOMP + 812 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 756 + + + BICOMP + 818 756 678 714 753 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 770 + + + __cstat + 205 + + + BICOMP + 803 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 753 306 836 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 579 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 307 + + + __cstat + 216 + + + BICOMP + 171 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 293 + + + __cstat + 574 + + + BICOMP + 514 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 681 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 763 + + + __cstat + 249 + + + BICOMP + 322 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 663 693 678 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 715 + + + __cstat + 259 + + + BICOMP + 585 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 308 + + + __cstat + 639 + + + BICOMP + 494 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 681 678 663 836 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 733 + + + __cstat + 241 + + + BICOMP + 486 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 839 + + + __cstat + 662 + + + BICOMP + 176 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 752 + + + __cstat + 575 + + + BICOMP + 492 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 496 + + + __cstat + 562 + + + BICOMP + 815 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 + + + BICOMP + 681 663 306 678 816 693 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 544 + + + __cstat + 576 + + + BICOMP + 323 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 681 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 680 + + + __cstat + 648 + + + BICOMP + 758 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 681 753 711 836 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 748 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 688 + + + __cstat + 560 + + + BICOMP + 796 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 663 306 678 816 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 265 + + + __cstat + 183 + + + BICOMP + 267 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 673 + + + __cstat + 549 + + + BICOMP + 519 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 + + + BICOMP + 663 306 681 678 816 693 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 296 + + + __cstat + 637 + + + BICOMP + 768 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 818 816 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 676 + + + __cstat + 193 + + + BICOMP + 141 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 612 + + + __cstat + 578 + + + BICOMP + 833 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 164 + + + __cstat + 660 + + + BICOMP + 491 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 681 753 711 836 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 489 + + + __cstat + 645 + + + BICOMP + 794 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 818 816 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 641 + + + __cstat + 571 + + + BICOMP + 269 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 310 + + + __cstat + 669 + + + BICOMP + 518 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 653 + + + __cstat + 234 + + + BICOMP + 606 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 315 + + + __cstat + 635 + + + BICOMP + 278 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 139 + + + BICOMP + 753 306 681 818 756 816 693 139 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 701 + + + __cstat + 568 + + + BICOMP + 156 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 139 + + + BICOMP + 818 139 681 693 711 753 816 306 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 162 + + + __cstat + 453 + + + BICOMP + 488 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 139 + + + BICOMP + 681 818 640 139 663 693 816 306 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 751 + + + __cstat + 559 + + + BICOMP + 696 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 302 + + + __cstat + 551 + + + BICOMP + 593 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 753 711 836 818 816 693 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 177 + + + __cstat + 548 + + + BICOMP + 720 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 753 681 818 139 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 831 + + + __cstat + 221 + + + BICOMP + 607 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 786 + + + __cstat + 652 + + + BICOMP + 835 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 681 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 707 + + + __cstat + 566 + + + BICOMP + 477 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 523 + + + __cstat + 223 + + + BICOMP + 266 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 654 + + + BICOMP + 306 681 714 663 756 711 753 816 693 654 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 526 + + + __cstat + 204 + + + BICOMP + 782 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 509 + + + BICOMP + 681 663 801 509 583 693 678 670 753 816 306 640 818 711 714 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 788 + + + __cstat + 212 + + + BICOMP + 684 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 681 714 663 654 711 753 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 154 + + + __cstat + 226 + + + BICOMP + 316 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 654 + + + BICOMP + 681 654 756 640 663 818 816 693 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 745 + + + __cstat + 250 + + + BICOMP + 524 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 681 753 759 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 318 + + + __cstat + 235 + + + BICOMP + 174 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 681 268 640 663 818 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 825 + + + __cstat + 256 + + + BICOMP + 142 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 654 + + + BICOMP + 681 663 801 654 583 693 678 670 753 816 306 640 818 711 714 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + __cstat + 224 + + + BICOMP + 736 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 714 663 509 711 753 816 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 155 + + + __cstat + 207 + + + BICOMP + 495 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 714 663 509 711 753 816 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 599 + + + __cstat + 236 + + + BICOMP + 594 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 753 818 139 816 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 158 + + + __cstat + 245 + + + BICOMP + 843 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 681 714 663 654 711 753 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 274 + + + __cstat + 247 + + + BICOMP + 633 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 306 693 759 + + + BICOMP + 681 663 801 693 583 756 678 670 753 816 306 759 640 818 711 714 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 775 + + + __cstat + 227 + + + BICOMP + 522 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 681 583 759 678 670 753 816 640 818 711 714 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 497 + + + __cstat + 232 + + + BICOMP + 309 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 753 759 681 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 159 + + + __cstat + 252 + + + BICOMP + 325 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 681 583 759 678 670 753 816 640 818 711 714 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 153 + + + __cstat + 646 + + + BICOMP + 664 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 753 759 681 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 270 + + + __cstat + 233 + + + BICOMP + 747 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 583 759 678 670 753 816 681 640 818 711 714 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 702 + + + __cstat + 222 + + + BICOMP + 317 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 681 268 640 663 818 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 632 + + + __cstat + 217 + + + BICOMP + 506 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 681 583 759 678 670 753 816 640 818 711 714 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 478 + + + __cstat + 558 + + + BICOMP + 598 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 545 + + + BICOMP + 753 306 818 756 816 693 545 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 627 + + + __cstat + 248 + + + BICOMP + 765 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 509 + + + BICOMP + 663 801 509 583 693 681 678 670 753 816 306 640 818 711 714 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 505 + + + __cstat + 567 + + + BICOMP + 195 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 545 + + + BICOMP + 681 818 640 545 663 693 816 306 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 735 + + + __cstat + 244 + + + BICOMP + 705 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 268 + + + BICOMP + 306 756 640 663 818 816 693 268 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 757 + + + __cstat + 196 + + + BICOMP + 538 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 654 + + + BICOMP + 306 714 663 756 711 753 816 693 654 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 272 + + + __cstat + 242 + + + BICOMP + 764 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 268 + + + BICOMP + 306 756 640 663 818 816 693 268 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 609 + + + __cstat + 636 + + + BICOMP + 742 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 753 759 681 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 547 + + + __cstat + 570 + + + BICOMP + 608 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 818 545 816 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 634 + + + __cstat + 211 + + + BICOMP + 487 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 681 714 663 509 711 753 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 138 + + + __cstat + 555 + + + BICOMP + 283 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 753 681 818 139 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 476 + + + __cstat + 246 + + + BICOMP + 610 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 268 + + + BICOMP + 306 756 681 640 663 818 816 693 268 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 166 + + + __cstat + 253 + + + BICOMP + 781 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 268 + + + BICOMP + 681 268 714 663 693 711 753 816 306 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 314 + + + __cstat + 260 + + + BICOMP + 146 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 509 + + + BICOMP + 681 306 714 663 756 711 753 816 693 509 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 689 + + + __cstat + 464 + + + BICOMP + 319 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 663 306 640 818 756 681 816 693 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 432 + + + __cstat + 553 + + + BICOMP + 800 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 644 + + + __cstat + 754 + + + BICOMP + 455 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 663 306 640 818 756 816 693 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 507 + + + __cstat + 806 + + + BICOMP + 778 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 753 711 663 306 714 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 148 + + + __cstat + 556 + + + BICOMP + 143 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 753 711 663 306 714 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 287 + + + __cstat + 642 + + + BICOMP + 734 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 753 711 663 306 714 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 826 + + + __cstat + 656 + + + BICOMP + 165 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 681 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 181 + + + __cstat + 643 + + + BICOMP + 324 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 816 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 484 + + + __cstat + 262 + + + BICOMP + 811 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 681 818 545 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 170 + + + __cstat + 572 + + + BICOMP + 320 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 816 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 481 + + + __cstat + 573 + + + BICOMP + 437 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 814 + + + __cstat + 564 + + + BICOMP + 699 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 681 818 545 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 500 + + + __cstat + 716 + + + BICOMP + 264 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 753 711 663 693 714 816 306 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 690 + + + __cstat + 239 + + + BICOMP + 630 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 545 + + + BICOMP + 818 640 545 663 693 816 306 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 769 + + + __cstat + 569 + + + BICOMP + 311 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 816 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 718 + + + __cstat + 667 + + + BICOMP + 779 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 681 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 502 + + + __cstat + 458 + + + BICOMP + 541 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 663 306 640 818 756 816 693 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 157 + + + __cstat + 554 + + + BICOMP + 178 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 753 711 663 693 714 816 306 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 600 + + + __cstat + 665 + + + BICOMP + 167 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 706 + + + __cstat + 647 + + + BICOMP + 603 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 818 545 816 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 301 + + + __cstat + 671 + + + BICOMP + 783 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 172 + + + __cstat + 565 + + + BICOMP + 721 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 681 818 545 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 750 + + + __cstat + 552 + + + BICOMP + 189 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 681 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 273 + + + __cstat + 621 + + + BICOMP + 313 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 681 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 299 808 540 727 279 187 817 263 286 730 687 532 685 543 440 740 694 677 151 791 743 820 683 294 813 546 276 709 275 537 479 581 586 602 771 137 150 712 180 617 584 580 300 686 823 168 703 145 614 452 795 321 284 191 655 161 525 147 429 190 780 827 628 182 767 292 516 785 821 312 588 601 713 280 304 179 724 520 173 430 784 579 307 615 597 624 140 842 539 797 291 770 485 625 723 508 587 282 515 804 841 772 188 557 760 613 807 265 831 308 786 293 544 673 641 763 748 752 707 751 688 496 296 715 733 676 612 839 302 680 164 489 310 653 701 315 162 177 138 599 735 272 166 318 702 476 314 526 627 634 155 490 523 825 757 788 158 154 274 745 632 497 775 159 153 609 270 547 478 505 690 484 172 814 706 502 718 170 481 181 750 769 157 600 301 273 826 432 148 689 644 507 500 287 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 539 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 924 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 485 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 842 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 282 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 307 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 515 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 291 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 770 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 508 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 615 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 624 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 587 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 140 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 597 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 724 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 520 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 588 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 516 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 173 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 147 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 145 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 780 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 655 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 525 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 452 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 628 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 161 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 767 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 191 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 785 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 429 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 703 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 190 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 292 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 821 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 312 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 182 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 280 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 924 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 614 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 795 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 321 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 827 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 304 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 179 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 284 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 826 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 301 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 181 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 769 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 148 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 644 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 689 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 481 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 157 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 750 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 432 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 500 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 273 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 507 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 287 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 600 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 314 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 272 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 177 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 735 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 166 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 318 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 315 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 162 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 701 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 702 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 310 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 476 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 599 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 653 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 138 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 300 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 150 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 932 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 740 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 168 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 602 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 137 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 791 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 617 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 820 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 813 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 275 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 546 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 180 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 584 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 479 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 580 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 686 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 823 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 294 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 694 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 709 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 677 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 683 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 151 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 276 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 586 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 924 927 925 922 926 921 931 928 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 771 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 537 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 712 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 743 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 929 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 579 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 797 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 804 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 713 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 784 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 748 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 601 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 581 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 931 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 625 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 430 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 540 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 730 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 727 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 687 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 685 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 808 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 263 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 543 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 817 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 440 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 286 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 299 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 279 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 532 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 187 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m4/iar/example_build/tx.ewd b/ports/cortex_m4/iar/example_build/tx.ewd new file mode 100644 index 00000000..df7edfb3 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m4/iar/example_build/tx.ewp b/ports/cortex_m4/iar/example_build/tx.ewp new file mode 100644 index 00000000..1a1ad21d --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.ewp @@ -0,0 +1,2752 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m4/iar/example_build/tx.ewt b/ports/cortex_m4/iar/example_build/tx.ewt new file mode 100644 index 00000000..b13c96f7 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.ewt @@ -0,0 +1,3403 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m4/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m4/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..c252a33f --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,176 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 25000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + ORR r1, r1, #1 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +__tx_SysTickHandler: +SysTick_Handler: +; +; VOID SysTick_Handler(VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, lr} + BX LR +; } + END + diff --git a/ports/cortex_m4/iar/inc/tx_port.h b/ports/cortex_m4/iar/inc/tx_port.h new file mode 100644 index 00000000..2aa60ea8 --- /dev/null +++ b/ports/cortex_m4/iar/inc/tx_port.h @@ -0,0 +1,493 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M4/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + +#ifdef __ARMVFP__ + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + __asm volatile ("vmov.f32 s0, s0"); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT)__CLZ(__RBIT((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define FPU extension for the Cortex-M4. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M4/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_m4/iar/readme_threadx.txt b/ports/cortex_m4/iar/readme_threadx.txt new file mode 100644 index 00000000..c6e7bb1f --- /dev/null +++ b/ports/cortex_m4/iar/readme_threadx.txt @@ -0,0 +1,224 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Using the IAR Tools + + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR debugger under +simulation. + +Building the demonstration is easy; simply open the threadx.www workspace file, +make the sample_threadx.ewp project the "active project" in the IAR Embedded +Workbench, and select the "Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary ELF file that can be downloaded and executed on the IAR Windows-based +Cortex-M4 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 s0 + 0x08 s1 + 0x0C s2 + 0x10 s3 + 0x14 s4 + 0x18 s5 + 0x1C s6 + 0x20 s7 + 0x24 s8 + 0x28 s9 + 0x2C s10 + 0x30 s11 + 0x34 s12 + 0x38 s13 + 0x3C s14 + 0x40 s15 + 0x44 s16 + 0x48 s17 + 0x4C s18 + 0x50 s19 + 0x54 s20 + 0x58 s21 + 0x5C s22 + 0x60 s23 + 0x64 s24 + 0x68 s25 + 0x6C s26 + 0x70 s27 + 0x74 s28 + 0x78 s29 + 0x7C s30 + 0x80 s31 + 0x84 fpscr + 0x88 r4 + 0x8C r5 + 0x90 r6 + 0x94 r7 + 0x98 r8 + 0x9C r9 + 0xA0 r10 (sl) + 0xA4 r11 + 0xA8 r0 (Hardware stack starts here!!) + 0xAC r1 + 0xB0 r2 + 0xB4 r3 + 0xB8 r12 + 0xBC lr + 0xC0 pc + 0xC4 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +The Cortex-M4 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.1 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {lr} + + ; ISR processing goes here, including any needed function calls. + + POP {lr} + BX lr + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. VFP Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M4 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/iar/src/tx_iar.c b/ports/cortex_m4/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m4/iar/src/tx_misra.s b/ports/cortex_m4/iar/src/tx_misra.s new file mode 100644 index 00000000..60ab3549 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_misra.s @@ -0,0 +1,1074 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** ThreadX MISRA Compliance */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + #define SHT_PROGBITS 0x1 + + EXTERN __aeabi_memset + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_interrupt_disable + EXTERN _tx_thread_interrupt_restore + EXTERN _tx_thread_stack_analyze + EXTERN _tx_thread_stack_error_handler + EXTERN _tx_thread_system_state +#ifdef TX_ENABLE_EVENT_TRACE + EXTERN _tx_trace_buffer_current_ptr + EXTERN _tx_trace_buffer_end_ptr + EXTERN _tx_trace_buffer_start_ptr + EXTERN _tx_trace_event_enable_bits + EXTERN _tx_trace_full_notify_function + EXTERN _tx_trace_header_ptr +#endif + + PUBLIC _tx_misra_always_true + PUBLIC _tx_misra_block_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_byte_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_char_to_uchar_pointer_convert + PUBLIC _tx_misra_const_char_to_char_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_entry_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_indirect_void_to_uchar_pointer_convert + PUBLIC _tx_misra_memset + PUBLIC _tx_misra_message_copy +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_object_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_pointer_to_ulong_convert + PUBLIC _tx_misra_status_get + PUBLIC _tx_misra_thread_stack_check +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_time_stamp_get +#endif + PUBLIC _tx_misra_timer_indirect_to_void_pointer_convert + PUBLIC _tx_misra_timer_pointer_add + PUBLIC _tx_misra_timer_pointer_dif +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_trace_event_insert +#endif + PUBLIC _tx_misra_uchar_pointer_add + PUBLIC _tx_misra_uchar_pointer_dif + PUBLIC _tx_misra_uchar_pointer_sub + PUBLIC _tx_misra_uchar_to_align_type_pointer_convert + PUBLIC _tx_misra_uchar_to_block_pool_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_entry_pointer_convert + PUBLIC _tx_misra_uchar_to_header_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_indirect_byte_pool_pointer_convert + PUBLIC _tx_misra_uchar_to_indirect_uchar_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_object_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_void_pointer_convert + PUBLIC _tx_misra_ulong_pointer_add + PUBLIC _tx_misra_ulong_pointer_dif + PUBLIC _tx_misra_ulong_pointer_sub + PUBLIC _tx_misra_ulong_to_pointer_convert + PUBLIC _tx_misra_ulong_to_thread_pointer_convert + PUBLIC _tx_misra_user_timer_pointer_get + PUBLIC _tx_misra_void_to_block_pool_pointer_convert + PUBLIC _tx_misra_void_to_byte_pool_pointer_convert + PUBLIC _tx_misra_void_to_event_flags_pointer_convert + PUBLIC _tx_misra_void_to_indirect_uchar_pointer_convert + PUBLIC _tx_misra_void_to_mutex_pointer_convert + PUBLIC _tx_misra_void_to_queue_pointer_convert + PUBLIC _tx_misra_void_to_semaphore_pointer_convert + PUBLIC _tx_misra_void_to_thread_pointer_convert + PUBLIC _tx_misra_void_to_uchar_pointer_convert + PUBLIC _tx_misra_void_to_ulong_pointer_convert + PUBLIC _tx_misra_ipsr_get + PUBLIC _tx_misra_control_get + PUBLIC _tx_misra_control_set +#ifdef __ARMVFP__ + PUBLIC _tx_misra_fpccr_get + PUBLIC _tx_misra_vfp_touch +#endif + PUBLIC _tx_version_id + + + SECTION `.data`:DATA:REORDER:NOROOT(2) + DATA +// 51 CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.0 MISRA C Compliant *"; +_tx_version_id: + DC8 43H, 6FH, 70H, 79H, 72H, 69H, 67H, 68H + DC8 74H, 20H, 28H, 63H, 29H, 20H, 31H, 39H + DC8 39H, 36H, 2DH, 32H, 30H, 31H, 38H, 20H + DC8 45H, 78H, 70H, 72H, 65H, 73H, 73H, 20H + DC8 4CH, 6FH, 67H, 69H, 63H, 20H, 49H, 6EH + DC8 63H, 2EH, 20H, 2AH, 20H, 54H, 68H, 72H + DC8 65H, 61H, 64H, 58H, 20H, 35H, 2EH, 38H + DC8 20H, 4DH, 49H, 53H, 52H, 41H, 20H, 43H + DC8 20H, 43H, 6FH, 6DH, 70H, 6CH, 69H, 61H + DC8 6EH, 74H, 20H, 2AH, 0 + DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_memset: + PUSH {R4,LR} + MOVS R4,R0 + MOVS R0,R2 + MOVS R2,R1 + MOVS R1,R0 + MOVS R0,R4 + BL __aeabi_memset + POP {R4,PC} ;; return + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_add: + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_sub: + RSBS R1,R1,#+0 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_dif: + SUBS R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_pointer_to_ulong_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_sub: + MVNS R2,#+3 + MULS R1,R2,R1 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ +/** UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_message_copy: + PUSH {R4,R5} + LDR R3,[R0, #+0] + LDR R4,[R1, #+0] + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + CMP R2,#+2 + BCC.N ??_tx_misra_message_copy_0 + SUBS R2,R2,#+1 + B.N ??_tx_misra_message_copy_1 +??_tx_misra_message_copy_2: + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + SUBS R2,R2,#+1 +??_tx_misra_message_copy_1: + CMP R2,#+0 + BNE.N ??_tx_misra_message_copy_2 +??_tx_misra_message_copy_0: + STR R3,[R0, #+0] + STR R4,[R1, #+0] + POP {R4,R5} + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ +/** TX_TIMER_INTERNAL **ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ +/** **ptr1, ULONG size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ +/** *internal_timer, TX_TIMER **user_timer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_user_timer_pointer_get: + ADDS R2,R0,#+8 + SUBS R2,R2,R0 + RSBS R2,R2,#+0 + ADD R0,R0,R2 + STR R0,[R1, #+0] + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ +/** VOID **highest_stack); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_thread_stack_check: + PUSH {R3-R5,LR} + MOVS R4,R0 + MOVS R5,R1 + BL _tx_thread_interrupt_disable + CMP R4,#+0 + BEQ.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+0] + LDR.N R2,??DataTable2 ;; 0x54485244 + CMP R1,R2 + BNE.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+8] + LDR R2,[R5, #+0] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_1 + LDR R1,[R4, #+8] + STR R1,[R5, #+0] +??_tx_misra_thread_stack_check_1: + LDR R1,[R4, #+12] + LDR R1,[R1, #+0] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R4, #+16] + LDR R1,[R1, #+1] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R5, #+0] + LDR R2,[R4, #+12] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_3 +??_tx_misra_thread_stack_check_2: + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_error_handler + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_3: + LDR R1,[R5, #+0] + LDR R1,[R1, #-4] + CMP R1,#-269488145 + BEQ.N ??_tx_misra_thread_stack_check_0 + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_analyze + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_0: + BL _tx_thread_interrupt_restore + POP {R0,R4,R5,PC} ;; return + +#ifdef TX_ENABLE_EVENT_TRACE + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_trace_event_insert(ULONG event_id, */ +/** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ +/** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_trace_event_insert: + PUSH {R3-R7,LR} + LDR.N R4,??DataTable2_1 + LDR R4,[R4, #+0] + CMP R4,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_2 + LDR R5,[R5, #+0] + LDR R6,[SP, #+28] + TST R5,R6 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_3 + LDR R5,[R5, #+0] + LDR.N R6,??DataTable2_4 + LDR R6,[R6, #+0] + CMP R5,#+0 + BNE.N ??_tx_misra_trace_event_insert_1 + LDR R5,[R6, #+44] + LDR R7,[R6, #+60] + LSLS R7,R7,#+16 + ORRS R7,R7,#0x80000000 + ORRS R5,R7,R5 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_1: + CMP R5,#-252645136 + BCS.N ??_tx_misra_trace_event_insert_3 + MOVS R5,R6 + MOVS R6,#-1 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_3: + MOVS R6,#-252645136 + MOVS R5,#+0 +??_tx_misra_trace_event_insert_2: + STR R6,[R4, #+0] + STR R5,[R4, #+4] + STR R0,[R4, #+8] + LDR R0,[SP, #+32] + STR R0,[R4, #+12] + STR R1,[R4, #+16] + STR R2,[R4, #+20] + STR R3,[R4, #+24] + LDR R0,[SP, #+24] + STR R0,[R4, #+28] + ADDS R4,R4,#+32 + LDR.N R0,??DataTable2_5 + LDR R0,[R0, #+0] + CMP R4,R0 + BCC.N ??_tx_misra_trace_event_insert_4 + LDR.N R0,??DataTable2_6 + LDR R4,[R0, #+0] + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] + LDR.N R0,??DataTable2_8 + LDR R0,[R0, #+0] + CMP R0,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + LDR.N R1,??DataTable2_8 + LDR R1,[R1, #+0] + BLX R1 + B.N ??_tx_misra_trace_event_insert_0 +??_tx_misra_trace_event_insert_4: + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] +??_tx_misra_trace_event_insert_0: + POP {R0,R4-R7,PC} ;; return + + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_1: + DC32 _tx_trace_buffer_current_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_2: + DC32 _tx_trace_event_enable_bits + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_5: + DC32 _tx_trace_buffer_end_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_6: + DC32 _tx_trace_buffer_start_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_7: + DC32 _tx_trace_header_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_8: + DC32 _tx_trace_full_notify_function + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_time_stamp_get(VOID); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_time_stamp_get: + MOVS R0,#+0 + BX LR ;; return + +#endif + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2: + DC32 0x54485244 + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_3: + DC32 _tx_thread_system_state + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_4: + DC32 _tx_thread_current_ptr + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_always_true(void); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_always_true: + MOVS R0,#+1 + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_indirect_void_to_uchar_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************/ +/***********************************************************************************/ +/** */ +/** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ +/** */ +/***********************************************************************************/ +/***********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_block_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_block_pool_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************/ +/************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************/ +/************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_block_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************/ +/**************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************/ +/**************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_byte_pool_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_byte_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_align_type_pointer_convert: + BX LR ;; return + + +/****************************************************************************************************/ +/****************************************************************************************************/ +/** */ +/** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/****************************************************************************************************/ +/****************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_byte_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************************/ +/**************************************************************************************************/ +/** */ +/** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************************/ +/**************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_event_flags_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_ulong_pointer_convert: + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_mutex_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_status_get(UINT status); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_status_get: + MOVS R0,#+0 + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_queue_pointer_convert: + BX LR ;; return + + +/****************************************************************************************/ +/****************************************************************************************/ +/** */ +/** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ +/** */ +/****************************************************************************************/ +/****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_semaphore_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_void_pointer_convert: + BX LR ;; return + + +/*********************************************************************************/ +/*********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ +/** */ +/*********************************************************************************/ +/*********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_thread_pointer_convert: + BX LR ;; return + + +/***************************************************************************************************/ +/***************************************************************************************************/ +/** */ +/** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ +/** */ +/***************************************************************************************************/ +/***************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_indirect_to_void_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_const_char_to_char_pointer_convert: + BX LR ;; return + + +/**********************************************************************************/ +/**********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ +/** */ +/**********************************************************************************/ +/**********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_thread_pointer_convert: + BX LR ;; return + + +#ifdef TX_ENABLE_EVENT_TRACE + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_object_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_object_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_header_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_entry_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_entry_to_uchar_pointer_convert: + BX LR ;; return +#endif + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_char_to_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_ipsr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ipsr_get: + MRS R0, IPSR + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_control_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_get: + MRS R0, CONTROL + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_control_set(ULONG value); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_set: + MSR CONTROL, R0 + BX LR ;; return + + +#ifdef __ARMVFP__ + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_fpccr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(2) + THUMB +_tx_misra_fpccr_get: + LDR r0, =0xE000EF34 ; Build FPCCR address + LDR r0, [r0] ; Load FPCCR value + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_vfp_touch(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_vfp_touch: + vmov.f32 s0, s0 + BX LR ;; return + +#endif + + + SECTION `.iar_vfe_header`:DATA:NOALLOC:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA + DC32 0 + + END diff --git a/ports/cortex_m4/iar/src/tx_thread_context_restore.s b/ports/cortex_m4/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1930c870 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_context_restore.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* [_tx_execution_isr_exit] Execution profiling ISR exit */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0, lr} ; Save return address +#endif +; + POP {lr} + BX lr +; +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_context_save.s b/ports/cortex_m4/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..ab563506 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_context_save.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover return address +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END diff --git a/ports/cortex_m4/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m4/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..e04f8ceb --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..7807d5c8 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..2159ae40 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m4/iar/src/tx_thread_schedule.s b/ports/cortex_m4/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..df0e74b2 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_schedule.s @@ -0,0 +1,291 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; +#ifdef __ARMVFP__ + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register +#endif +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context PendSV handler. */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts +#endif + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save: +#endif + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore: +#endif + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread +;} +; +#ifdef __ARMVFP__ + + PUBLIC tx_thread_fpu_enable +tx_thread_fpu_enable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + PUBLIC tx_thread_fpu_disable +tx_thread_fpu_disable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + +#endif + + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_stack_build.s b/ports/cortex_m4/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..61b86ab9 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_stack_build.s @@ -0,0 +1,144 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_system_return.s b/ports/cortex_m4/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..9820752e --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_system_return.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_timer_interrupt.s b/ports/cortex_m4/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..0a3c3e52 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_timer_interrupt.s @@ -0,0 +1,268 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* expiration functions are called. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired: +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt new file mode 100644 index 00000000..8586e313 --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt @@ -0,0 +1,305 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Demo + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(152=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T5F + + + 0 + UL2CM3 + -UV0289BJE -O14 -S0 -C0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_16 -FS00 -FL04000 + + + + + + 0 + 1 + thread_0_counter + + + 1 + 1 + thread_1_counter + + + 2 + 1 + thread_2_counter + + + 3 + 1 + thread_3_counter + + + 4 + 1 + thread_4_counter + + + 5 + 1 + thread_5_counter + + + 6 + 1 + _tx_thread_current_ptr + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + .\tx_initialize_low_level.s + tx_initialize_low_level.s + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\demo_threadx.c + demo_threadx.c + 0 + 0 + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 56 + 12 + 1633 + 671 + + + + + + + Library_Group + 1 + 0 + 0 + 0 + + 2 + 3 + 4 + 0 + 0 + 0 + .\ThreadX_Library.lib + ThreadX_Library.lib + 0 + 0 + + + +
diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj new file mode 100644 index 00000000..269fe86a --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj @@ -0,0 +1,573 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Demo + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M4 FPU + ARM + CLOCK(12000000) CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2 + + + + 5237 + + + + + + + + + + + + 0 + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\ + threadx_demo + 1 + 0 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM4F + SARMCM3.DLL + + TCM.DLL + -pCM4F + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 0 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ../inc;../../../../common/inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + --first __tx_vectors --entry=__main + + + + + + + + Source Group + + + 0 + 1 + 1 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 0 + + + + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + tx_initialize_low_level.s + 2 + .\tx_initialize_low_level.s + + + 2 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + demo_threadx.c + 1 + .\demo_threadx.c + + + + + Library_Group + + + ThreadX_Library.lib + 4 + .\ThreadX_Library.lib + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Library.plg b/ports/cortex_m4/keil/example_build/ThreadX_Library.plg new file mode 100644 index 00000000..725a791b --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Library.plg @@ -0,0 +1,203 @@ + + +
+

µVision Build Log

+

Project:

+C:\release\threadx\ThreadX_Library.uvproj +Project File Date: 06/28/2012 + +

Output:

+Build target 'ThreadX_Library_Project' +compiling txe_timer_info_get.c... +compiling tx_block_allocate.c... +compiling tx_block_pool_cleanup.c... +compiling tx_block_pool_create.c... +compiling tx_block_pool_delete.c... +compiling tx_block_pool_info_get.c... +compiling tx_block_pool_initialize.c... +compiling tx_block_pool_performance_info_get.c... +compiling tx_block_pool_performance_system_info_get.c... +compiling tx_block_pool_prioritize.c... +compiling tx_block_release.c... +compiling tx_byte_allocate.c... +compiling tx_byte_pool_cleanup.c... +compiling tx_byte_pool_create.c... +compiling tx_byte_pool_delete.c... +compiling tx_byte_pool_info_get.c... +compiling tx_byte_pool_initialize.c... +compiling tx_byte_pool_performance_info_get.c... +compiling tx_byte_pool_performance_system_info_get.c... +compiling tx_byte_pool_prioritize.c... +compiling tx_byte_pool_search.c... +compiling tx_byte_release.c... +compiling tx_event_flags_cleanup.c... +compiling tx_event_flags_create.c... +compiling tx_event_flags_delete.c... +compiling tx_event_flags_get.c... +compiling tx_event_flags_info_get.c... +compiling tx_event_flags_initialize.c... +compiling tx_event_flags_performance_info_get.c... +compiling tx_event_flags_performance_system_info_get.c... +compiling tx_event_flags_set.c... +compiling tx_event_flags_set_notify.c... +compiling tx_initialize_high_level.c... +compiling tx_initialize_kernel_enter.c... +compiling tx_initialize_kernel_setup.c... +compiling tx_mutex_cleanup.c... +compiling tx_mutex_create.c... +compiling tx_mutex_delete.c... +compiling tx_mutex_get.c... +compiling tx_mutex_info_get.c... +compiling tx_mutex_initialize.c... +compiling tx_mutex_performance_info_get.c... +compiling tx_mutex_performance_system_info_get.c... +compiling tx_mutex_prioritize.c... +compiling tx_mutex_priority_change.c... +compiling tx_mutex_put.c... +compiling tx_queue_cleanup.c... +compiling tx_queue_create.c... +compiling tx_queue_delete.c... +compiling tx_queue_flush.c... +compiling tx_queue_front_send.c... +compiling tx_queue_info_get.c... +compiling tx_queue_initialize.c... +compiling tx_queue_performance_info_get.c... +compiling tx_queue_performance_system_info_get.c... +compiling tx_queue_prioritize.c... +compiling tx_queue_receive.c... +compiling tx_queue_send.c... +compiling tx_queue_send_notify.c... +compiling tx_semaphore_ceiling_put.c... +compiling tx_semaphore_cleanup.c... +compiling tx_semaphore_create.c... +compiling tx_semaphore_delete.c... +compiling tx_semaphore_get.c... +compiling tx_semaphore_info_get.c... +compiling tx_semaphore_initialize.c... +compiling tx_semaphore_performance_info_get.c... +compiling tx_semaphore_performance_system_info_get.c... +compiling tx_semaphore_prioritize.c... +compiling tx_semaphore_put.c... +compiling tx_semaphore_put_notify.c... +compiling tx_thread_create.c... +compiling tx_thread_delete.c... +compiling tx_thread_entry_exit_notify.c... +compiling tx_thread_identify.c... +compiling tx_thread_info_get.c... +compiling tx_thread_initialize.c... +compiling tx_thread_performance_info_get.c... +compiling tx_thread_performance_system_info_get.c... +compiling tx_thread_preemption_change.c... +compiling tx_thread_priority_change.c... +compiling tx_thread_relinquish.c... +compiling tx_thread_reset.c... +compiling tx_thread_resume.c... +compiling tx_thread_shell_entry.c... +compiling tx_thread_sleep.c... +compiling tx_thread_stack_analyze.c... +compiling tx_thread_stack_error_handler.c... +compiling tx_thread_stack_error_notify.c... +compiling tx_thread_suspend.c... +compiling tx_thread_system_preempt_check.c... +compiling tx_thread_system_resume.c... +compiling tx_thread_system_suspend.c... +compiling tx_thread_terminate.c... +compiling tx_thread_time_slice.c... +compiling tx_thread_time_slice_change.c... +compiling tx_thread_timeout.c... +compiling tx_thread_wait_abort.c... +compiling tx_time_get.c... +compiling tx_time_set.c... +compiling tx_timer_activate.c... +compiling tx_timer_change.c... +compiling tx_timer_create.c... +compiling tx_timer_deactivate.c... +compiling tx_timer_delete.c... +compiling tx_timer_expiration_process.c... +compiling tx_timer_info_get.c... +compiling tx_timer_initialize.c... +compiling tx_timer_performance_info_get.c... +compiling tx_timer_performance_system_info_get.c... +compiling tx_timer_system_activate.c... +compiling tx_timer_system_deactivate.c... +compiling tx_timer_thread_entry.c... +compiling tx_trace_disable.c... +compiling tx_trace_enable.c... +compiling tx_trace_initialize.c... +compiling tx_trace_interrupt_control.c... +compiling tx_trace_isr_enter_insert.c... +compiling tx_trace_isr_exit_insert.c... +compiling tx_trace_object_register.c... +compiling tx_trace_object_unregister.c... +compiling tx_trace_user_event_insert.c... +compiling txe_block_allocate.c... +compiling txe_block_pool_create.c... +compiling txe_block_pool_delete.c... +compiling txe_block_pool_info_get.c... +compiling txe_block_pool_prioritize.c... +compiling txe_block_release.c... +compiling txe_byte_allocate.c... +compiling txe_byte_pool_create.c... +compiling txe_byte_pool_delete.c... +compiling txe_byte_pool_info_get.c... +compiling txe_byte_pool_prioritize.c... +compiling txe_byte_release.c... +compiling txe_event_flags_create.c... +compiling txe_event_flags_delete.c... +compiling txe_event_flags_get.c... +compiling txe_event_flags_info_get.c... +compiling txe_event_flags_set.c... +compiling txe_event_flags_set_notify.c... +compiling txe_mutex_create.c... +compiling txe_mutex_delete.c... +compiling txe_mutex_get.c... +compiling txe_mutex_info_get.c... +compiling txe_mutex_prioritize.c... +compiling txe_mutex_put.c... +compiling txe_queue_create.c... +compiling txe_queue_delete.c... +compiling txe_queue_flush.c... +compiling txe_queue_front_send.c... +compiling txe_queue_info_get.c... +compiling txe_queue_prioritize.c... +compiling txe_queue_receive.c... +compiling txe_queue_send.c... +compiling txe_queue_send_notify.c... +compiling txe_semaphore_ceiling_put.c... +compiling txe_semaphore_create.c... +compiling txe_semaphore_delete.c... +compiling txe_semaphore_get.c... +compiling txe_semaphore_info_get.c... +compiling txe_semaphore_prioritize.c... +compiling txe_semaphore_put.c... +compiling txe_semaphore_put_notify.c... +compiling txe_thread_create.c... +compiling txe_thread_delete.c... +compiling txe_thread_entry_exit_notify.c... +compiling txe_thread_info_get.c... +compiling txe_thread_preemption_change.c... +compiling txe_thread_priority_change.c... +compiling txe_thread_relinquish.c... +compiling txe_thread_reset.c... +compiling txe_thread_resume.c... +compiling txe_thread_suspend.c... +compiling txe_thread_terminate.c... +compiling txe_thread_time_slice_change.c... +compiling txe_thread_wait_abort.c... +compiling txe_timer_activate.c... +compiling txe_timer_change.c... +compiling txe_timer_create.c... +compiling txe_timer_deactivate.c... +compiling txe_timer_delete.c... +assembling tx_timer_interrupt.s... +assembling tx_thread_context_restore.s... +assembling tx_thread_context_save.s... +assembling tx_thread_interrupt_control.s... +assembling tx_thread_schedule.s... +assembling tx_thread_stack_build.s... +assembling tx_thread_system_return.s... +compiling tx_trace_buffer_full_notify.c... +compiling tx_trace_event_filter.c... +compiling tx_trace_event_unfilter.c... +creating Library... +"ThreadX_Library.lib" - 0 Error(s), 0 Warning(s). diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt new file mode 100644 index 00000000..8205883f --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt @@ -0,0 +1,2664 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Library_Project + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 5 + + + + + + + + + + + BIN\ULP2CM3.DLL + + + + 0 + ULP2CM3 + -O2510 -S0 -C0 -FO15 -FD20000000 -FC4000 -FN1 -FF0MK_P256 -FS00 -FL040000) + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 0 + 0 + 0 + 0 + + 1 + 1 + 5 + 0 + 0 + 0 + ..\inc\tx_port.h + tx_port.h + 0 + 0 + + + 1 + 2 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_restore.s + tx_thread_context_restore.s + 0 + 0 + + + 1 + 3 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_save.s + tx_thread_context_save.s + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_control.s + tx_thread_interrupt_control.s + 0 + 0 + + + 1 + 5 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_disable.s + tx_thread_interrupt_disable.s + 0 + 0 + + + 1 + 6 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_restore.s + tx_thread_interrupt_restore.s + 0 + 0 + + + 1 + 7 + 2 + 0 + 0 + 0 + ..\src\tx_thread_schedule.s + tx_thread_schedule.s + 0 + 0 + + + 1 + 8 + 2 + 0 + 0 + 0 + ..\src\tx_thread_stack_build.s + tx_thread_stack_build.s + 0 + 0 + + + 1 + 9 + 2 + 0 + 0 + 0 + ..\src\tx_thread_system_return.s + tx_thread_system_return.s + 0 + 0 + + + 1 + 10 + 2 + 0 + 0 + 0 + ..\src\tx_timer_interrupt.s + tx_timer_interrupt.s + 0 + 0 + + + 1 + 11 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_api.h + tx_api.h + 0 + 0 + + + 1 + 12 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_block_pool.h + tx_block_pool.h + 0 + 0 + + + 1 + 13 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_byte_pool.h + tx_byte_pool.h + 0 + 0 + + + 1 + 14 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_event_flags.h + tx_event_flags.h + 0 + 0 + + + 1 + 15 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_initialize.h + tx_initialize.h + 0 + 0 + + + 1 + 16 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_mutex.h + tx_mutex.h + 0 + 0 + + + 1 + 17 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_queue.h + tx_queue.h + 0 + 0 + + + 1 + 18 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_semaphore.h + tx_semaphore.h + 0 + 0 + + + 1 + 19 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_thread.h + tx_thread.h + 0 + 0 + + + 1 + 20 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_timer.h + tx_timer.h + 0 + 0 + + + 1 + 21 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_trace.h + tx_trace.h + 0 + 0 + + + 1 + 22 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_user.h + tx_user.h + 0 + 0 + + + 1 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_allocate.c + tx_block_allocate.c + 0 + 0 + + + 1 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + tx_block_pool_cleanup.c + 0 + 0 + + + 1 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_create.c + tx_block_pool_create.c + 0 + 0 + + + 1 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_delete.c + tx_block_pool_delete.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_info_get.c + tx_block_pool_info_get.c + 0 + 0 + + + 1 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_initialize.c + tx_block_pool_initialize.c + 0 + 0 + + + 1 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + tx_block_pool_performance_info_get.c + 0 + 0 + + + 1 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + tx_block_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + tx_block_pool_prioritize.c + 0 + 0 + + + 1 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_release.c + tx_block_release.c + 0 + 0 + + + 1 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_allocate.c + tx_byte_allocate.c + 0 + 0 + + + 1 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + tx_byte_pool_cleanup.c + 0 + 0 + + + 1 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_create.c + tx_byte_pool_create.c + 0 + 0 + + + 1 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_delete.c + tx_byte_pool_delete.c + 0 + 0 + + + 1 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + tx_byte_pool_info_get.c + 0 + 0 + + + 1 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + tx_byte_pool_initialize.c + 0 + 0 + + + 1 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + tx_byte_pool_performance_info_get.c + 0 + 0 + + + 1 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + tx_byte_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + tx_byte_pool_prioritize.c + 0 + 0 + + + 1 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_search.c + tx_byte_pool_search.c + 0 + 0 + + + 1 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_release.c + tx_byte_release.c + 0 + 0 + + + 1 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + tx_event_flags_cleanup.c + 0 + 0 + + + 1 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_create.c + tx_event_flags_create.c + 0 + 0 + + + 1 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_delete.c + tx_event_flags_delete.c + 0 + 0 + + + 1 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_get.c + tx_event_flags_get.c + 0 + 0 + + + 1 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_info_get.c + tx_event_flags_info_get.c + 0 + 0 + + + 1 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_initialize.c + tx_event_flags_initialize.c + 0 + 0 + + + 1 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + tx_event_flags_performance_info_get.c + 0 + 0 + + + 1 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + tx_event_flags_performance_system_info_get.c + 0 + 0 + + + 1 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set.c + tx_event_flags_set.c + 0 + 0 + + + 1 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + tx_event_flags_set_notify.c + 0 + 0 + + + 1 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_high_level.c + tx_initialize_high_level.c + 0 + 0 + + + 1 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + tx_initialize_kernel_enter.c + 0 + 0 + + + 1 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + tx_initialize_kernel_setup.c + 0 + 0 + + + 1 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_misra.c + tx_misra.c + 0 + 0 + + + 1 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_cleanup.c + tx_mutex_cleanup.c + 0 + 0 + + + 1 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_create.c + tx_mutex_create.c + 0 + 0 + + + 1 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_delete.c + tx_mutex_delete.c + 0 + 0 + + + 1 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_get.c + tx_mutex_get.c + 0 + 0 + + + 1 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_info_get.c + tx_mutex_info_get.c + 0 + 0 + + + 1 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_initialize.c + tx_mutex_initialize.c + 0 + 0 + + + 1 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + tx_mutex_performance_info_get.c + 0 + 0 + + + 1 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + tx_mutex_performance_system_info_get.c + 0 + 0 + + + 1 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_prioritize.c + tx_mutex_prioritize.c + 0 + 0 + + + 1 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_priority_change.c + tx_mutex_priority_change.c + 0 + 0 + + + 1 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_put.c + tx_mutex_put.c + 0 + 0 + + + 1 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_cleanup.c + tx_queue_cleanup.c + 0 + 0 + + + 1 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_create.c + tx_queue_create.c + 0 + 0 + + + 1 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_delete.c + tx_queue_delete.c + 0 + 0 + + + 1 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_flush.c + tx_queue_flush.c + 0 + 0 + + + 1 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_front_send.c + tx_queue_front_send.c + 0 + 0 + + + 1 + 74 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_info_get.c + tx_queue_info_get.c + 0 + 0 + + + 1 + 75 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_initialize.c + tx_queue_initialize.c + 0 + 0 + + + 1 + 76 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + tx_queue_performance_info_get.c + 0 + 0 + + + 1 + 77 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + tx_queue_performance_system_info_get.c + 0 + 0 + + + 1 + 78 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_prioritize.c + tx_queue_prioritize.c + 0 + 0 + + + 1 + 79 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_receive.c + tx_queue_receive.c + 0 + 0 + + + 1 + 80 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send.c + tx_queue_send.c + 0 + 0 + + + 1 + 81 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send_notify.c + tx_queue_send_notify.c + 0 + 0 + + + 1 + 82 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + tx_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 83 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + tx_semaphore_cleanup.c + 0 + 0 + + + 1 + 84 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_create.c + tx_semaphore_create.c + 0 + 0 + + + 1 + 85 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_delete.c + tx_semaphore_delete.c + 0 + 0 + + + 1 + 86 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_get.c + tx_semaphore_get.c + 0 + 0 + + + 1 + 87 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_info_get.c + tx_semaphore_info_get.c + 0 + 0 + + + 1 + 88 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_initialize.c + tx_semaphore_initialize.c + 0 + 0 + + + 1 + 89 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + tx_semaphore_performance_info_get.c + 0 + 0 + + + 1 + 90 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + tx_semaphore_performance_system_info_get.c + 0 + 0 + + + 1 + 91 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + tx_semaphore_prioritize.c + 0 + 0 + + + 1 + 92 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put.c + tx_semaphore_put.c + 0 + 0 + + + 1 + 93 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + tx_semaphore_put_notify.c + 0 + 0 + + + 1 + 94 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_create.c + tx_thread_create.c + 0 + 0 + + + 1 + 95 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_delete.c + tx_thread_delete.c + 0 + 0 + + + 1 + 96 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + tx_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 97 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_identify.c + tx_thread_identify.c + 0 + 0 + + + 1 + 98 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_info_get.c + tx_thread_info_get.c + 0 + 0 + + + 1 + 99 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_initialize.c + tx_thread_initialize.c + 0 + 0 + + + 1 + 100 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + tx_thread_performance_info_get.c + 0 + 0 + + + 1 + 101 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + tx_thread_performance_system_info_get.c + 0 + 0 + + + 1 + 102 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_preemption_change.c + tx_thread_preemption_change.c + 0 + 0 + + + 1 + 103 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_priority_change.c + tx_thread_priority_change.c + 0 + 0 + + + 1 + 104 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_relinquish.c + tx_thread_relinquish.c + 0 + 0 + + + 1 + 105 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_reset.c + tx_thread_reset.c + 0 + 0 + + + 1 + 106 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_resume.c + tx_thread_resume.c + 0 + 0 + + + 1 + 107 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_shell_entry.c + tx_thread_shell_entry.c + 0 + 0 + + + 1 + 108 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_sleep.c + tx_thread_sleep.c + 0 + 0 + + + 1 + 109 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + tx_thread_stack_analyze.c + 0 + 0 + + + 1 + 110 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + tx_thread_stack_error_handler.c + 0 + 0 + + + 1 + 111 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + tx_thread_stack_error_notify.c + 0 + 0 + + + 1 + 112 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_suspend.c + tx_thread_suspend.c + 0 + 0 + + + 1 + 113 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + tx_thread_system_preempt_check.c + 0 + 0 + + + 1 + 114 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_resume.c + tx_thread_system_resume.c + 0 + 0 + + + 1 + 115 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_suspend.c + tx_thread_system_suspend.c + 0 + 0 + + + 1 + 116 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_terminate.c + tx_thread_terminate.c + 0 + 0 + + + 1 + 117 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice.c + tx_thread_time_slice.c + 0 + 0 + + + 1 + 118 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + tx_thread_time_slice_change.c + 0 + 0 + + + 1 + 119 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_timeout.c + tx_thread_timeout.c + 0 + 0 + + + 1 + 120 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_wait_abort.c + tx_thread_wait_abort.c + 0 + 0 + + + 1 + 121 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_get.c + tx_time_get.c + 0 + 0 + + + 1 + 122 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_set.c + tx_time_set.c + 0 + 0 + + + 1 + 123 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_activate.c + tx_timer_activate.c + 0 + 0 + + + 1 + 124 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_change.c + tx_timer_change.c + 0 + 0 + + + 1 + 125 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_create.c + tx_timer_create.c + 0 + 0 + + + 1 + 126 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_deactivate.c + tx_timer_deactivate.c + 0 + 0 + + + 1 + 127 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_delete.c + tx_timer_delete.c + 0 + 0 + + + 1 + 128 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_expiration_process.c + tx_timer_expiration_process.c + 0 + 0 + + + 1 + 129 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_info_get.c + tx_timer_info_get.c + 0 + 0 + + + 1 + 130 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_initialize.c + tx_timer_initialize.c + 0 + 0 + + + 1 + 131 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + tx_timer_performance_info_get.c + 0 + 0 + + + 1 + 132 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + tx_timer_performance_system_info_get.c + 0 + 0 + + + 1 + 133 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_activate.c + tx_timer_system_activate.c + 0 + 0 + + + 1 + 134 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + tx_timer_system_deactivate.c + 0 + 0 + + + 1 + 135 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_thread_entry.c + tx_timer_thread_entry.c + 0 + 0 + + + 1 + 136 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + tx_trace_buffer_full_notify.c + 0 + 0 + + + 1 + 137 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_disable.c + tx_trace_disable.c + 0 + 0 + + + 1 + 138 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_enable.c + tx_trace_enable.c + 0 + 0 + + + 1 + 139 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_filter.c + tx_trace_event_filter.c + 0 + 0 + + + 1 + 140 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + tx_trace_event_unfilter.c + 0 + 0 + + + 1 + 141 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_initialize.c + tx_trace_initialize.c + 0 + 0 + + + 1 + 142 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + tx_trace_interrupt_control.c + 0 + 0 + + + 1 + 143 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + tx_trace_isr_enter_insert.c + 0 + 0 + + + 1 + 144 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + tx_trace_isr_exit_insert.c + 0 + 0 + + + 1 + 145 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_register.c + tx_trace_object_register.c + 0 + 0 + + + 1 + 146 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_unregister.c + tx_trace_object_unregister.c + 0 + 0 + + + 1 + 147 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + tx_trace_user_event_insert.c + 0 + 0 + + + 1 + 148 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_allocate.c + txe_block_allocate.c + 0 + 0 + + + 1 + 149 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_create.c + txe_block_pool_create.c + 0 + 0 + + + 1 + 150 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_delete.c + txe_block_pool_delete.c + 0 + 0 + + + 1 + 151 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_info_get.c + txe_block_pool_info_get.c + 0 + 0 + + + 1 + 152 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + txe_block_pool_prioritize.c + 0 + 0 + + + 1 + 153 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_release.c + txe_block_release.c + 0 + 0 + + + 1 + 154 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_allocate.c + txe_byte_allocate.c + 0 + 0 + + + 1 + 155 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_create.c + txe_byte_pool_create.c + 0 + 0 + + + 1 + 156 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_delete.c + txe_byte_pool_delete.c + 0 + 0 + + + 1 + 157 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + txe_byte_pool_info_get.c + 0 + 0 + + + 1 + 158 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + txe_byte_pool_prioritize.c + 0 + 0 + + + 1 + 159 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_release.c + txe_byte_release.c + 0 + 0 + + + 1 + 160 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_create.c + txe_event_flags_create.c + 0 + 0 + + + 1 + 161 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_delete.c + txe_event_flags_delete.c + 0 + 0 + + + 1 + 162 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_get.c + txe_event_flags_get.c + 0 + 0 + + + 1 + 163 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_info_get.c + txe_event_flags_info_get.c + 0 + 0 + + + 1 + 164 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set.c + txe_event_flags_set.c + 0 + 0 + + + 1 + 165 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + txe_event_flags_set_notify.c + 0 + 0 + + + 1 + 166 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_create.c + txe_mutex_create.c + 0 + 0 + + + 1 + 167 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_delete.c + txe_mutex_delete.c + 0 + 0 + + + 1 + 168 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_get.c + txe_mutex_get.c + 0 + 0 + + + 1 + 169 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_info_get.c + txe_mutex_info_get.c + 0 + 0 + + + 1 + 170 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_prioritize.c + txe_mutex_prioritize.c + 0 + 0 + + + 1 + 171 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_put.c + txe_mutex_put.c + 0 + 0 + + + 1 + 172 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_create.c + txe_queue_create.c + 0 + 0 + + + 1 + 173 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_delete.c + txe_queue_delete.c + 0 + 0 + + + 1 + 174 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_flush.c + txe_queue_flush.c + 0 + 0 + + + 1 + 175 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_front_send.c + txe_queue_front_send.c + 0 + 0 + + + 1 + 176 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_info_get.c + txe_queue_info_get.c + 0 + 0 + + + 1 + 177 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_prioritize.c + txe_queue_prioritize.c + 0 + 0 + + + 1 + 178 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_receive.c + txe_queue_receive.c + 0 + 0 + + + 1 + 179 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send.c + txe_queue_send.c + 0 + 0 + + + 1 + 180 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send_notify.c + txe_queue_send_notify.c + 0 + 0 + + + 1 + 181 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + txe_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 182 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_create.c + txe_semaphore_create.c + 0 + 0 + + + 1 + 183 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_delete.c + txe_semaphore_delete.c + 0 + 0 + + + 1 + 184 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_get.c + txe_semaphore_get.c + 0 + 0 + + + 1 + 185 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_info_get.c + txe_semaphore_info_get.c + 0 + 0 + + + 1 + 186 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + txe_semaphore_prioritize.c + 0 + 0 + + + 1 + 187 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put.c + txe_semaphore_put.c + 0 + 0 + + + 1 + 188 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + txe_semaphore_put_notify.c + 0 + 0 + + + 1 + 189 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_create.c + txe_thread_create.c + 0 + 0 + + + 1 + 190 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_delete.c + txe_thread_delete.c + 0 + 0 + + + 1 + 191 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + txe_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 192 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_info_get.c + txe_thread_info_get.c + 0 + 0 + + + 1 + 193 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_preemption_change.c + txe_thread_preemption_change.c + 0 + 0 + + + 1 + 194 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_priority_change.c + txe_thread_priority_change.c + 0 + 0 + + + 1 + 195 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_relinquish.c + txe_thread_relinquish.c + 0 + 0 + + + 1 + 196 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_reset.c + txe_thread_reset.c + 0 + 0 + + + 1 + 197 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_resume.c + txe_thread_resume.c + 0 + 0 + + + 1 + 198 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_suspend.c + txe_thread_suspend.c + 0 + 0 + + + 1 + 199 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_terminate.c + txe_thread_terminate.c + 0 + 0 + + + 1 + 200 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + txe_thread_time_slice_change.c + 0 + 0 + + + 1 + 201 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_wait_abort.c + txe_thread_wait_abort.c + 0 + 0 + + + 1 + 202 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_activate.c + txe_timer_activate.c + 0 + 0 + + + 1 + 203 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_change.c + txe_timer_change.c + 0 + 0 + + + 1 + 204 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_create.c + txe_timer_create.c + 0 + 0 + + + 1 + 205 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_deactivate.c + txe_timer_deactivate.c + 0 + 0 + + + 1 + 206 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_delete.c + txe_timer_delete.c + 0 + 0 + + + 1 + 207 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_info_get.c + txe_timer_info_get.c + 0 + 0 + + + +
diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj new file mode 100644 index 00000000..5c577681 --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj @@ -0,0 +1,1481 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Library_Project + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M4 FPU + ARM + CLOCK(12000000) CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2 + + + + 5237 + + + + + + + + + + + + 0 + 0 + + + + Freescale\K60\ + Freescale\K60\ + + 0 + 0 + 0 + 0 + 1 + + .\ + ThreadX_Library + 0 + 1 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM4 + SARMCM3.DLL + + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 5 + + + + + + + + + + + + + + BIN\ULP2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4100 + + 0 + BIN\ULP2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x1fff8000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ../inc;../../../../common/inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + TX_ENABLE_WFI + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Group + + + tx_port.h + 5 + ..\inc\tx_port.h + + + tx_thread_context_restore.s + 2 + ..\src\tx_thread_context_restore.s + + + tx_thread_context_save.s + 2 + ..\src\tx_thread_context_save.s + + + tx_thread_interrupt_control.s + 2 + ..\src\tx_thread_interrupt_control.s + + + tx_thread_interrupt_disable.s + 2 + ..\src\tx_thread_interrupt_disable.s + + + tx_thread_interrupt_restore.s + 2 + ..\src\tx_thread_interrupt_restore.s + + + tx_thread_schedule.s + 2 + ..\src\tx_thread_schedule.s + + + tx_thread_stack_build.s + 2 + ..\src\tx_thread_stack_build.s + + + tx_thread_system_return.s + 2 + ..\src\tx_thread_system_return.s + + + tx_timer_interrupt.s + 2 + ..\src\tx_timer_interrupt.s + + + tx_api.h + 5 + ..\..\..\..\common\inc\tx_api.h + + + tx_block_pool.h + 5 + ..\..\..\..\common\inc\tx_block_pool.h + + + tx_byte_pool.h + 5 + ..\..\..\..\common\inc\tx_byte_pool.h + + + tx_event_flags.h + 5 + ..\..\..\..\common\inc\tx_event_flags.h + + + tx_initialize.h + 5 + ..\..\..\..\common\inc\tx_initialize.h + + + tx_mutex.h + 5 + ..\..\..\..\common\inc\tx_mutex.h + + + tx_queue.h + 5 + ..\..\..\..\common\inc\tx_queue.h + + + tx_semaphore.h + 5 + ..\..\..\..\common\inc\tx_semaphore.h + + + tx_thread.h + 5 + ..\..\..\..\common\inc\tx_thread.h + + + tx_timer.h + 5 + ..\..\..\..\common\inc\tx_timer.h + + + tx_trace.h + 5 + ..\..\..\..\common\inc\tx_trace.h + + + tx_user.h + 5 + ..\..\..\..\common\inc\tx_user.h + + + tx_block_allocate.c + 1 + ..\..\..\..\common\src\tx_block_allocate.c + + + tx_block_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + + + tx_block_pool_create.c + 1 + ..\..\..\..\common\src\tx_block_pool_create.c + + + tx_block_pool_delete.c + 1 + ..\..\..\..\common\src\tx_block_pool_delete.c + + + tx_block_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_info_get.c + + + tx_block_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_block_pool_initialize.c + + + tx_block_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + tx_block_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + tx_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + + + tx_block_release.c + 1 + ..\..\..\..\common\src\tx_block_release.c + + + tx_byte_allocate.c + 1 + ..\..\..\..\common\src\tx_byte_allocate.c + + + tx_byte_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + tx_byte_pool_create.c + 1 + ..\..\..\..\common\src\tx_byte_pool_create.c + + + tx_byte_pool_delete.c + 1 + ..\..\..\..\common\src\tx_byte_pool_delete.c + + + tx_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + + + tx_byte_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + + + tx_byte_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + tx_byte_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + tx_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + tx_byte_pool_search.c + 1 + ..\..\..\..\common\src\tx_byte_pool_search.c + + + tx_byte_release.c + 1 + ..\..\..\..\common\src\tx_byte_release.c + + + tx_event_flags_cleanup.c + 1 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + + + tx_event_flags_create.c + 1 + ..\..\..\..\common\src\tx_event_flags_create.c + + + tx_event_flags_delete.c + 1 + ..\..\..\..\common\src\tx_event_flags_delete.c + + + tx_event_flags_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_get.c + + + tx_event_flags_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_info_get.c + + + tx_event_flags_initialize.c + 1 + ..\..\..\..\common\src\tx_event_flags_initialize.c + + + tx_event_flags_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + tx_event_flags_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + tx_event_flags_set.c + 1 + ..\..\..\..\common\src\tx_event_flags_set.c + + + tx_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + + + tx_initialize_high_level.c + 1 + ..\..\..\..\common\src\tx_initialize_high_level.c + + + tx_initialize_kernel_enter.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + tx_initialize_kernel_setup.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + tx_misra.c + 1 + ..\..\..\..\common\src\tx_misra.c + + + tx_mutex_cleanup.c + 1 + ..\..\..\..\common\src\tx_mutex_cleanup.c + + + tx_mutex_create.c + 1 + ..\..\..\..\common\src\tx_mutex_create.c + + + tx_mutex_delete.c + 1 + ..\..\..\..\common\src\tx_mutex_delete.c + + + tx_mutex_get.c + 1 + ..\..\..\..\common\src\tx_mutex_get.c + + + tx_mutex_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_info_get.c + + + tx_mutex_initialize.c + 1 + ..\..\..\..\common\src\tx_mutex_initialize.c + + + tx_mutex_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + tx_mutex_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + tx_mutex_prioritize.c + 1 + ..\..\..\..\common\src\tx_mutex_prioritize.c + + + tx_mutex_priority_change.c + 1 + ..\..\..\..\common\src\tx_mutex_priority_change.c + + + tx_mutex_put.c + 1 + ..\..\..\..\common\src\tx_mutex_put.c + + + tx_queue_cleanup.c + 1 + ..\..\..\..\common\src\tx_queue_cleanup.c + + + tx_queue_create.c + 1 + ..\..\..\..\common\src\tx_queue_create.c + + + tx_queue_delete.c + 1 + ..\..\..\..\common\src\tx_queue_delete.c + + + tx_queue_flush.c + 1 + ..\..\..\..\common\src\tx_queue_flush.c + + + tx_queue_front_send.c + 1 + ..\..\..\..\common\src\tx_queue_front_send.c + + + tx_queue_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_info_get.c + + + tx_queue_initialize.c + 1 + ..\..\..\..\common\src\tx_queue_initialize.c + + + tx_queue_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + + + tx_queue_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + tx_queue_prioritize.c + 1 + ..\..\..\..\common\src\tx_queue_prioritize.c + + + tx_queue_receive.c + 1 + ..\..\..\..\common\src\tx_queue_receive.c + + + tx_queue_send.c + 1 + ..\..\..\..\common\src\tx_queue_send.c + + + tx_queue_send_notify.c + 1 + ..\..\..\..\common\src\tx_queue_send_notify.c + + + tx_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + tx_semaphore_cleanup.c + 1 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + + + tx_semaphore_create.c + 1 + ..\..\..\..\common\src\tx_semaphore_create.c + + + tx_semaphore_delete.c + 1 + ..\..\..\..\common\src\tx_semaphore_delete.c + + + tx_semaphore_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_get.c + + + tx_semaphore_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_info_get.c + + + tx_semaphore_initialize.c + 1 + ..\..\..\..\common\src\tx_semaphore_initialize.c + + + tx_semaphore_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + tx_semaphore_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + tx_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + + + tx_semaphore_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_put.c + + + tx_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + + + tx_thread_create.c + 1 + ..\..\..\..\common\src\tx_thread_create.c + + + tx_thread_delete.c + 1 + ..\..\..\..\common\src\tx_thread_delete.c + + + tx_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + tx_thread_identify.c + 1 + ..\..\..\..\common\src\tx_thread_identify.c + + + tx_thread_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_info_get.c + + + tx_thread_initialize.c + 1 + ..\..\..\..\common\src\tx_thread_initialize.c + + + tx_thread_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + + + tx_thread_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + tx_thread_preemption_change.c + 1 + ..\..\..\..\common\src\tx_thread_preemption_change.c + + + tx_thread_priority_change.c + 1 + ..\..\..\..\common\src\tx_thread_priority_change.c + + + tx_thread_relinquish.c + 1 + ..\..\..\..\common\src\tx_thread_relinquish.c + + + tx_thread_reset.c + 1 + ..\..\..\..\common\src\tx_thread_reset.c + + + tx_thread_resume.c + 1 + ..\..\..\..\common\src\tx_thread_resume.c + + + tx_thread_shell_entry.c + 1 + ..\..\..\..\common\src\tx_thread_shell_entry.c + + + tx_thread_sleep.c + 1 + ..\..\..\..\common\src\tx_thread_sleep.c + + + tx_thread_stack_analyze.c + 1 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + + + tx_thread_stack_error_handler.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + tx_thread_stack_error_notify.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + tx_thread_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_suspend.c + + + tx_thread_system_preempt_check.c + 1 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + tx_thread_system_resume.c + 1 + ..\..\..\..\common\src\tx_thread_system_resume.c + + + tx_thread_system_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_system_suspend.c + + + tx_thread_terminate.c + 1 + ..\..\..\..\common\src\tx_thread_terminate.c + + + tx_thread_time_slice.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice.c + + + tx_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + + + tx_thread_timeout.c + 1 + ..\..\..\..\common\src\tx_thread_timeout.c + + + tx_thread_wait_abort.c + 1 + ..\..\..\..\common\src\tx_thread_wait_abort.c + + + tx_time_get.c + 1 + ..\..\..\..\common\src\tx_time_get.c + + + tx_time_set.c + 1 + ..\..\..\..\common\src\tx_time_set.c + + + tx_timer_activate.c + 1 + ..\..\..\..\common\src\tx_timer_activate.c + + + tx_timer_change.c + 1 + ..\..\..\..\common\src\tx_timer_change.c + + + tx_timer_create.c + 1 + ..\..\..\..\common\src\tx_timer_create.c + + + tx_timer_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_deactivate.c + + + tx_timer_delete.c + 1 + ..\..\..\..\common\src\tx_timer_delete.c + + + tx_timer_expiration_process.c + 1 + ..\..\..\..\common\src\tx_timer_expiration_process.c + + + tx_timer_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_info_get.c + + + tx_timer_initialize.c + 1 + ..\..\..\..\common\src\tx_timer_initialize.c + + + tx_timer_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + + + tx_timer_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + tx_timer_system_activate.c + 1 + ..\..\..\..\common\src\tx_timer_system_activate.c + + + tx_timer_system_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + + + tx_timer_thread_entry.c + 1 + ..\..\..\..\common\src\tx_timer_thread_entry.c + + + tx_trace_buffer_full_notify.c + 1 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + tx_trace_disable.c + 1 + ..\..\..\..\common\src\tx_trace_disable.c + + + tx_trace_enable.c + 1 + ..\..\..\..\common\src\tx_trace_enable.c + + + tx_trace_event_filter.c + 1 + ..\..\..\..\common\src\tx_trace_event_filter.c + + + tx_trace_event_unfilter.c + 1 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + + + tx_trace_initialize.c + 1 + ..\..\..\..\common\src\tx_trace_initialize.c + + + tx_trace_interrupt_control.c + 1 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + + + tx_trace_isr_enter_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + tx_trace_isr_exit_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + tx_trace_object_register.c + 1 + ..\..\..\..\common\src\tx_trace_object_register.c + + + tx_trace_object_unregister.c + 1 + ..\..\..\..\common\src\tx_trace_object_unregister.c + + + tx_trace_user_event_insert.c + 1 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + + + txe_block_allocate.c + 1 + ..\..\..\..\common\src\txe_block_allocate.c + + + txe_block_pool_create.c + 1 + ..\..\..\..\common\src\txe_block_pool_create.c + + + txe_block_pool_delete.c + 1 + ..\..\..\..\common\src\txe_block_pool_delete.c + + + txe_block_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_block_pool_info_get.c + + + txe_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + + + txe_block_release.c + 1 + ..\..\..\..\common\src\txe_block_release.c + + + txe_byte_allocate.c + 1 + ..\..\..\..\common\src\txe_byte_allocate.c + + + txe_byte_pool_create.c + 1 + ..\..\..\..\common\src\txe_byte_pool_create.c + + + txe_byte_pool_delete.c + 1 + ..\..\..\..\common\src\txe_byte_pool_delete.c + + + txe_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + + + txe_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + txe_byte_release.c + 1 + ..\..\..\..\common\src\txe_byte_release.c + + + txe_event_flags_create.c + 1 + ..\..\..\..\common\src\txe_event_flags_create.c + + + txe_event_flags_delete.c + 1 + ..\..\..\..\common\src\txe_event_flags_delete.c + + + txe_event_flags_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_get.c + + + txe_event_flags_info_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_info_get.c + + + txe_event_flags_set.c + 1 + ..\..\..\..\common\src\txe_event_flags_set.c + + + txe_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + + + txe_mutex_create.c + 1 + ..\..\..\..\common\src\txe_mutex_create.c + + + txe_mutex_delete.c + 1 + ..\..\..\..\common\src\txe_mutex_delete.c + + + txe_mutex_get.c + 1 + ..\..\..\..\common\src\txe_mutex_get.c + + + txe_mutex_info_get.c + 1 + ..\..\..\..\common\src\txe_mutex_info_get.c + + + txe_mutex_prioritize.c + 1 + ..\..\..\..\common\src\txe_mutex_prioritize.c + + + txe_mutex_put.c + 1 + ..\..\..\..\common\src\txe_mutex_put.c + + + txe_queue_create.c + 1 + ..\..\..\..\common\src\txe_queue_create.c + + + txe_queue_delete.c + 1 + ..\..\..\..\common\src\txe_queue_delete.c + + + txe_queue_flush.c + 1 + ..\..\..\..\common\src\txe_queue_flush.c + + + txe_queue_front_send.c + 1 + ..\..\..\..\common\src\txe_queue_front_send.c + + + txe_queue_info_get.c + 1 + ..\..\..\..\common\src\txe_queue_info_get.c + + + txe_queue_prioritize.c + 1 + ..\..\..\..\common\src\txe_queue_prioritize.c + + + txe_queue_receive.c + 1 + ..\..\..\..\common\src\txe_queue_receive.c + + + txe_queue_send.c + 1 + ..\..\..\..\common\src\txe_queue_send.c + + + txe_queue_send_notify.c + 1 + ..\..\..\..\common\src\txe_queue_send_notify.c + + + txe_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + txe_semaphore_create.c + 1 + ..\..\..\..\common\src\txe_semaphore_create.c + + + txe_semaphore_delete.c + 1 + ..\..\..\..\common\src\txe_semaphore_delete.c + + + txe_semaphore_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_get.c + + + txe_semaphore_info_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_info_get.c + + + txe_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + + + txe_semaphore_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_put.c + + + txe_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + + + txe_thread_create.c + 1 + ..\..\..\..\common\src\txe_thread_create.c + + + txe_thread_delete.c + 1 + ..\..\..\..\common\src\txe_thread_delete.c + + + txe_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + txe_thread_info_get.c + 1 + ..\..\..\..\common\src\txe_thread_info_get.c + + + txe_thread_preemption_change.c + 1 + ..\..\..\..\common\src\txe_thread_preemption_change.c + + + txe_thread_priority_change.c + 1 + ..\..\..\..\common\src\txe_thread_priority_change.c + + + txe_thread_relinquish.c + 1 + ..\..\..\..\common\src\txe_thread_relinquish.c + + + txe_thread_reset.c + 1 + ..\..\..\..\common\src\txe_thread_reset.c + + + txe_thread_resume.c + 1 + ..\..\..\..\common\src\txe_thread_resume.c + + + txe_thread_suspend.c + 1 + ..\..\..\..\common\src\txe_thread_suspend.c + + + txe_thread_terminate.c + 1 + ..\..\..\..\common\src\txe_thread_terminate.c + + + txe_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + + + txe_thread_wait_abort.c + 1 + ..\..\..\..\common\src\txe_thread_wait_abort.c + + + txe_timer_activate.c + 1 + ..\..\..\..\common\src\txe_timer_activate.c + + + txe_timer_change.c + 1 + ..\..\..\..\common\src\txe_timer_change.c + + + txe_timer_create.c + 1 + ..\..\..\..\common\src\txe_timer_create.c + + + txe_timer_deactivate.c + 1 + ..\..\..\..\common\src\txe_timer_deactivate.c + + + txe_timer_delete.c + 1 + ..\..\..\..\common\src\txe_timer_delete.c + + + txe_timer_info_get.c + 1 + ..\..\..\..\common\src\txe_timer_info_get.c + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m4/keil/example_build/demo_threadx.c b/ports/cortex_m4/keil/example_build/demo_threadx.c new file mode 100644 index 00000000..9b94bcd4 --- /dev/null +++ b/ports/cortex_m4/keil/example_build/demo_threadx.c @@ -0,0 +1,262 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of six + threads of different priorities, using a message queue, semaphore, and an event flags group. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_QUEUE_SIZE 10 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_EVENT_FLAGS_GROUP event_flags_0; + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; + + +/* Define the thread stacks. */ + +UCHAR thread_0_stack[DEMO_STACK_SIZE]; +UCHAR thread_1_stack[DEMO_STACK_SIZE]; +UCHAR thread_2_stack[DEMO_STACK_SIZE]; +UCHAR thread_3_stack[DEMO_STACK_SIZE]; +UCHAR thread_4_stack[DEMO_STACK_SIZE]; +UCHAR thread_5_stack[DEMO_STACK_SIZE]; + + +/* Define the queue area. */ + +UCHAR queue_0_area[DEMO_QUEUE_SIZE*sizeof(ULONG)]; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); + + +volatile unsigned int bootloop; + +/* Define main entry point. */ + + + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + + + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + thread_0_stack, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + thread_1_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + thread_2_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + thread_3_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + thread_4_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + thread_5_stack, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, queue_0_area, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} diff --git a/ports/cortex_m4/keil/example_build/tx_initialize_low_level.s b/ports/cortex_m4/keil/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..de11bafb --- /dev/null +++ b/ports/cortex_m4/keil/example_build/tx_initialize_low_level.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, =0xE000ED88 ; Pickup address of CPACR + LDR r1, [r0] ; Pickup CPACR + MOV32 r2, 0x00F00000 ; Build enable value + ORR r1, r1, r2 ; Or in enable value + STR r1, [r0] ; Setup CPACR + ENDIF + LDR r0, =__main + BX r0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M4/RVDS */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =HeapMem + LDR r1, =(StackMem + STACK_SIZE) + LDR r2, =(HeapMem + HEAP_SIZE) + LDR r3, =StackMem + BX lr +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END diff --git a/ports/cortex_m4/keil/inc/tx_port.h b/ports/cortex_m4/keil/inc/tx_port.h new file mode 100644 index 00000000..7474585b --- /dev/null +++ b/ports/cortex_m4/keil/inc/tx_port.h @@ -0,0 +1,471 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M4/Keil */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +#ifdef __TARGET_FPU_VFP + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#else + +#ifdef TX_SOURCE_CODE + +register ULONG _control __asm("control"); + +#endif +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +void _tx_vfp_access(void); + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_vfp_access(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + +/* Define FPU extension for the Cortex-M4. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M4/Keil Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m4/keil/readme_threadx.txt b/ports/cortex_m4/keil/readme_threadx.txt new file mode 100644 index 00000000..188eb21d --- /dev/null +++ b/ports/cortex_m4/keil/readme_threadx.txt @@ -0,0 +1,208 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Thumb & 32-bit Mode + + Using the Keil Microcontroller Development Kit + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy, simply load the project file +ThreadX_Library.Uv2, which is located inside the "example_build" directory. + +Once the ThreadX library files are displayed in the project window, +select the "Build Target" operation and observe the compilation and assembly +of the ThreadX library. This project build produces the ThreadX library +file ThreadX_Library.lib. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the Keil debugger or +Cortex-M4 hardware. This demonstration is slightly smaller than typical ThreadX +demonstrations, and thus requires less than 7KB of Flash and less than 4KB of RAM. + +Building the demonstration is easy; simply open the ThreadX demonstration +project file ThreadX_Demo.Uv2, which is located inside the "example_build" +directory. + +Once open, select the "Build Target" operation and observe the compilation of +sample_threadx.c (which is the demonstration application) and linking with +ThreadX_Library.lib. The resulting file sample_threadx.axf is a binary file that +can be downloaded and executed on Cortex-M4 hardware. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using Keil tools is at label +__main. This is defined within the Keil compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 s0 + 0x04 s1 + 0x08 s2 + 0x0C s3 + 0x10 s4 + 0x14 s5 + 0x18 s6 + 0x1C s7 + 0x20 s8 + 0x24 s9 + 0x28 s10 + 0x2C s11 + 0x30 s12 + 0x34 s13 + 0x38 s14 + 0x3C s15 + 0x40 s16 + 0x44 s17 + 0x48 s18 + 0x4C s19 + 0x50 s20 + 0x54 s21 + 0x58 s22 + 0x5C s23 + 0x60 s24 + 0x64 s25 + 0x68 s26 + 0x6C s27 + 0x70 s28 + 0x74 s29 + 0x78 s30 + 0x7C s31 + 0x80 fpscr + 0x84 r4 + 0x88 r5 + 0x8C r6 + 0x90 r7 + 0x94 r8 + 0x98 r9 + 0x9C r10 (sl) + 0xA0 r11 + 0xA4 r0 (Hardware stack starts here!!) + 0xA8 r1 + 0xAC r2 + 0xB0 r3 + 0xB4 r12 + 0xB8 lr + 0xBC pc + 0xC0 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M4 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. FPU Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M4 using Keil tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/keil/src/tx_thread_context_restore.s b/ports/cortex_m4/keil/src/tx_thread_context_restore.s new file mode 100644 index 00000000..7c54ab4e --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_context_restore.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/keil/src/tx_thread_context_save.s b/ports/cortex_m4/keil/src/tx_thread_context_save.s new file mode 100644 index 00000000..268b05a9 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_context_save.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/keil/src/tx_thread_interrupt_control.s b/ports/cortex_m4/keil/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..a5889c6e --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_interrupt_control.s @@ -0,0 +1,85 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s b/ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..3cf2a68c --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s b/ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..20447958 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m4/keil/src/tx_thread_schedule.s b/ports/cortex_m4/keil/src/tx_thread_schedule.s new file mode 100644 index 00000000..fd29b203 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_schedule.s @@ -0,0 +1,298 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; + IF {TARGET_FPU_VFP} = {TRUE} + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register + ENDIF +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save + ENDIF + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore + ENDIF + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_fpu_enable +tx_thread_fpu_enable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT tx_thread_fpu_disable +tx_thread_fpu_disable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT _tx_vfp_access +_tx_vfp_access + VMOV.F32 s0, s0 ; Simply access the VFP + BX lr ; Return to caller + + + ENDIF + + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/keil/src/tx_thread_stack_build.s b/ports/cortex_m4/keil/src/tx_thread_stack_build.s new file mode 100644 index 00000000..aa2f9d4d --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_stack_build.s @@ -0,0 +1,143 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M4 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/keil/src/tx_thread_system_return.s b/ports/cortex_m4/keil/src/tx_thread_system_return.s new file mode 100644 index 00000000..1e9c99a8 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_system_return.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/keil/src/tx_timer_interrupt.s b/ports/cortex_m4/keil/src/tx_timer_interrupt.s new file mode 100644 index 00000000..3a53a2ee --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/ac5/example_build/build_threadx.bat b/ports/cortex_m7/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..89656d39 --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m7 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m7/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m7/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..e964baa0 --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m7 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m7 -O2 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m7/ac5/example_build/sample_threadx.c b/ports/cortex_m7/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..439b0d8b --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,272 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, =0xE000ED88 ; Pickup address of CPACR + LDR r1, [r0] ; Pickup CPACR + MOV32 r2, 0x00F00000 ; Build enable value + ORR r1, r1, r2 ; Or in enable value + STR r1, [r0] ; Setup CPACR + ENDIF + LDR r0, =__main + BX r0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =HeapMem + LDR r1, =(StackMem + STACK_SIZE) + LDR r2, =(HeapMem + HEAP_SIZE) + LDR r3, =StackMem + BX lr +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/ac5/inc/tx_port.h b/ports/cortex_m7/ac5/inc/tx_port.h new file mode 100644 index 00000000..57480ebb --- /dev/null +++ b/ports/cortex_m7/ac5/inc/tx_port.h @@ -0,0 +1,471 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M7/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +#ifdef __TARGET_FPU_VFP + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#else + +#ifdef TX_SOURCE_CODE + +register ULONG _control __asm("control"); + +#endif +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +void _tx_vfp_access(void); + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_vfp_access(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + +/* Define FPU extension for the Cortex-M7. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M7/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m7/ac5/readme_threadx.txt b/ports/cortex_m7/ac5/readme_threadx.txt new file mode 100644 index 00000000..4cf8c2da --- /dev/null +++ b/ports/cortex_m7/ac5/readme_threadx.txt @@ -0,0 +1,207 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M7 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +compiler. At this point you may run the build_threadx.bat batch file. This will +build the ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM DS Cortex-M7 +simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM DS Cortex-M7 +simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M7 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M7 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 s0 + 0x04 s1 + 0x08 s2 + 0x0C s3 + 0x10 s4 + 0x14 s5 + 0x18 s6 + 0x1C s7 + 0x20 s8 + 0x24 s9 + 0x28 s10 + 0x2C s11 + 0x30 s12 + 0x34 s13 + 0x38 s14 + 0x3C s15 + 0x40 s16 + 0x44 s17 + 0x48 s18 + 0x4C s19 + 0x50 s20 + 0x54 s21 + 0x58 s22 + 0x5C s23 + 0x60 s24 + 0x64 s25 + 0x68 s26 + 0x6C s27 + 0x70 s28 + 0x74 s29 + 0x78 s30 + 0x7C s31 + 0x80 fpscr + 0x84 r4 + 0x88 r5 + 0x8C r6 + 0x90 r7 + 0x94 r8 + 0x98 r9 + 0x9C r10 (sl) + 0xA0 r11 + 0xA4 r0 (Hardware stack starts here!!) + 0xA8 r1 + 0xAC r2 + 0xB0 r3 + 0xB4 r12 + 0xB8 lr + 0xBC pc + 0xC0 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M7 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. FPU Support + +ThreadX for Cortex-M7 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M7 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m7/ac5/src/tx_thread_context_restore.s b/ports/cortex_m7/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..b58508d3 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_context_save.s b/ports/cortex_m7/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..5e789200 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_context_save.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..17e4a59a --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,85 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..894f969a --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..364f5414 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_schedule.s b/ports/cortex_m7/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..34bc8cd0 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_schedule.s @@ -0,0 +1,298 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; + IF {TARGET_FPU_VFP} = {TRUE} + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register + ENDIF +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save + ENDIF + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore + ENDIF + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_fpu_enable +tx_thread_fpu_enable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT tx_thread_fpu_disable +tx_thread_fpu_disable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT _tx_vfp_access +_tx_vfp_access + VMOV.F32 s0, s0 ; Simply access the VFP + BX lr ; Return to caller + + + ENDIF + + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/ac5/src/tx_thread_stack_build.s b/ports/cortex_m7/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..d02c3df3 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,143 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M7 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m7/ac5/src/tx_thread_system_return.s b/ports/cortex_m7/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..82daa084 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_system_return.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m7/ac5/src/tx_timer_interrupt.s b/ports/cortex_m7/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..661e01e6 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/gnu/CMakeLists.txt b/ports/cortex_m7/gnu/CMakeLists.txt index a361adf0..6a8d5852 100644 --- a/ports/cortex_m7/gnu/CMakeLists.txt +++ b/ports/cortex_m7/gnu/CMakeLists.txt @@ -8,7 +8,6 @@ target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_stack_build.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.S - # {{END_TARGET_SOURCES}} ) diff --git a/ports/cortex_m7/gnu/example_build/build_threadx.bat b/ports/cortex_m7/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..f0c995e7 --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m7/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m7/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..0e58e963 --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb tx_simulator_startup.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb cortexm7_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m7 -ereset_handler -T sample_threadx.ld tx_simulator_startup.o cortexm7_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m7/gnu/example_build/cortexm7_crt0.s b/ports/cortex_m7/gnu/example_build/cortexm7_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/cortexm7_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m7/gnu/example_build/libc.a b/ports/cortex_m7/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..6c1567d15e3b2f049d1acd9038ac4fcd28005c18 GIT binary patch literal 743432 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 O)*~DyMuzP+-v0+$^S6Nj literal 0 HcmV?d00001 diff --git a/ports/cortex_m7/gnu/example_build/sample_threadx.c b/ports/cortex_m7/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..597f373c --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m7/gnu/example_build/sample_threadx.ld b/ports/cortex_m7/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m7/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m7/gnu/example_build/tx_initialize_low_level.S old mode 100755 new mode 100644 similarity index 95% rename from ports/cortex_m7/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m7/gnu/example_build/tx_initialize_low_level.S index 1957867c..7b0e2100 --- a/ports/cortex_m7/gnu/src/tx_initialize_low_level_sample.S +++ b/ports/cortex_m7/gnu/example_build/tx_initialize_low_level.S @@ -59,7 +59,7 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M7/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -93,6 +93,9 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), fixed */ +@/* GNU assembly comment, */ +@/* resulting in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_initialize_low_level(VOID) @@ -191,14 +194,14 @@ __tx_IntHandler: @ { PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif @ /* Do interrupt handler work here */ @ /* BL .... */ #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR @@ -216,11 +219,11 @@ SysTick_Handler: @ PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif BL _tx_timer_interrupt #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR diff --git a/ports/cortex_m7/gnu/src/tx_vector_table_sample.S b/ports/cortex_m7/gnu/example_build/tx_simulator_startup.s similarity index 100% rename from ports/cortex_m7/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m7/gnu/example_build/tx_simulator_startup.s diff --git a/ports/cortex_m7/gnu/readme_threadx.txt b/ports/cortex_m7/gnu/readme_threadx.txt new file mode 100644 index 00000000..287d3481 --- /dev/null +++ b/ports/cortex_m7/gnu/readme_threadx.txt @@ -0,0 +1,151 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M7 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M7 + +The ThreadX demonstration is designed to execute on Cortex-M7 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M7 using gnu tools uses the standard GNU +Cortex-M7 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M7 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M7 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +A ThreadX managed interrupt is defined below. By following these conventions, the +application ISR is then allowed access to various ThreadX services from the ISR. +Here is the standard template for managed ISRs in ThreadX: + + + .global __tx_IntHandler + .thumb_func +__tx_IntHandler: +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, lr} + BX lr +; } + + +Note: the Cortex-M7 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. FPU Support + +ThreadX for Cortex-M7 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M7 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m7/gnu/src/tx_thread_stack_build.S b/ports/cortex_m7/gnu/src/tx_thread_stack_build.S index 19417731..8c4a6b7d 100755 --- a/ports/cortex_m7/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m7/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M7/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -91,7 +96,7 @@ _tx_thread_stack_build: @ r7 Initial value for r7 @ r8 Initial value for r8 @ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) +@ r10 Initial value for r10 @ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @@ -119,9 +124,7 @@ _tx_thread_stack_build: STR r3, [r2, #16] @ Store initial r7 STR r3, [r2, #20] @ Store initial r8 STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOV r3, #0 @ Build initial register value + STR r3, [r2, #28] @ Store initial r10 STR r3, [r2, #32] @ Store initial r11 @ @ /* Hardware stack follows. */ diff --git a/ports/cortex_m7/iar/example_build/azure_rtos.eww b/ports/cortex_m7/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m7/iar/example_build/cstartup_M.s b/ports/cortex_m7/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..75d9369b --- /dev/null +++ b/ports/cortex_m7/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(1) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + B __iar_program_start + + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.c b/ports/cortex_m7/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..9a626828 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.c @@ -0,0 +1,381 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + +/* Optimize by disabling basic ThreadX error checking. */ +#define TX_DISABLE_ERROR_CHECKING + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define memory pool. */ + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.dep b/ports/cortex_m7/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..3e6a20f0 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.dep @@ -0,0 +1,113 @@ + + + 4 + 774047933 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\lib\m7M_tls.a + $TOOLKIT_DIR$\lib\dl7M_tln.a + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + [ROOT_NODE] + + + ILINK + 12 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 3 5 0 17 10 11 1 18 19 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 10 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 5 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 0 + + + __cstat + 28 + + + BICOMP + 23 + + + + + ICCARM + 29 26 24 6 14 4 20 7 8 2 9 16 15 27 31 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.ewd b/ports/cortex_m7/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..6f975a27 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.ewp b/ports/cortex_m7/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..8c183b8f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2127 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.ewt b/ports/cortex_m7/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..24445b46 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.icf b/ports/cortex_m7/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..246d387e --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.icf @@ -0,0 +1,42 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define symbol FlashConfig_start__= 0x00000400; +define symbol FlashConfig_end__ = 0x0000040f; + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to (FlashConfig_start__ - 1)] | [from (FlashConfig_end__+1) to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +define region FlashConfig_region = mem:[from FlashConfig_start__ to FlashConfig_end__]; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; + +place in FlashConfig_region + {section FlashConfig}; + +place in RAM_region { last section FREE_MEM}; + diff --git a/ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..85a9832f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 286 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 020000000A00259600000100000010860000090000000C81000002000000048600000100000000810000010000000E81000001000000118600000900000046810000020000000D81000001000000E880000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000062040000000A000065050000 + 000000004B040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000006601000047040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF66010000320000006A010000470400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000047040000000A00004B040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000062040000000A000065050000000000004B040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..f5c060f6 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..9fc15b26 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..c0ab94e4 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M7" + +"--fpu=VFPv5_SP" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..db2ac682 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m7/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..40bc8d5f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1356 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 149 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1B0000000A00259600000100000010860000090000000C81000002000000048600000100000000810000010000000E81000001000000118600000900000046810000020000000D81000001000000E880000001000000 + + + 1100FFFFFFFF8386000058860000008D0000008800000188000002880000038800000488000005880000439200001E920000289200002992000024960000259600001F960000 + 180057860000180000005992000023000000239200000000000007860000270000001D9200001100000004860000240000009A860000160000000084000075000000259200001900000044920000210000001A860000310000001F9200001E0000008E8600003A00000006860000260000002D920000200000006986000037000000558600000600000023960000860000000E86000017000000A18600003B000000C386000003000000C08600000A00000005860000250000002C9200001F000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000CB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34062 + 020800004C00000024090000FC000000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34064 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34100 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34112 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 020800004C000000820A0000DC000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34060 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 020800004C00000008090000AC010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 020800004C00000008090000AC010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34104 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 020800004C00000024090000FC000000 + 0A01000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34115 + 020800004C00000024090000FC000000 + 0A01000050010000A406000000020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 020800004C00000008090000AC010000 + FA0800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34118 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000001000000FFFFFFFFFFFFFFFFF60800004C000000FA0800009A040000010000000200001004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100004C010000A406000050010000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000000020000A406000004020000000000000100000004000000010000000000000000000000428500000000000000000000000000000000000001000000428500000100000042850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF0100000049850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004985000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4985000001000000FFFFFFFF49850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000080000000000000FFFFFFFFFFFFFFFF00000000F0010000A4060000F4010000000000000100000004000000010000000000000000000000FFFFFFFF040000001A8500001B8500001C8500001D85000001800080000000000000000000000B020000A4060000CB02000000000000F4010000A4060000B4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001A85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001D85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1A85000001000000FFFFFFFF1A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000E85000010850000118500001285000034850000408500000180008000000100000000000000CF020000A40600007F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003485000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004085000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004B85000000000000000000000000000000000000010000004B850000010000004B850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + E40300001A0000002904000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000062000000FFFEFF000000000000000000000000000100000001000000018001E100000000000063000000FFFEFF000000000000000000000000000100000001000000018003E100000000000065000000FFFEFF0000000000000000000000000001000000010000000180008100000000000046000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000000068000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018022E100000000040069000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE10000000004006F000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF00960000000000000000000180218100000000040059000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006B000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018029E10000000000006E000000FFFEFF0000000000000000000000000001000000010000000180028100000000000048000000FFFEFF000000000000000000000000000100000001000000018029810000000000005D000000FFFEFF000000000000000000000000000100000001000000018027810000000000005B000000FFFEFF000000000000000000000000000100000001000000018028810000000000005C000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040055000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040056000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004C000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004D000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000061000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000057000000FFFEFF0000000000000000000000000001000000010000000180208100000000000058000000FFFEFF000000000000000000000000000100000001000000018046810000000002005F000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34123 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34126 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34122 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..7ae81233 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 4108083456 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..b5f366cc --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M7" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.crun b/ports/cortex_m7/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.dbgdt b/ports/cortex_m7/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.dnx b/ports/cortex_m7/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m7/iar/example_build/tx.dep b/ports/cortex_m7/iar/example_build/tx.dep new file mode 100644 index 00000000..30b4e270 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.dep @@ -0,0 +1,8055 @@ + + + 4 + 851124999 + + Debug + + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_misra.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 518 + + + BICOMP + 18 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 3 + + + BICOMP + 587 419 564 3 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 535 + + + BICOMP + 52 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 3 + + + BICOMP + 531 182 237 587 525 419 564 8 3 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 434 + + + BICOMP + 338 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 3 + + + BICOMP + 593 562 210 592 8 3 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 357 + + + BICOMP + 397 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 3 + + + BICOMP + 531 182 237 587 525 419 564 8 3 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 393 + + + BICOMP + 96 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 3 + + + BICOMP + 593 562 210 592 8 3 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 405 + + + BICOMP + 559 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 592 3 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 137 + + + BICOMP + 39 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 592 3 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 327 + + + BICOMP + 570 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 3 + + + BICOMP + 587 419 564 3 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 396 + + + BICOMP + 328 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 592 3 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 431 + + + BICOMP + 24 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 3 + + + BICOMP + 587 419 564 3 525 210 531 8 237 182 541 540 562 593 592 + + + + + [ROOT_NODE] + + + IARCHIVE + 120 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 357 535 393 327 434 405 137 396 431 518 495 464 500 432 382 44 569 76 370 597 58 86 485 356 548 84 378 533 440 347 329 74 68 538 520 437 411 473 355 54 41 70 416 77 542 470 517 127 504 359 12 376 132 493 108 374 387 420 429 334 578 523 563 418 65 352 461 122 497 363 516 63 488 341 505 515 574 408 130 94 554 558 468 584 543 19 88 591 36 560 351 38 326 514 487 344 557 112 354 107 524 596 428 451 15 575 519 335 32 332 498 47 379 21 489 49 23 581 459 422 71 412 75 561 496 410 395 42 457 126 474 458 480 476 494 400 425 386 92 506 583 421 67 121 78 110 73 37 503 534 345 490 427 64 528 45 433 499 346 389 124 407 35 358 509 588 398 372 128 426 529 388 492 573 549 511 565 430 402 413 576 521 481 491 80 449 556 424 404 547 555 423 330 89 + + + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 397 52 96 570 338 559 39 328 24 18 69 586 17 13 111 109 445 417 545 62 331 91 486 114 117 34 353 466 60 56 448 61 48 364 589 123 472 447 20 106 522 544 371 59 333 482 539 483 550 375 100 513 115 401 475 580 469 484 598 95 444 553 460 102 40 349 99 507 81 26 479 568 392 443 537 57 455 384 595 454 14 415 579 566 90 510 43 362 391 546 577 337 113 380 453 441 66 442 373 104 582 369 29 118 477 439 343 116 336 135 25 30 599 87 82 446 403 51 350 97 590 85 409 572 79 93 438 452 105 399 50 101 390 512 471 348 134 342 55 594 406 456 526 368 133 467 16 532 98 462 339 502 394 567 450 83 33 27 552 53 103 527 46 585 551 465 501 31 125 478 414 381 119 508 377 28 340 385 136 436 435 131 571 22 463 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 432 + + + BICOMP + 13 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 156 + + + BICOMP + 156 592 210 562 593 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 437 + + + BICOMP + 123 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 139 + + + BICOMP + 564 182 237 541 525 8 139 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 76 + + + BICOMP + 417 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 564 156 541 525 8 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 473 + + + BICOMP + 447 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 44 + + + BICOMP + 109 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 564 156 541 525 8 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 58 + + + BICOMP + 331 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 156 + + + BICOMP + 156 592 210 182 562 593 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 86 + + + BICOMP + 91 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 145 + + + BICOMP + 564 237 541 525 8 145 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 485 + + + BICOMP + 486 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 145 + + + BICOMP + 182 540 562 210 8 145 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 548 + + + BICOMP + 117 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 145 + + + BICOMP + 182 541 525 145 210 564 8 237 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 347 + + + BICOMP + 56 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 145 + + + BICOMP + 541 525 145 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 569 + + + BICOMP + 445 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 564 156 541 525 8 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 74 + + + BICOMP + 61 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 139 + + + BICOMP + 562 139 593 167 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 370 + + + BICOMP + 545 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 156 + + + BICOMP + 156 592 210 562 593 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 440 + + + BICOMP + 60 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 562 145 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 68 + + + BICOMP + 48 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 167 237 231 183 181 145 139 3 156 + + + BICOMP + 562 540 183 3 210 237 145 182 8 167 231 181 139 156 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 411 + + + BICOMP + 472 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 210 139 + + + BICOMP + 541 525 139 237 564 8 210 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 533 + + + BICOMP + 466 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 562 145 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 329 + + + BICOMP + 448 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 145 + + + BICOMP + 540 562 182 210 8 145 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 520 + + + BICOMP + 589 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 + + + BICOMP + 531 167 587 525 419 564 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 495 + + + BICOMP + 69 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 156 + + + BICOMP + 562 182 593 237 592 8 156 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 464 + + + BICOMP + 586 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 156 + + + BICOMP + 562 182 593 237 592 8 156 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 500 + + + BICOMP + 17 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 156 + + + BICOMP + 541 525 210 564 8 156 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 382 + + + BICOMP + 111 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 156 + + + BICOMP + 541 525 210 564 8 156 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 597 + + + BICOMP + 62 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 156 + + + BICOMP + 562 593 237 182 592 8 156 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 84 + + + BICOMP + 34 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 145 + + + BICOMP + 182 540 562 210 8 145 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 378 + + + BICOMP + 353 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 562 145 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 356 + + + BICOMP + 114 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 145 + + + BICOMP + 541 525 145 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 538 + + + BICOMP + 364 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 592 231 167 562 593 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 504 + + + BICOMP + 550 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 429 + + + BICOMP + 598 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 181 + + + BICOMP + 587 419 564 182 525 210 531 8 181 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 563 + + + BICOMP + 460 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 418 + + + BICOMP + 102 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 517 + + + BICOMP + 539 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 181 + + + BICOMP + 562 237 182 540 8 181 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 108 + + + BICOMP + 475 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 531 181 587 525 419 564 8 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 578 + + + BICOMP + 444 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 183 + + + BICOMP + 531 182 237 587 525 419 564 8 183 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 41 + + + BICOMP + 522 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 562 139 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 12 + + + BICOMP + 100 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 182 210 8 237 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 54 + + + BICOMP + 106 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 139 + + + BICOMP + 540 562 210 8 139 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 132 + + + BICOMP + 115 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 531 181 587 525 419 564 8 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 77 + + + BICOMP + 59 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 334 + + + BICOMP + 95 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 182 587 419 564 183 525 210 531 8 237 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 387 + + + BICOMP + 469 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 182 540 562 181 210 8 237 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 65 + + + BICOMP + 40 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 183 + + + BICOMP + 593 182 562 210 592 8 183 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 355 + + + BICOMP + 20 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 182 564 8 237 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 70 + + + BICOMP + 544 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 562 139 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 416 + + + BICOMP + 371 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 562 139 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 470 + + + BICOMP + 482 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 359 + + + BICOMP + 375 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 523 + + + BICOMP + 553 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 183 + + + BICOMP + 593 182 562 210 592 8 183 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 352 + + + BICOMP + 349 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 592 183 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 493 + + + BICOMP + 401 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 531 181 587 525 419 564 8 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 127 + + + BICOMP + 483 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 181 + + + BICOMP + 587 419 564 525 210 531 8 181 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 420 + + + BICOMP + 484 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 542 + + + BICOMP + 333 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 139 + + + BICOMP + 182 564 237 541 525 8 139 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 376 + + + BICOMP + 513 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 181 + + + BICOMP + 587 419 564 525 210 531 8 181 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 374 + + + BICOMP + 580 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 451 + + + BICOMP + 441 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 231 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 412 + + + BICOMP + 599 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 112 + + + BICOMP + 577 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 428 + + + BICOMP + 453 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 210 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 107 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 519 + + + BICOMP + 373 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 335 + + + BICOMP + 104 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 332 + + + BICOMP + 369 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 21 + + + BICOMP + 439 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 489 + + + BICOMP + 343 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 15 + + + BICOMP + 66 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 47 + + + BICOMP + 118 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 459 + + + BICOMP + 135 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 75 + + + BICOMP + 87 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 49 + + + BICOMP + 116 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 354 + + + BICOMP + 337 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 237 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 557 + + + BICOMP + 546 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 581 + + + BICOMP + 336 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 561 + + + BICOMP + 82 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 496 + + + BICOMP + 446 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 410 + + + BICOMP + 403 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 32 + + + BICOMP + 582 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 524 + + + BICOMP + 113 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 237 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 575 + + + BICOMP + 442 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 596 + + + BICOMP + 380 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 231 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 23 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 422 + + + BICOMP + 25 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 71 + + + BICOMP + 30 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 498 + + + BICOMP + 29 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 379 + + + BICOMP + 477 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 63 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 341 + + + BICOMP + 568 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 167 + + + BICOMP + 525 167 587 419 564 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 574 + + + BICOMP + 537 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 182 562 593 8 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 122 + + + BICOMP + 507 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 592 183 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 130 + + + BICOMP + 455 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 + + + BICOMP + 237 182 531 8 540 525 419 564 167 587 541 562 593 592 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 554 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 515 + + + BICOMP + 443 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 182 593 210 592 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 19 + + + BICOMP + 14 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 182 592 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 558 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 497 + + + BICOMP + 81 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 88 + + + BICOMP + 415 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 564 231 210 541 525 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 461 + + + BICOMP + 99 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 592 183 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 468 + + + BICOMP + 384 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 36 + + + BICOMP + 566 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 167 + + + BICOMP + 525 167 587 419 564 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 591 + + + BICOMP + 579 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 38 + + + BICOMP + 510 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 564 231 210 541 525 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 326 + + + BICOMP + 43 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 182 562 593 8 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 514 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 487 + + + BICOMP + 362 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 344 + + + BICOMP + 391 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 94 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 584 + + + BICOMP + 595 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 543 + + + BICOMP + 454 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 182 562 593 210 592 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 560 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 351 + + + BICOMP + 90 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 363 + + + BICOMP + 26 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 488 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 505 + + + BICOMP + 392 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 408 + + + BICOMP + 57 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 516 + + + BICOMP + 479 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 183 + + + BICOMP + 593 182 562 210 592 8 183 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 481 + + + BICOMP + 508 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 124 + + + BICOMP + 502 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 372 + + + BICOMP + 552 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 529 + + + BICOMP + 527 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 183 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 573 + + + BICOMP + 551 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 433 + + + BICOMP + 532 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 139 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 346 + + + BICOMP + 462 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 231 237 181 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 407 + + + BICOMP + 394 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 398 + + + BICOMP + 27 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + BICOMP + 465 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 389 + + + BICOMP + 339 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 413 + + + BICOMP + 414 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 565 + + + BICOMP + 31 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 521 + + + BICOMP + 119 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 491 + + + BICOMP + 377 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 556 + + + BICOMP + 385 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 35 + + + BICOMP + 567 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 388 + + + BICOMP + 46 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 402 + + + BICOMP + 478 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 358 + + + BICOMP + 450 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 430 + + + BICOMP + 125 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 576 + + + BICOMP + 381 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 492 + + + BICOMP + 585 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 426 + + + BICOMP + 103 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 183 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 80 + + + BICOMP + 28 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 499 + + + BICOMP + 98 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 167 139 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 509 + + + BICOMP + 83 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 588 + + + BICOMP + 33 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 128 + + + BICOMP + 53 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 183 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 449 + + + BICOMP + 340 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 511 + + + BICOMP + 501 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 424 + + + BICOMP + 136 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 42 + + + BICOMP + 350 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 458 + + + BICOMP + 409 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 480 + + + BICOMP + 572 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 457 + + + BICOMP + 97 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 126 + + + BICOMP + 590 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 476 + + + BICOMP + 79 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 78 + + + BICOMP + 348 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 156 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 67 + + + BICOMP + 512 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 156 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 73 + + + BICOMP + 342 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 145 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 37 + + + BICOMP + 55 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 145 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 121 + + + BICOMP + 471 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 156 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 534 + + + BICOMP + 406 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 145 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 494 + + + BICOMP + 93 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 3 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 345 + + + BICOMP + 456 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 145 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 110 + + + BICOMP + 134 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 156 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + BICOMP + 526 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 145 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 583 + + + BICOMP + 101 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 156 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 427 + + + BICOMP + 368 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 139 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 64 + + + BICOMP + 133 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 139 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 528 + + + BICOMP + 467 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 139 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 506 + + + BICOMP + 50 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 3 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 421 + + + BICOMP + 390 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 156 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 400 + + + BICOMP + 438 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 3 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 503 + + + BICOMP + 594 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 145 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 474 + + + BICOMP + 85 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 45 + + + BICOMP + 16 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 139 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 395 + + + BICOMP + 51 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 425 + + + BICOMP + 452 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 3 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 92 + + + BICOMP + 399 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 3 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 386 + + + BICOMP + 105 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 3 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 555 + + + BICOMP + 131 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 330 + + + BICOMP + 22 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 423 + + + BICOMP + 571 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 89 + + + BICOMP + 463 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 547 + + + BICOMP + 435 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 404 + + + BICOMP + 436 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 63 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 23 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 554 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 560 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 107 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 488 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 94 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 514 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 74 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 678 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 558 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 130 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 591 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 332 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 498 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 487 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 354 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 524 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 36 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 667 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 38 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 344 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 19 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 15 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 575 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 32 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 47 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 112 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 451 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 335 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 351 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 408 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 543 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 596 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 428 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 519 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 584 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 515 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 574 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 88 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 326 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 557 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 468 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 516 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 429 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 461 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 334 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 418 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 122 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 363 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 578 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 523 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 65 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 505 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 563 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 497 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 341 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 667 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 352 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 77 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 411 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 665 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 470 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 517 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 41 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 542 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 538 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 347 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 329 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 437 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 473 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 520 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 68 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 667 679 671 681 664 673 678 677 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 355 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 54 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 70 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 416 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 413 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 424 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 402 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 556 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 555 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 423 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 491 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 80 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 511 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 449 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 521 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 481 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 430 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 404 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 89 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 547 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 576 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 330 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 565 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 58 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 495 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 569 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 378 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 432 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 370 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 86 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 382 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 76 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 535 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 434 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 44 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 485 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 431 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 548 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 84 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 597 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 533 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 137 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 356 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 440 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 393 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 405 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 500 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 396 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 518 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 464 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 357 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 327 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 127 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 504 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 12 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 376 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 132 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 359 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 108 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 493 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 374 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 387 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 420 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 35 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 573 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 388 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 128 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 345 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 45 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 78 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 499 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 389 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 73 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 407 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 358 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 398 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 433 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 503 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 372 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 37 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 64 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 534 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 110 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 528 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 124 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 427 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 346 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 509 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 588 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 426 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 529 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 492 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 506 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 421 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 581 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 476 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 425 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 410 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 412 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 67 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 583 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 121 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 422 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 395 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 561 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 496 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 489 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 42 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 459 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 457 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 474 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 480 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 75 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 92 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 71 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 494 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 400 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 386 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 21 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 379 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 458 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 126 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 49 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m7/iar/example_build/tx.ewd b/ports/cortex_m7/iar/example_build/tx.ewd new file mode 100644 index 00000000..5bb89d18 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m7/iar/example_build/tx.ewp b/ports/cortex_m7/iar/example_build/tx.ewp new file mode 100644 index 00000000..1bb260e3 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.ewp @@ -0,0 +1,2742 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m7/iar/example_build/tx.ewt b/ports/cortex_m7/iar/example_build/tx.ewt new file mode 100644 index 00000000..b13c96f7 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.ewt @@ -0,0 +1,3403 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m7/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m7/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..bcf8d4b1 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,177 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 25000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + ORR r1, r1, #1 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +__tx_SysTickHandler: +SysTick_Handler: +; +; VOID SysTick_Handler (VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, lr} + BX LR +; } + END + diff --git a/ports/cortex_m7/iar/inc/tx_port.h b/ports/cortex_m7/iar/inc/tx_port.h new file mode 100644 index 00000000..9995e99a --- /dev/null +++ b/ports/cortex_m7/iar/inc/tx_port.h @@ -0,0 +1,499 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M7/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + +#ifdef __ARMVFP__ + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + __asm volatile ("vmov.f32 s0, s0"); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT)__CLZ(__RBIT((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +/* The embedded assembler blocks are design so as to be inlinable by the + armlink linker inlining. This requires them to consist of either a + single 32-bit instruction, or either one or two 16-bit instructions + followed by a "BX lr". Note that to reduce the critical region size, the + 16-bit "CPSID i" instruction is preceeded by a 16-bit NOP */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define FPU extension for the Cortex-M7. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M7/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_m7/iar/readme_threadx.txt b/ports/cortex_m7/iar/readme_threadx.txt new file mode 100644 index 00000000..42c8d901 --- /dev/null +++ b/ports/cortex_m7/iar/readme_threadx.txt @@ -0,0 +1,216 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M7 + + Using the IAR Tools + + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR debugger under +simulation. + +Building the demonstration is easy; simply open the threadx.www workspace file, +make the sample_threadx.ewp project the "active project" in the IAR Embedded +Workbench, and select the "Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary ELF file that can be downloaded and executed on the IAR Windows-based +Cortex-M7 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M7 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M7 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 s0 + 0x08 s1 + 0x0C s2 + 0x10 s3 + 0x14 s4 + 0x18 s5 + 0x1C s6 + 0x20 s7 + 0x24 s8 + 0x28 s9 + 0x2C s10 + 0x30 s11 + 0x34 s12 + 0x38 s13 + 0x3C s14 + 0x40 s15 + 0x44 s16 + 0x48 s17 + 0x4C s18 + 0x50 s19 + 0x54 s20 + 0x58 s21 + 0x5C s22 + 0x60 s23 + 0x64 s24 + 0x68 s25 + 0x6C s26 + 0x70 s27 + 0x74 s28 + 0x78 s29 + 0x7C s30 + 0x80 s31 + 0x84 fpscr + 0x88 r4 + 0x8C r5 + 0x90 r6 + 0x94 r7 + 0x98 r8 + 0x9C r9 + 0xA0 r10 (sl) + 0xA4 r11 + 0xA8 r0 (Hardware stack starts here!!) + 0xAC r1 + 0xB0 r2 + 0xB4 r3 + 0xB8 r12 + 0xBC lr + 0xC0 pc + 0xC4 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +The Cortex-M7 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.1 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. VFP Support + +ThreadX for Cortex-M7 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-M7 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m7/iar/src/tx_iar.c b/ports/cortex_m7/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m7/iar/src/tx_misra.s b/ports/cortex_m7/iar/src/tx_misra.s new file mode 100644 index 00000000..60ab3549 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_misra.s @@ -0,0 +1,1074 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** ThreadX MISRA Compliance */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + #define SHT_PROGBITS 0x1 + + EXTERN __aeabi_memset + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_interrupt_disable + EXTERN _tx_thread_interrupt_restore + EXTERN _tx_thread_stack_analyze + EXTERN _tx_thread_stack_error_handler + EXTERN _tx_thread_system_state +#ifdef TX_ENABLE_EVENT_TRACE + EXTERN _tx_trace_buffer_current_ptr + EXTERN _tx_trace_buffer_end_ptr + EXTERN _tx_trace_buffer_start_ptr + EXTERN _tx_trace_event_enable_bits + EXTERN _tx_trace_full_notify_function + EXTERN _tx_trace_header_ptr +#endif + + PUBLIC _tx_misra_always_true + PUBLIC _tx_misra_block_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_byte_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_char_to_uchar_pointer_convert + PUBLIC _tx_misra_const_char_to_char_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_entry_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_indirect_void_to_uchar_pointer_convert + PUBLIC _tx_misra_memset + PUBLIC _tx_misra_message_copy +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_object_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_pointer_to_ulong_convert + PUBLIC _tx_misra_status_get + PUBLIC _tx_misra_thread_stack_check +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_time_stamp_get +#endif + PUBLIC _tx_misra_timer_indirect_to_void_pointer_convert + PUBLIC _tx_misra_timer_pointer_add + PUBLIC _tx_misra_timer_pointer_dif +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_trace_event_insert +#endif + PUBLIC _tx_misra_uchar_pointer_add + PUBLIC _tx_misra_uchar_pointer_dif + PUBLIC _tx_misra_uchar_pointer_sub + PUBLIC _tx_misra_uchar_to_align_type_pointer_convert + PUBLIC _tx_misra_uchar_to_block_pool_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_entry_pointer_convert + PUBLIC _tx_misra_uchar_to_header_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_indirect_byte_pool_pointer_convert + PUBLIC _tx_misra_uchar_to_indirect_uchar_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_object_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_void_pointer_convert + PUBLIC _tx_misra_ulong_pointer_add + PUBLIC _tx_misra_ulong_pointer_dif + PUBLIC _tx_misra_ulong_pointer_sub + PUBLIC _tx_misra_ulong_to_pointer_convert + PUBLIC _tx_misra_ulong_to_thread_pointer_convert + PUBLIC _tx_misra_user_timer_pointer_get + PUBLIC _tx_misra_void_to_block_pool_pointer_convert + PUBLIC _tx_misra_void_to_byte_pool_pointer_convert + PUBLIC _tx_misra_void_to_event_flags_pointer_convert + PUBLIC _tx_misra_void_to_indirect_uchar_pointer_convert + PUBLIC _tx_misra_void_to_mutex_pointer_convert + PUBLIC _tx_misra_void_to_queue_pointer_convert + PUBLIC _tx_misra_void_to_semaphore_pointer_convert + PUBLIC _tx_misra_void_to_thread_pointer_convert + PUBLIC _tx_misra_void_to_uchar_pointer_convert + PUBLIC _tx_misra_void_to_ulong_pointer_convert + PUBLIC _tx_misra_ipsr_get + PUBLIC _tx_misra_control_get + PUBLIC _tx_misra_control_set +#ifdef __ARMVFP__ + PUBLIC _tx_misra_fpccr_get + PUBLIC _tx_misra_vfp_touch +#endif + PUBLIC _tx_version_id + + + SECTION `.data`:DATA:REORDER:NOROOT(2) + DATA +// 51 CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.0 MISRA C Compliant *"; +_tx_version_id: + DC8 43H, 6FH, 70H, 79H, 72H, 69H, 67H, 68H + DC8 74H, 20H, 28H, 63H, 29H, 20H, 31H, 39H + DC8 39H, 36H, 2DH, 32H, 30H, 31H, 38H, 20H + DC8 45H, 78H, 70H, 72H, 65H, 73H, 73H, 20H + DC8 4CH, 6FH, 67H, 69H, 63H, 20H, 49H, 6EH + DC8 63H, 2EH, 20H, 2AH, 20H, 54H, 68H, 72H + DC8 65H, 61H, 64H, 58H, 20H, 35H, 2EH, 38H + DC8 20H, 4DH, 49H, 53H, 52H, 41H, 20H, 43H + DC8 20H, 43H, 6FH, 6DH, 70H, 6CH, 69H, 61H + DC8 6EH, 74H, 20H, 2AH, 0 + DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_memset: + PUSH {R4,LR} + MOVS R4,R0 + MOVS R0,R2 + MOVS R2,R1 + MOVS R1,R0 + MOVS R0,R4 + BL __aeabi_memset + POP {R4,PC} ;; return + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_add: + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_sub: + RSBS R1,R1,#+0 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_dif: + SUBS R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_pointer_to_ulong_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_sub: + MVNS R2,#+3 + MULS R1,R2,R1 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ +/** UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_message_copy: + PUSH {R4,R5} + LDR R3,[R0, #+0] + LDR R4,[R1, #+0] + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + CMP R2,#+2 + BCC.N ??_tx_misra_message_copy_0 + SUBS R2,R2,#+1 + B.N ??_tx_misra_message_copy_1 +??_tx_misra_message_copy_2: + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + SUBS R2,R2,#+1 +??_tx_misra_message_copy_1: + CMP R2,#+0 + BNE.N ??_tx_misra_message_copy_2 +??_tx_misra_message_copy_0: + STR R3,[R0, #+0] + STR R4,[R1, #+0] + POP {R4,R5} + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ +/** TX_TIMER_INTERNAL **ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ +/** **ptr1, ULONG size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ +/** *internal_timer, TX_TIMER **user_timer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_user_timer_pointer_get: + ADDS R2,R0,#+8 + SUBS R2,R2,R0 + RSBS R2,R2,#+0 + ADD R0,R0,R2 + STR R0,[R1, #+0] + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ +/** VOID **highest_stack); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_thread_stack_check: + PUSH {R3-R5,LR} + MOVS R4,R0 + MOVS R5,R1 + BL _tx_thread_interrupt_disable + CMP R4,#+0 + BEQ.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+0] + LDR.N R2,??DataTable2 ;; 0x54485244 + CMP R1,R2 + BNE.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+8] + LDR R2,[R5, #+0] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_1 + LDR R1,[R4, #+8] + STR R1,[R5, #+0] +??_tx_misra_thread_stack_check_1: + LDR R1,[R4, #+12] + LDR R1,[R1, #+0] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R4, #+16] + LDR R1,[R1, #+1] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R5, #+0] + LDR R2,[R4, #+12] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_3 +??_tx_misra_thread_stack_check_2: + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_error_handler + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_3: + LDR R1,[R5, #+0] + LDR R1,[R1, #-4] + CMP R1,#-269488145 + BEQ.N ??_tx_misra_thread_stack_check_0 + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_analyze + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_0: + BL _tx_thread_interrupt_restore + POP {R0,R4,R5,PC} ;; return + +#ifdef TX_ENABLE_EVENT_TRACE + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_trace_event_insert(ULONG event_id, */ +/** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ +/** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_trace_event_insert: + PUSH {R3-R7,LR} + LDR.N R4,??DataTable2_1 + LDR R4,[R4, #+0] + CMP R4,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_2 + LDR R5,[R5, #+0] + LDR R6,[SP, #+28] + TST R5,R6 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_3 + LDR R5,[R5, #+0] + LDR.N R6,??DataTable2_4 + LDR R6,[R6, #+0] + CMP R5,#+0 + BNE.N ??_tx_misra_trace_event_insert_1 + LDR R5,[R6, #+44] + LDR R7,[R6, #+60] + LSLS R7,R7,#+16 + ORRS R7,R7,#0x80000000 + ORRS R5,R7,R5 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_1: + CMP R5,#-252645136 + BCS.N ??_tx_misra_trace_event_insert_3 + MOVS R5,R6 + MOVS R6,#-1 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_3: + MOVS R6,#-252645136 + MOVS R5,#+0 +??_tx_misra_trace_event_insert_2: + STR R6,[R4, #+0] + STR R5,[R4, #+4] + STR R0,[R4, #+8] + LDR R0,[SP, #+32] + STR R0,[R4, #+12] + STR R1,[R4, #+16] + STR R2,[R4, #+20] + STR R3,[R4, #+24] + LDR R0,[SP, #+24] + STR R0,[R4, #+28] + ADDS R4,R4,#+32 + LDR.N R0,??DataTable2_5 + LDR R0,[R0, #+0] + CMP R4,R0 + BCC.N ??_tx_misra_trace_event_insert_4 + LDR.N R0,??DataTable2_6 + LDR R4,[R0, #+0] + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] + LDR.N R0,??DataTable2_8 + LDR R0,[R0, #+0] + CMP R0,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + LDR.N R1,??DataTable2_8 + LDR R1,[R1, #+0] + BLX R1 + B.N ??_tx_misra_trace_event_insert_0 +??_tx_misra_trace_event_insert_4: + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] +??_tx_misra_trace_event_insert_0: + POP {R0,R4-R7,PC} ;; return + + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_1: + DC32 _tx_trace_buffer_current_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_2: + DC32 _tx_trace_event_enable_bits + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_5: + DC32 _tx_trace_buffer_end_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_6: + DC32 _tx_trace_buffer_start_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_7: + DC32 _tx_trace_header_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_8: + DC32 _tx_trace_full_notify_function + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_time_stamp_get(VOID); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_time_stamp_get: + MOVS R0,#+0 + BX LR ;; return + +#endif + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2: + DC32 0x54485244 + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_3: + DC32 _tx_thread_system_state + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_4: + DC32 _tx_thread_current_ptr + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_always_true(void); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_always_true: + MOVS R0,#+1 + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_indirect_void_to_uchar_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************/ +/***********************************************************************************/ +/** */ +/** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ +/** */ +/***********************************************************************************/ +/***********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_block_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_block_pool_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************/ +/************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************/ +/************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_block_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************/ +/**************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************/ +/**************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_byte_pool_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_byte_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_align_type_pointer_convert: + BX LR ;; return + + +/****************************************************************************************************/ +/****************************************************************************************************/ +/** */ +/** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/****************************************************************************************************/ +/****************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_byte_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************************/ +/**************************************************************************************************/ +/** */ +/** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************************/ +/**************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_event_flags_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_ulong_pointer_convert: + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_mutex_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_status_get(UINT status); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_status_get: + MOVS R0,#+0 + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_queue_pointer_convert: + BX LR ;; return + + +/****************************************************************************************/ +/****************************************************************************************/ +/** */ +/** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ +/** */ +/****************************************************************************************/ +/****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_semaphore_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_void_pointer_convert: + BX LR ;; return + + +/*********************************************************************************/ +/*********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ +/** */ +/*********************************************************************************/ +/*********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_thread_pointer_convert: + BX LR ;; return + + +/***************************************************************************************************/ +/***************************************************************************************************/ +/** */ +/** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ +/** */ +/***************************************************************************************************/ +/***************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_indirect_to_void_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_const_char_to_char_pointer_convert: + BX LR ;; return + + +/**********************************************************************************/ +/**********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ +/** */ +/**********************************************************************************/ +/**********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_thread_pointer_convert: + BX LR ;; return + + +#ifdef TX_ENABLE_EVENT_TRACE + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_object_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_object_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_header_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_entry_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_entry_to_uchar_pointer_convert: + BX LR ;; return +#endif + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_char_to_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_ipsr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ipsr_get: + MRS R0, IPSR + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_control_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_get: + MRS R0, CONTROL + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_control_set(ULONG value); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_set: + MSR CONTROL, R0 + BX LR ;; return + + +#ifdef __ARMVFP__ + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_fpccr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(2) + THUMB +_tx_misra_fpccr_get: + LDR r0, =0xE000EF34 ; Build FPCCR address + LDR r0, [r0] ; Load FPCCR value + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_vfp_touch(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_vfp_touch: + vmov.f32 s0, s0 + BX LR ;; return + +#endif + + + SECTION `.iar_vfe_header`:DATA:NOALLOC:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA + DC32 0 + + END diff --git a/ports/cortex_m7/iar/src/tx_thread_context_restore.s b/ports/cortex_m7/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..f671f2d4 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_context_restore.s @@ -0,0 +1,105 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr +#endif +; + POP {lr} + BX lr +; +;} + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_context_save.s b/ports/cortex_m7/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..1febcc18 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_context_save.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover return address +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END diff --git a/ports/cortex_m7/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m7/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..2e95e0f7 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..e435b0b8 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..cfdb140d --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m7/iar/src/tx_thread_schedule.s b/ports/cortex_m7/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..4e97613c --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_schedule.s @@ -0,0 +1,291 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; +#ifdef __ARMVFP__ + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register +#endif +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context PendSV handler. */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts +#endif + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save: +#endif + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore: +#endif + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread +;} +; +#ifdef __ARMVFP__ + + PUBLIC tx_thread_fpu_enable +tx_thread_fpu_enable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + PUBLIC tx_thread_fpu_disable +tx_thread_fpu_disable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + +#endif + + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_stack_build.s b/ports/cortex_m7/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..36518e5e --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_stack_build.s @@ -0,0 +1,144 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M7 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_system_return.s b/ports/cortex_m7/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..126a9c78 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_system_return.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END diff --git a/ports/cortex_m7/iar/src/tx_timer_interrupt.s b/ports/cortex_m7/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..c900f267 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_timer_interrupt.s @@ -0,0 +1,268 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* the expiration functions are called. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired: +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_r4/ac5/example_build/build_threadx.bat b/ports/cortex_r4/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..74f59d4d --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-r4 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r4/ac5/example_build/build_threadx_sample.bat b/ports/cortex_r4/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..20c1b323 --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-r4 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-r4 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_r4/ac5/example_build/sample_threadx.c b/ports/cortex_r4/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..330e7865 --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-R4 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_r4/ac5/inc/tx_port.h b/ports/cortex_r4/ac5/inc/tx_port.h new file mode 100644 index 00000000..75238e40 --- /dev/null +++ b/ports/cortex_r4/ac5/inc/tx_port.h @@ -0,0 +1,335 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-R4. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + diff --git a/ports/cortex_r4/ac5/readme_threadx.txt b/ports/cortex_r4/ac5/readme_threadx.txt new file mode 100644 index 00000000..93ef3dbc --- /dev/null +++ b/ports/cortex_r4/ac5/readme_threadx.txt @@ -0,0 +1,549 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R4 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-R4 Specifies Cortex-R4 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R4 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-R4 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R4 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + +Note that if VFP registers are used in ISRs, the save/restore of VFP registers must be done by the ISR. +In addition, the startup code is responsible for enabling VFP usage. + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R4 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/ac5/src/tx_thread_context_restore.s b/ports/cortex_r4/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..b1f4023c --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,255 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_context_save.s b/ports/cortex_r4/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..f6bde687 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..79ddc37e --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..75325f33 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..e4727145 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..24f4689d --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..984102e0 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..da0cae5c --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..021d8f95 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..6ad5dcf4 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..5fcd5382 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_schedule.s b/ports/cortex_r4/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..a9f7f55a --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_schedule.s @@ -0,0 +1,234 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_stack_build.s b/ports/cortex_r4/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..053db0e1 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R4 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_system_return.s b/ports/cortex_r4/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..4c5b0d28 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_system_return.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..be161ce7 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_timer_interrupt.s b/ports/cortex_r4/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..f6482e30 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/.cproject b/ports/cortex_r4/ac6/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..ba7c73aa --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/.cproject @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/.project b/ports/cortex_r4/ac6/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml b/ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..9fa316ab --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch b/ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch new file mode 100644 index 00000000..37577868 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/gic.c b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.c new file mode 100644 index 00000000..32f21bbe --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.c @@ -0,0 +1,239 @@ +/** GIC start **/ +/* ------------------------- Interrupt Number Definition ------------------------ */ + +#include "gic.h" + +#define VE_R4_GIC_DISTRIBUTOR_BASE (0xAE001000UL) /*!< (PL390 GIC Distributor ) Base Address */ +#define VE_R4_GIC_INTERFACE_BASE (0xAE000000UL) /*!< (PL390 GIC CPU Interface) Base Address */ + +#define GICDistributor ((GICDistributor_Type *) VE_R4_GIC_DISTRIBUTOR_BASE ) /*!< GIC Distributor configuration struct */ +#define GICInterface ((GICInterface_Type *) VE_R4_GIC_INTERFACE_BASE ) /*!< GIC Interface configuration struct */ + +/* Globals for use of post-scatterloading code that must access GIC */ +const uint32_t GICDistributor_BASE = VE_R4_GIC_DISTRIBUTOR_BASE; +const uint32_t GICInterface_BASE = VE_R4_GIC_INTERFACE_BASE; + +#if 0 + +void GIC_SetICDICFR (const uint32_t *ICDICFRn) +{ + uint32_t i, num_irq; + + //Get the maximum number of interrupts that the GIC supports + num_irq = 32 * ((GIC_DistributorInfo() & 0x1f) + 1); + + for (i = 0; i < (num_irq/16); i++) + { + GICDistributor->ICDISPR[i] = *ICDICFRn++; + } +} + +uint32_t GIC_DistributorImplementer(void) +{ + return (uint32_t)(GICDistributor->ICDIIDR); +} + +uint32_t GIC_GetTarget(IRQn_Type IRQn) +{ + char* field = (char*)&(GICDistributor->ICDIPTR[IRQn / 4]); + field += IRQn % 4; + return ((uint32_t)*field & 0xf); +} + +IRQn_Type GIC_AcknowledgePending(void) +{ + return (IRQn_Type)(GICInterface->ICCIAR); +} + +uint32_t GIC_GetBinaryPoint(uint32_t binary_point) +{ + return (uint32_t)GICInterface->ICCBPR; +} + +uint32_t GIC_GetIRQStatus(IRQn_Type IRQn) +{ + uint32_t pending, active; + + active = ((GICDistributor->ICDABR[IRQn / 32]) >> (IRQn % 32)) & 0x1; + pending =((GICDistributor->ICDISPR[IRQn / 32]) >> (IRQn % 32)) & 0x1; + + return ((active<<1) | pending); +} + +void GIC_SendSGI(IRQn_Type IRQn, uint32_t target_list, uint32_t filter_list) +{ + GICDistributor->ICDSGIR = ((filter_list & 0x3) << 24) | ((target_list & 0xff) << 16) | (IRQn & 0xf); +} + +void GIC_EndInterrupt(IRQn_Type IRQn) +{ + GICInterface->ICCEOIR = IRQn; +} + +void GIC_SetPendingIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDISPR[IRQn / 32] = 1 << (IRQn % 32); +} + +void GIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDICPR[IRQn / 32] = 1 << (IRQn % 32); +} +#endif + +void GIC_EnableDistributor(void) +{ + GICDistributor->ICDDCR |= 1; //enable distributor +} + +void GIC_DisableDistributor(void) +{ + GICDistributor->ICDDCR &=~1; //disable distributor +} + +void GIC_SetTarget(IRQn_Type IRQn, uint32_t cpu_target) +{ + char* field = (char*)&(GICDistributor->ICDIPTR[IRQn / 4]); + field += IRQn % 4; + *field = (char)cpu_target & 0xf; +} + +void GIC_EnableInterface(void) +{ + GICInterface->ICCICR |= 1; //enable interface +} + +void GIC_DisableInterface(void) +{ + GICInterface->ICCICR &=~1; //disable distributor +} + +void GIC_EnableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDISER[IRQn / 32] = 1 << (IRQn % 32); +} + +void GIC_DisableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDICER[IRQn / 32] = 1 << (IRQn % 32); +} + +uint32_t GIC_DistributorInfo(void) +{ + return (uint32_t)(GICDistributor->ICDICTR); +} + + +void GIC_SetLevelModel(IRQn_Type IRQn, int8_t edge_level, int8_t model) +{ // Word-size read/writes must be used to access this register + volatile uint32_t * field = &(GICDistributor->ICDICFR[IRQn / 16]); + unsigned bit_shift = (IRQn % 16)<<1; + unsigned int save_word; + + save_word = *field; + save_word &= (~(3 << bit_shift)); + + *field = (save_word | (((edge_level<<1) | model) << bit_shift)); +} + +void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + char* field = (char*)&(GICDistributor->ICDIPR[IRQn / 4]); + field += IRQn % 4; + *field = (char)priority; +} + +uint32_t GIC_GetPriority(IRQn_Type IRQn) +{ + char* field = (char*)&(GICDistributor->ICDIPR[IRQn / 4]); + field += IRQn % 4; + return (uint32_t)*field; +} + +void GIC_InterfacePriorityMask(uint32_t priority) +{ + GICInterface->ICCPMR = priority & 0xff; //set priority mask +} + +void GIC_SetBinaryPoint(uint32_t binary_point) +{ + GICInterface->ICCBPR = binary_point & 0x07; //set binary point +} + +void GIC_DistInit(void) +{ + IRQn_Type i; + uint32_t num_irq = 0; + uint32_t priority_field; + + //A reset sets all bits in the ICDISRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableDistributor(); + //Get the maximum number of interrupts that the GIC supports + num_irq = 32 * ((GIC_DistributorInfo() & 0x1f) + 1); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an ICDIPR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0, 0xff); + priority_field = GIC_GetPriority((IRQn_Type)0); + + for (i = (IRQn_Type)32; i < num_irq; i++) + { + //Disable the SPI interrupt + GIC_DisableIRQ(i); + //Set level-sensitive and 1-N model + GIC_SetLevelModel(i, 0, 1); + //Set priority + GIC_SetPriority(i, priority_field/2); + //Set target list to CPU0 + GIC_SetTarget(i, 1); + } + //Enable distributor + GIC_EnableDistributor(); +} + +void GIC_CPUInterfaceInit(void) +{ + IRQn_Type i; + uint32_t priority_field; + + //A reset sets all bits in the ICDISRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableInterface(); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an ICDIPR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0, 0xff); + priority_field = GIC_GetPriority((IRQn_Type)0); + + //SGI and PPI + for (i = (IRQn_Type)0; i < 32; i++) + { + //Set level-sensitive and 1-N model for PPI + if(i > 15) + GIC_SetLevelModel(i, 0, 1); + //Disable SGI and PPI interrupts + GIC_DisableIRQ(i); + //Set priority + GIC_SetPriority(i, priority_field/2); + } + //Enable interface + GIC_EnableInterface(); + //Set binary point to 0 + GIC_SetBinaryPoint(0); + //Set priority mask + GIC_InterfacePriorityMask(0xff); +} + +void GIC_Enable(void) +{ + GIC_DistInit(); + GIC_CPUInterfaceInit(); //per CPU +} +/** GIC end **/ diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/gic.h b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.h new file mode 100644 index 00000000..7891f74f --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.h @@ -0,0 +1,360 @@ +/**************************************************************************//** + * @file gic.h + * @brief Generic Interrupt Controller (GIC) functions + * @version + * @date 29 August 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + +#ifndef GIC_H_ +#define GIC_H_ + +#include "stdint.h" + +typedef enum IRQn +{ +/****** SGI Interrupts Numbers ****************************************/ + SGI0_IRQn = 0, + SGI1_IRQn = 1, + SGI2_IRQn = 2, + SGI3_IRQn = 3, + SGI4_IRQn = 4, + SGI5_IRQn = 5, + SGI6_IRQn = 6, + SGI7_IRQn = 7, + SGI8_IRQn = 8, + SGI9_IRQn = 9, + SGI10_IRQn = 10, + SGI11_IRQn = 11, + SGI12_IRQn = 12, + SGI13_IRQn = 13, + SGI14_IRQn = 14, + SGI15_IRQn = 15, + +/****** Cortex-R4 Processor Exceptions Numbers ****************************************/ + PrivTimer_IRQn = 34, /*!< Private Timer Interrupt */ + +/****** Platform Exceptions Numbers ***************************************************/ + Watchdog_IRQn = 32, /*!< SP805 Interrupt */ + Timer0_IRQn = 34, /*!< SP804 Interrupt */ + Timer1_IRQn = 35, /*!< SP804 Interrupt */ + RTClock_IRQn = 36, /*!< PL031 Interrupt */ + UART0_IRQn = 37, /*!< PL011 Interrupt */ + UART1_IRQn = 38, /*!< PL011 Interrupt */ + UART2_IRQn = 39, /*!< PL011 Interrupt */ + UART3_IRQn = 40, /*!< PL011 Interrupt */ + MCI0_IRQn = 41, /*!< PL180 Interrupt (1st) */ + MCI1_IRQn = 42, /*!< PL180 Interrupt (2nd) */ + AACI_IRQn = 43, /*!< PL041 Interrupt */ + Keyboard_IRQn = 44, /*!< PL050 Interrupt */ + Mouse_IRQn = 45, /*!< PL050 Interrupt */ + CLCD_IRQn = 46, /*!< PL111 Interrupt */ + Ethernet_IRQn = 47, /*!< SMSC_91C111 Interrupt */ + VFS2_IRQn = 73, /*!< VFS2 Interrupt */ +} IRQn_Type; + +/* IO definitions (access restrictions to peripheral registers) */ +/** +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/** \brief Structure type to access the Generic Interrupt Controller Distributor (GICD) + */ +typedef struct +{ + __IO uint32_t ICDDCR; + __I uint32_t ICDICTR; + __I uint32_t ICDIIDR; + uint32_t RESERVED0[29]; + __IO uint32_t ICDISR[32]; + __IO uint32_t ICDISER[32]; + __IO uint32_t ICDICER[32]; + __IO uint32_t ICDISPR[32]; + __IO uint32_t ICDICPR[32]; + __I uint32_t ICDABR[32]; + uint32_t RESERVED1[32]; + __IO uint32_t ICDIPR[256]; + __IO uint32_t ICDIPTR[256]; + __IO uint32_t ICDICFR[64]; + uint32_t RESERVED2[128]; + __IO uint32_t ICDSGIR; +} GICDistributor_Type; + +/** \brief Structure type to access the Controller Interface (GICC) + */ +typedef struct +{ + __IO uint32_t ICCICR; // +0x000 - RW - CPU Interface Control Register + __IO uint32_t ICCPMR; // +0x004 - RW - Interrupt Priority Mask Register + __IO uint32_t ICCBPR; // +0x008 - RW - Binary Point Register + __I uint32_t ICCIAR; // +0x00C - RO - Interrupt Acknowledge Register + __IO uint32_t ICCEOIR; // +0x010 - WO - End of Interrupt Register + __I uint32_t ICCRPR; // +0x014 - RO - Running Priority Register + __I uint32_t ICCHPIR; // +0x018 - RO - Highest Pending Interrupt Register + __IO uint32_t ICCABPR; // +0x01C - RW - Aliased Binary Point Register + + uint32_t RESERVED[55]; + + __I uint32_t ICCIIDR; // +0x0FC - RO - CPU Interface Identification Register +} GICInterface_Type; + +/*@} end of GICD */ + +/* ########################## GIC functions #################################### */ +/** \brief Functions that manage interrupts via the GIC. + @{ + */ + +/** \brief Enable DistributorGICInterface->ICCICR |= 1; //enable interface + + Enables the forwarding of pending interrupts to the CPU interfaces. + + */ +void GIC_EnableDistributor(void); + +/** \brief Disable Distributor + + Disables the forwarding of pending interrupts to the CPU interfaces. + + */ +void GIC_DisableDistributor(void); + +/** \brief Provides information about the configuration of the GIC. + Provides information about the configuration of the GIC. + - whether the GIC implements the Security Extensions + - the maximum number of interrupt IDs that the GIC supports + - the number of CPU interfaces implemented + - if the GIC implements the Security Extensions, the maximum number of implemented Lockable Shared Peripheral Interrupts (LSPIs). + + \return Distributor Information. + */ +uint32_t GIC_DistributorInfo(void); + +/** \brief Distributor Implementer Identification Register. + + Distributor Implementer Identification Register + + \return Implementer Information. + */ +uint32_t GIC_DistributorImplementer(void); + +/** \brief Set list of processors that the interrupt is sent to if it is asserted. + + The ICDIPTRs provide an 8-bit CPU targets field for each interrupt supported by the GIC. + This field stores the list of processors that the interrupt is sent to if it is asserted. + + \param [in] IRQn Interrupt number. + \param [in] target CPU target + */ +void GIC_SetTarget(IRQn_Type IRQn, uint32_t cpu_target); + +/** \brief Get list of processors that the interrupt is sent to if it is asserted. + + The ICDIPTRs provide an 8-bit CPU targets field for each interrupt supported by the GIC. + This field stores the list of processors that the interrupt is sent to if it is asserted. + + \param [in] IRQn Interrupt number. + \param [in] target CPU target +*/ +uint32_t GIC_GetTarget(IRQn_Type IRQn); + +/** \brief Enable Interface + + Enables the signalling of interrupts to the target processors. + + */ +void GIC_EnableInterface(void); + +/** \brief Disable Interface + + Disables the signalling of interrupts to the target processors. + + */ +void GIC_DisableInterface(void); + +/** \brief Acknowledge Interrupt + + The function acknowledges the highest priority pending interrupt and returns its IRQ number. + + \return Interrupt number + */ +IRQn_Type GIC_AcknowledgePending(void); + +/** \brief End Interrupt + + The function writes the end of interrupt register, indicating that handling of the interrupt is complete. + + \param [in] IRQn Interrupt number. + */ +void GIC_EndInterrupt(IRQn_Type IRQn); + + +/** \brief Enable Interrupt + + Set-enable bit for each interrupt supported by the GIC. + + \param [in] IRQn External interrupt number. + */ +void GIC_EnableIRQ(IRQn_Type IRQn); + +/** \brief Disable Interrupt + + Clear-enable bit for each interrupt supported by the GIC. + + \param [in] IRQn Number of the external interrupt to disable + */ +void GIC_DisableIRQ(IRQn_Type IRQn); + +/** \brief Set Pending Interrupt + + Set-pending bit for each interrupt supported by the GIC. + + \param [in] IRQn Interrupt number. + */ +void GIC_SetPendingIRQ(IRQn_Type IRQn); + +/** \brief Clear Pending Interrupt + + Clear-pending bit for each interrupt supported by the GIC + + \param [in] IRQn Number of the interrupt for clear pending + */ +void GIC_ClearPendingIRQ(IRQn_Type IRQn); + +/** \brief Int_config field for each interrupt supported by the GIC. + + This field identifies whether the corresponding interrupt is: + (1) edge-triggered or (0) level-sensitive + (1) 1-N model or (0) N-N model + + \param [in] IRQn Interrupt number. + \param [in] edge_level (1) edge-triggered or (0) level-sensitive + \param [in] model (1) 1-N model or (0) N-N model + */ +void GIC_SetLevelModel(IRQn_Type IRQn, int8_t edge_level, int8_t model); + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority); + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + */ +uint32_t GIC_GetPriority(IRQn_Type IRQn); + +/** \brief CPU Interface Priority Mask Register + + The priority mask level for the CPU interface. If the priority of an interrupt is higher than the + value indicated by this field, the interface signals the interrupt to the processor. + + \param [in] Mask. + */ +void GIC_InterfacePriorityMask(uint32_t priority); + +/** \brief Set the binary point. + + Set the point at which the priority value fields split into two parts, the group priority field and the subpriority field. + + \param [in] Mask. + */ +void GIC_SetBinaryPoint(uint32_t binary_point); + +/** \brief Get the binary point. + + Get the point at which the priority value fields split into two parts, the group priority field and the subpriority field. + + \return Binary point. + */ +uint32_t GIC_GetBinaryPoint(uint32_t binary_point); + +/** \brief Get Interrupt state. + + Get the interrupt state, whether pending and/or active + + \return 0 - inactive, 1 - pending, 2 - active, 3 - pending and active + */ +uint32_t GIC_GetIRQStatus(IRQn_Type IRQn); + +/** \brief Send Software Generated interrupt + + Provides an interrupt priority filter. Only interrupts with higher priority than the value in this register can be signalled to the processor. +GIC_InterfacePriorityMask + \param [in] IRQn The Interrupt ID of the SGI. + \param [in] target_list CPUTargetList + \param [in] filter_list TargetListFilter + */ +void GIC_SendSGI(IRQn_Type IRQn, uint32_t target_list, uint32_t filter_list); + +/** \brief API call to initialise the interrupt distributor + + API call to initialise the interrupt distributor + + */ +void GIC_DistInit(void); + +/** \brief API call to initialise the CPU interface + + API call to initialise the CPU interface + + */ +void GIC_CPUInterfaceInit(void); + +/** \brief API call to set the Interrupt Configuration Registers + + API call to initialise the Interrupt Configuration Registers + + */ +void GIC_SetICDICFR (const uint32_t *ICDICFRn); + +/** \brief API call to Enable the GIC + + API call to Enable the GIC + + */ +void GIC_Enable(void); + +#endif /* GIC_H_ */ diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..a32037a6 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,373 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include "timer.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + +/* Define main entry point. */ + +int main() +{ + + /* Setup the timer. */ + timer_init(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +UINT status; +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat new file mode 100644 index 00000000..926647b2 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat @@ -0,0 +1,39 @@ +;************************************************** +; Copyright (c) 2017 ARM Ltd. All rights reserved. +;************************************************** + +; Scatter-file for RTX Example on Versatile Express R4 + +; This scatter-file places application code, data and peripherals at suitable addresses in the memory map. + +; This platform has 2GB SDRAM starting at 0x0. + + +SDRAM 0x0 0x40000000 +{ + CODE +0 0x200000 + { + startup.o (Vectors, +FIRST) ; Vector table and other (assembler) startup code + * (InRoot$$Sections) ; All (library) code that must be in a root region + * (+RO-CODE) ; Application RO code (.text) + * (+RO-DATA) ; Application RO data (.constdata) + } + + IRQ_STACK +0 ALIGN 8 EMPTY 1024 {} + + FIQ_STACK +0 ALIGN 8 EMPTY 512 {} + + SVC_STACK +0 ALIGN 8 EMPTY 2048 {} + + SYS_STACK +0 ALIGN 8 EMPTY 2048 {} + + ABORT_STACK +0 ALIGN 8 EMPTY 2048 {} + + ; Application RW & ZI data (.data & .bss) + DATA +0 0x100000 + { + * (+RW,+ZI) + } + + PERIPHERALS 0xA0000000 EMPTY 0x20000000 { }; Peripherals +} diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/startup.S b/ports/cortex_r4/ac6/example_build/sample_threadx/startup.S new file mode 100644 index 00000000..98d3b2b1 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/startup.S @@ -0,0 +1,249 @@ +//---------------------------------------------------------------- +// Cortex-R4(F) Embedded example - Startup Code +// +// Copyright (c) 2006-2018 Arm Limited (or its affiliates). All rights reserved. +// Use, modification and redistribution of this file is subject to your possession of a +// valid End User License Agreement for the Arm Product of which these examples are part of +// and your compliance with all applicable terms and conditions of such licence agreement. +//---------------------------------------------------------------- + + +#define FIQ_MODE 0x11 +#define IRQ_MODE 0x12 +#define SVC_MODE 0x13 +#define ABT_MODE 0x17 +#define SYS_MODE 0x1F + +//---------------------------------------------------------------- + + .eabi_attribute Tag_ABI_align8_preserved,1 + + .section VECTORS,"ax" + .align 3 + .cfi_sections .debug_frame // put stack frame info into .debug_frame instead of .eh_frame + +//---------------------------------------------------------------- +// Exception Vector Table +//---------------------------------------------------------------- +// Note: LDR PC instructions are used here, though branch (B) instructions +// could also be used, unless the exception handlers are >32MB away. + + .global Vectors + +Vectors: + LDR PC, Reset_Addr + LDR pc,=__tx_undefined // Undefined handler + LDR pc,=__tx_swi_interrupt // Software interrupt handler + LDR pc,=__tx_prefetch_handler // Prefetch exception handler + LDR pc,=__tx_abort_handler // Abort exception handler + LDR pc,=__tx_reserved_handler // Reserved exception handler + LDR pc,=__tx_irq_handler // IRQ interrupt handler + LDR pc,=__tx_fiq_handler // FIQ interrupt handler + + + .balign 4 +Reset_Addr: .word Reset_Handler +Undefined_Addr: .word __tx_undefined +SVC_Addr: .word __tx_swi_interrupt +Prefetch_Addr: .word __tx_prefetch_handler +Abort_Addr: .word __tx_abort_handler +IRQ_Addr: .word __tx_irq_handler +FIQ_Addr: .word __tx_fiq_handler + + +//---------------------------------------------------------------- +// Reset Handler +//---------------------------------------------------------------- + + .global Reset_Handler + .type Reset_Handler, "function" +Reset_Handler: + +//---------------------------------------------------------------- +// Disable MPU and caches +//---------------------------------------------------------------- + +// Disable MPU and cache in case it was left enabled from an earlier run +// This does not need to be done from a cold reset + + MRC p15, 0, r0, c1, c0, 0 // Read System Control Register + BIC r0, r0, #(0x1 << 12) // Clear I bit 12 to disable I Cache + BIC r0, r0, #(0x1 << 2) // Clear C bit 2 to disable D Cache + BIC r0, r0, #0x1 // Clear M bit 0 to disable MPU + DSB // Ensure all previous loads/stores have completed + MCR p15, 0, r0, c1, c0, 0 // Write System Control Register + ISB // Ensure subsequent insts execute wrt new MPU settings + +//---------------------------------------------------------------- +// Disable Branch prediction +//---------------------------------------------------------------- + +// In the Cortex-R4, the Z-bit of the SCTLR does not control the program flow prediction. +// Some control bits in the ACTLR control the program flow and prefetch features instead. +// These are enabled by default, but are shown here for completeness. + + MRC p15, 0, r0, c1, c0, 1 // Read ACTLR + ORR r0, r0, #(0x1 << 17) // Enable RSDIS bit 17 to disable the return stack + ORR r0, r0, #(0x1 << 16) // Clear BP bit 15 and set BP bit 16: + BIC r0, r0, #(0x1 << 15) // Branch always not taken and history table updates disabled + MCR p15, 0, r0, c1, c0, 1 // Write ACTLR + ISB + +//---------------------------------------------------------------- +// Cache invalidation +//---------------------------------------------------------------- + + DSB // Complete all outstanding explicit memory operations + + MOV r0, #0 + + MCR p15, 0, r0, c7, c5, 0 // Invalidate entire instruction cache + MCR p15, 0, r0, c15, c5, 0 // Invalidate entire data cache + + +//---------------------------------------------------------------- +// Initialize Supervisor Mode Stack using Linker symbol from scatter file. +// Stacks must be 8 byte aligned. +//---------------------------------------------------------------- + + /****** NOTE ****** We must be in SVC MODE at this point. Some monitors + enter this routine in USER mode and require a software interrupt to + change into SVC mode. */ + +#ifdef TX_ENABLE_IRQ_NESTING + /* Setup the system mode stack for nested interrupt support */ + MOV r3, #SYS_MODE // Build SYS mode CPSR + MSR CPSR_c, r3 // Enter SYS mode + LDR sp, =Image$$SYS_STACK$$ZI$$Limit // Setup SYS stack pointer +#endif + + CPS #ABT_MODE // Build Abort mode CPSR + LDR sp, =Image$$ABORT_STACK$$ZI$$Limit // Setup abort stack pointer + + CPS #FIQ_MODE // Build FIQ mode CPSR + LDR sp, =Image$$FIQ_STACK$$ZI$$Limit // Setup FIQ stack pointer + MOV sl, #0 // Clear sl + MOV fp, #0 // Clear fp + + CPS #IRQ_MODE // Build IRQ mode CPSR + LDR sp, =Image$$IRQ_STACK$$ZI$$Limit // Setup IRQ stack pointer + + CPS #SVC_MODE // Build SVC mode CPSR + LDR sp, =Image$$SVC_STACK$$ZI$$Limit // Setup SVC stack pointer + + +//---------------------------------------------------------------- +// TCM Configuration +//---------------------------------------------------------------- + +// Cortex-R4 optionally provides two Tightly-Coupled Memory (TCM) blocks (ATCM and BTCM) for fast access to code or data. +// ATCM typically holds interrupt or exception code that must be accessed at high speed, +// without any potential delay resulting from a cache miss. +// BTCM typically holds a block of data for intensive processing, such as audio or video data. +// In the Cortex-R4 processor, both ATCM and BTCM support both instruction and data accesses. + +// The following illustrates basic TCM configuration, as the basis for exploration by the user + +#ifdef TCM + .global Image$$ATCM$$Base + .global Image$$BTCM0$$Base + .global Image$$BTCM1$$Base + + MRC p15, 0, r0, c0, c0, 2 // Read TCM Type Register + // r0 now contains ATCM & BTCM availability + + MRC p15, 0, r0, c9, c1, 1 // Read ATCM Region Register + // r0 now contains ATCM size in bits [6:2] + + MRC p15, 0, r0, c9, c1, 0 // Read BTCM Region Register + // r0 now contains BTCM size in bits [6:2] + +// The Cortex-R4F Core Tile has +// 64K ATCM from 0xE0FD0000 to 0xE0FDFFFF +// 64K BTCM0 from 0xE0FE0000 to 0xE0FEFFFF +// 64K BTCM1 from 0xE0FF0000 to 0xE0FFFFFF + + LDR r0, =Image$$ATCM$$Base // Set ATCM base address + ORR r0, r0, #1 // Enable it + MCR p15, 0, r0, c9, c1, 1 // Write ATCM Region Register + + LDR r0, =Image$$BTCM0$$Base // Set BTCM base address + ORR r0, r0, #1 // Enable it + MCR p15, 0, r0, c9, c1, 0 // Write BTCM Region Register + +#endif + +#ifdef __ARM_FP +//---------------------------------------------------------------- +// Enable access to VFP by enabling access to Coprocessors 10 and 11. +// Enables Full Access i.e. in both privileged and non privileged modes +//---------------------------------------------------------------- + + MRC p15, 0, r0, c1, c0, 2 // Read Coprocessor Access Control Register (CPACR) + ORR r0, r0, #(0xF << 20) // Enable access to CP 10 & 11 + MCR p15, 0, r0, c1, c0, 2 // Write Coprocessor Access Control Register (CPACR) + ISB + +//---------------------------------------------------------------- +// Switch on the VFP hardware +//---------------------------------------------------------------- + + MOV r0, #0x40000000 + VMSR FPEXC, r0 // Write FPEXC register, EN bit set +#endif + +//---------------------------------------------------------------- +// Enable Branch prediction +//---------------------------------------------------------------- + +// In the Cortex-R4, the Z-bit of the SCTLR does not control the program flow prediction. +// Some control bits in the ACTLR control the program flow and prefetch features instead. +// These are enabled by default, but are shown here for completeness. + + MRC p15, 0, r0, c1, c0, 1 // Read ACTLR + BIC r0, r0, #(0x1 << 17) // Clear RSDIS bit 17 to enable return stack + BIC r0, r0, #(0x1 << 16) // Clear BP bit 15 and BP bit 16: + BIC r0, r0, #(0x1 << 15) // Normal operation, BP is taken from the global history table. + MCR p15, 0, r0, c1, c0, 1 // Write ACTLR + ISB + + + /* Enable the GIC. */ + BL GIC_Enable + + .global __main + B __main + + .size Reset_Handler, . - Reset_Handler + +//---------------------------------------------------------------- +// Global Enable for Instruction and Data Caching +//---------------------------------------------------------------- + + .global enable_caches + + .type enable_caches, "function" + .cfi_startproc +enable_caches: + + MRC p15, 0, r0, c1, c0, 0 // Read System Control Register + ORR r0, r0, #(0x1 << 12) // enable I Cache + ORR r0, r0, #(0x1 << 2) // enable D Cache + MCR p15, 0, r0, c1, c0, 0 // Write System Control Register + ISB + + BX lr + .cfi_endproc + + .size enable_caches, . - enable_caches + +/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This + routine will set the initial stack to use the ThreadX IRQ & FIQ & + (optionally SYS) stack areas. */ + + .global __user_initial_stackheap + .type __user_initial_stackheap, %function +__user_initial_stackheap: + + LDR r1, =Image$$SVC_STACK$$ZI$$Limit + BX lr // Return to caller diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/timer.c b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.c new file mode 100644 index 00000000..e964d0f6 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.c @@ -0,0 +1,28 @@ +#include "gic.h" + +/* Systick registers */ +#define PRIVTIM_IRQ 34 +#define PRIVATE_TIMER_BASE (0xB0110000) +#define PRIVTIM_RELOAD (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0x0))) +#define PRIVTIM_CURRENT (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0x4))) +#define PRIVTIM_CTRL (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0x8))) +#define PRIVTIM_STATUS (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0xc))) + +#define OS_CLOCK 12000000 +#define OS_TICK 1000 +#define OS_TRV ((uint32_t)(((double)OS_CLOCK*(double)OS_TICK)/1E6)-1) + +#define U32 uint32_t +#define GICD_ICDICER0 (*((volatile U32 *)(GICDistributor_BASE + 0x180))) /* - RW - Interrupt Clear-Enable Registers */ +#define GICD_ICDISER0 (*((volatile U32 *)(GICDistributor_BASE + 0x100))) /* - RW - Interrupt Set-Enable Registers */ +#define GICD_ICDIPR0 (*((volatile U32 *)(GICDistributor_BASE + 0x400))) /* - RW - Interrupt Priority Registers */ +#define GICD_ICDSGIR (*((volatile U32 *)(GICDistributor_BASE + 0xf00))) /* - RW - Interrupt Software Interrupt Register */ +#define GICD_ICDICERx(irq) *(volatile U32 *)(&GICD_ICDICER0 + irq/32) +#define GICD_ICDISERx(irq) *(volatile U32 *)(&GICD_ICDISER0 + irq/32) + +void timer_init() +{ + GIC_EnableIRQ(34); + PRIVTIM_RELOAD = 0x200; + PRIVTIM_CTRL |= 0xC0; /* Enable timer, periodic mode */ +} diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/timer.h b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.h new file mode 100644 index 00000000..efab1fe1 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.h @@ -0,0 +1,4 @@ +#ifndef TIMER_H +#define TIMER_H +void timer_init(); +#endif diff --git a/ports/cortex_r4/ac6/example_build/tx/.cproject b/ports/cortex_r4/ac6/example_build/tx/.cproject new file mode 100644 index 00000000..fed5c2d2 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/tx/.cproject @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/tx/.project b/ports/cortex_r4/ac6/example_build/tx/.project new file mode 100644 index 00000000..161d4e8f --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_common + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_common + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml b/ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..b515c43e --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/inc/tx_port.h b/ports/cortex_r4/ac6/inc/tx_port.h new file mode 100644 index 00000000..5a38b4bf --- /dev/null +++ b/ports/cortex_r4/ac6/inc/tx_port.h @@ -0,0 +1,341 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/AC6 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + +/* Define compiler intrinsics. */ + +#include "arm_compat.h" + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-R4. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/AC6 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + + diff --git a/ports/cortex_r4/ac6/readme_threadx.txt b/ports/cortex_r4/ac6/readme_threadx.txt new file mode 100644 index 00000000..a5849018 --- /dev/null +++ b/ports/cortex_r4/ac6/readme_threadx.txt @@ -0,0 +1,392 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Thumb & 32-bit Mode + + Using ARM Compiler 6 & DS + +1. Import the ThreadX Projects + +In order to build the ThreadX library and the ThreadX demonstration, first move +the project folders into your DS workspace directory. The project folders are +named 'tx' and 'sample_threadx' and are located in the installation directory. + +Now that the projects are in the workspace directory, import them into DS by +doing the following for each project: + + 1. Click 'File -> Import -> Existing Projects into Workspace' + 2. Set the root directory the project i.e. the 'tx' or 'sample_threadx' directory + 3. Click 'Finish' + +Note: the projects were made using DS-5, so DS will prompt you to migrate the projects. +This is expected, so please do so. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply right-click the Eclipse project +"tx" and then select the "Build Project" button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the DS-5 debugger on the +VE_Cortex-R4 Bare Metal simulator. + +Building the demonstration is easy; simply right-click the Eclipse project +"sample_threadx" and then select the "Build Project" button. You should now observe +the compilation and assembly of the ThreadX demonstration. This project build produces +the ThreadX library file sample_threadx.axf. Next, expand the demo ThreadX project folder +in the Project Explorer window, right-click on the 'cortex-r4_tx.launch' file, click +'Debug As', and then click 'cortex-r4_tx' from the submenu. This will cause the +debugger to load the sample_threadx.axf ELF file and run to main. You are now ready +to execute the ThreadX demonstration. + + +4. System Initialization + +The entry point in ThreadX for the Cortex-R4 using ARM tools is at label +"Vectors". This is defined within startup.S in the sample_threadx project. In addition, +this is where all static and global pre-set C variable initialization processing +takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for determining the +first available RAM address for use by the application, which is supplied as the +sole input parameter to your application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup.S +file contains the vectors and is loaded at address zero. On actual hardware platforms, +this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + .global __tx_irq_handler + .type __tx_irq_handler, %function +__tx_irq_handler: + + /* Jump to context save to save system context. */ + B _tx_thread_context_save + + ... + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + /* Application IRQ handlers can be called here! */ + + ... + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + +7.2.2 Vectored IRQ ISRs + +The vectored ARM ISR mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example ISR handler defined in +tx_initialize_low_level.s: + + .global __tx_example_vectored_irq_handler + .type __tx_example_vectored_irq_handler, %function +__tx_example_vectored_irq_handler: + + + /* Save initial context and call context save to prepare for + vectored ISR execution. */ + + STMDB sp!, {r0-r3} // Save some scratch registers + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other scratch registers + BL _tx_thread_vectored_context_save // Vectored context save + + ... + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + /* Application IRQ handlers can be called here! */ + + ... + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .type __tx_irq_handler, %function + .global __tx_irq_processing_return + .type __tx_irq_processing_return, %function +__tx_irq_handler: + + /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: + + ... + + /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start + from IRQ mode with interrupts disabled. This routine switches to the + system mode and returns with IRQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all IRQ interrupts are cleared + prior to enabling nested IRQ interrupts. */ + BL _tx_thread_irq_nesting_start + + /* Application IRQ handlers can be called here! */ + + ... + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_context_restore. + This routine returns in processing in IRQ mode with interrupts disabled. */ + BL _tx_thread_irq_nesting_end + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R4 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + .global __tx_fiq_handler + .type __tx_fiq_handler, %function + .global __tx_fiq_processing_return + .type __tx_fiq_processing_return, %function +__tx_fiq_handler: + + /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: + + /* At this point execution is still in the FIQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. */ + + /* Application FIQ handlers can be called here! */ + + /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .type __tx_fiq_handler, %function + .global __tx_fiq_processing_return + .type __tx_fiq_processing_return, %function +__tx_fiq_handler: + + /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: + + /* At this point execution is still in the FIQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. */ + + /* Enable nested FIQ interrupts. NOTE: Since this service returns + with FIQ interrupts enabled, all FIQ interrupt sources must be + cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start + + /* Application FIQ handlers can be called here! */ + + /* Disable nested FIQ interrupts. The mode is switched back to + FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end + + /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-R4 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R4 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. To build ThreadX +assembly files in Thumb mode, define TX_THUMB_MODE. + + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + +Note that if VFP registers are used in ISRs, the save/restore of VFP registers must be done by the ISR. +In addition, the startup code is responsible for enabling VFP usage. + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R4 using ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/ac6/src/tx_initialize_low_level.S b/ports/cortex_r4/ac6/src/tx_initialize_low_level.S new file mode 100644 index 00000000..e1995158 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_initialize_low_level.S @@ -0,0 +1,326 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + + +#define GICI_BASE 0xAE000000 +#define ICCIAR_OFFSET 0x0000000C +#define ICCEOIR_OFFSET 0x00000010 + + + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + .global _tx_thread_fiq_context_save + .global _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + .global _tx_thread_irq_nesting_start + .global _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + .global _tx_thread_fiq_nesting_start + .global _tx_thread_fiq_nesting_end +#endif + .global _tx_timer_interrupt + .global __main + .global _tx_version_id + .global _tx_build_options + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_initialize_low_level(VOID) +{ */ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, "function" +_tx_initialize_low_level: + + /* Save the system stack pointer. */ + /* _tx_thread_system_stack_ptr = (VOID_PTR) (sp); */ + + LDR r0, =Image$$SVC_STACK$$ZI$$Limit + LDR r1, =_tx_thread_system_stack_ptr // Pickup address of system stack ptr + STR r0, [r1] // Pickup system stack + + /* Save the first available memory address. */ + /* _tx_initialize_unused_memory = (VOID_PTR) Image$$ZI$$Limit + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; */ + + LDR r0, =Image$$DATA$$ZI$$Limit + LDR r2, =_tx_initialize_unused_memory // Pickup unused memory ptr address + STR r0, [r2, #0] // Save first free memory address + + /* Return to caller. */ + BX lr // Return to caller +/* } */ + + /* Define shells for each of the interrupt vectors. */ + + .global __tx_undefined + .type __tx_undefined, "function" +__tx_undefined: + B __tx_undefined // Undefined handler + + .global __tx_swi_interrupt + .type __tx_swi_interrupt, "function" +__tx_swi_interrupt: + B __tx_swi_interrupt // Software interrupt handler + + .global __tx_prefetch_handler + .type __tx_prefetch_handler, "function" +__tx_prefetch_handler: + B __tx_prefetch_handler // Prefetch exception handler + + .global __tx_abort_handler + .type __tx_abort_handler, "function" +__tx_abort_handler: + B __tx_abort_handler // Abort exception handler + + .global __tx_reserved_handler + .type __tx_reserved_handler, "function" +__tx_reserved_handler: + B __tx_reserved_handler // Reserved exception handler + + + .global __tx_irq_handler + .type __tx_irq_handler, "function" + .global __tx_irq_processing_return + .type __tx_irq_processing_return, "function" +__tx_irq_handler: + + /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: + + /* Acknowledge the interrupt. */ + LDR r1, =GICI_BASE // Load the base of the GIC + LDR r0, [r1, #ICCIAR_OFFSET] // Read ICCIAR (GIC CPU Interface register) + DSB // Ensure that interrupt acknowledge completes before re-enabling interrupts + PUSH {r0, r1} // Save the IRQ ID and the GIC base address on the stack + + /* Clear the timer interrupt. */ + LDR r0, =0xB0110000 // Load the base address of the timer + MOV r1, #1 // Setup value to write to the interrupt clear register - can be anything. + STR r1, [r0, #0x0C] // Clear the interrupt. 0x0C is the offset to the interrupt clear register. + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + + BL _tx_timer_interrupt // Timer interrupt handler +_tx_not_timer_interrupt: + + /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start + from IRQ mode with interrupts disabled. This routine switches to the + system mode and returns with IRQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all IRQ interrupts are cleared + prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif + + + /* Application IRQ handlers can be called here! */ + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_context_restore. + This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif + + POP {r0, r1} // Restore the IRQ ID and GIC base address + STR r0, [r1, #ICCEOIR_OFFSET] // Write the IRQ ID to the End Of Interrupt register to clear the active bit + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + + /* This is an example of a vectored IRQ handler. */ + + .global __tx_example_vectored_irq_handler + .type __tx_example_vectored_irq_handler, "function" +__tx_example_vectored_irq_handler: + + + /* Save initial context and call context save to prepare for + vectored ISR execution. */ + +/* + STMDB sp!, {r0-r3} // Save some scratch registers + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other scratch registers + BL _tx_thread_vectored_context_save // Vectored context save +*/ + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + + /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start + from IRQ mode with interrupts disabled. This routine switches to the + system mode and returns with IRQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all IRQ interrupts are cleared + prior to enabling nested IRQ interrupts. */ +/* +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +*/ + + /* Application IRQ handlers can be called here! */ + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_context_restore. + This routine returns in processing in IRQ mode with interrupts disabled. */ +/* +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +*/ + + /* Jump to context restore to restore system context. */ +/* + B _tx_thread_context_restore +*/ + + +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .type __tx_fiq_handler, "function" +__tx_fiq_handler: + + /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save + + .global __tx_fiq_processing_return + .type __tx_fiq_processing_return, "function" +__tx_fiq_processing_return: + + /* At this point execution is still in the FIQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. */ + + /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start + from FIQ mode with interrupts disabled. This routine switches to the + system mode and returns with FIQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all FIQ interrupts are cleared + prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif + + /* Application FIQ handlers can be called here! */ + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif + + /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +#else + .global __tx_fiq_handler + .type __tx_fiq_handler, "function" +__tx_fiq_handler: + B __tx_fiq_handler // FIQ interrupt handler +#endif + + /* Reference build options and version ID to ensure they come in. */ + + LDR r2, =_tx_build_options // Pickup build options variable address + LDR r0, [r2, #0] // Pickup build options content + LDR r2, =_tx_version_id // Pickup version ID variable address + LDR r0, [r2, #0] // Pickup version ID content diff --git a/ports/cortex_r4/ac6/src/tx_thread_context_restore.S b/ports/cortex_r4/ac6/src/tx_thread_context_restore.S new file mode 100644 index 00000000..eefbe092 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_context_restore.S @@ -0,0 +1,252 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + + +#define IRQ_MODE 0x12 // IRQ mode +#define SVC_MODE 0x13 // SVC mode + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_exit +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling routine */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_restore(VOID) +{ */ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, "function" +_tx_thread_context_restore: + + /* Lockout interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR exit function to indicate an ISR is complete. */ + + BL _tx_execution_isr_exit // Call the ISR exit function +#endif + + /* Determine if interrupts are nested. */ + /* if (--_tx_thread_system_state) + { */ + + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3, #0] // Pickup system state + SUB r2, r2, #1 // Decrement the counter + STR r2, [r3, #0] // Store the counter + CMP r2, #0 // Was this the first interrupt? + BEQ __tx_thread_not_nested_restore // If so, not a nested restore + + /* Interrupts are nested. */ + + /* Just recover the saved registers and return to the point of + interrupt. */ + + LDMIA sp!, {r0, r10, r12, lr} // Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + /* } */ +__tx_thread_not_nested_restore: + + /* Determine if a thread was interrupted and no preemption is required. */ + /* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) + (_tx_thread_preempt_disable)) + { */ + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup actual current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_restore // Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable // Pickup preempt disable address + LDR r2, [r3, #0] // Pickup actual preempt disable flag + CMP r2, #0 // Is it set? + BNE __tx_thread_no_preempt_restore // Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr // Pickup address of execute thread ptr + LDR r2, [r3, #0] // Pickup actual execute thread pointer + CMP r0, r2 // Is the same thread highest priority? + BNE __tx_thread_preempt_restore // No, preemption needs to happen + + +__tx_thread_no_preempt_restore: + + /* Restore interrupted thread or ISR. */ + + /* Pickup the saved stack pointer. */ + /* tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; */ + + /* Recover the saved context and return to the point of interrupt. */ + + LDMIA sp!, {r0, r10, r12, lr} // Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + /* } + else + { */ +__tx_thread_preempt_restore: + + LDMIA sp!, {r3, r10, r12, lr} // Recover temporarily saved registers + MOV r1, lr // Save lr (point of interrupt) + + CPS #SVC_MODE // Switch to SVC mode to save context on thread stack + STR r1, [sp, #-4]! // Save point of interrupt + STMDB sp!, {r4-r12, lr} // Save upper half of registers + MOV r4, r3 // Save SPSR in r4 + + CPS #IRQ_MODE // Switch back to IRQ mode + LDMIA sp!, {r0-r3} // Recover r0-r3 + + CPS #SVC_MODE // Switch to SVC mode to save remaining context on thread stack + STMDB sp!, {r0-r3} // Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup current thread pointer + +#ifdef __ARM_FP + LDR r2, [r0, #144] // Pickup the VFP enabled flag + CMP r2, #0 // Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save // No, skip VFP IRQ save + VMRS r2, FPSCR // Pickup the FPSCR + STR r2, [sp, #-4]! // Save FPSCR + VSTMDB sp!, {D0-D15} // Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 // Build interrupt stack type + STMDB sp!, {r3, r4} // Save interrupt stack type and SPSR + STR sp, [r0, #8] // Save stack pointer in thread control + // block + + /* Save the remaining time-slice and disable it. */ + /* if (_tx_timer_time_slice) + { */ + + LDR r3, =_tx_timer_time_slice // Pickup time-slice variable address + LDR r2, [r3, #0] // Pickup time-slice + CMP r2, #0 // Is it active? + BEQ __tx_thread_dont_save_ts // No, don't save it + + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; */ + /* _tx_timer_time_slice = 0; */ + + STR r2, [r0, #24] // Save thread's time-slice + MOV r2, #0 // Clear value + STR r2, [r3, #0] // Disable global time-slice flag + + /* } */ +__tx_thread_dont_save_ts: + + + /* Clear the current task pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + MOV r0, #0 // NULL value + STR r0, [r1, #0] // Clear current thread pointer + + /* Return to the scheduler. */ + /* _tx_thread_schedule(); */ + + B _tx_thread_schedule // Return to scheduler + /* } */ + +__tx_thread_idle_system_restore: + + /* Just return back to the scheduler! */ + CPS #SVC_MODE // Switch to SVC mode + B _tx_thread_schedule // Return to scheduler +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_context_save.S b/ports/cortex_r4/ac6/src/tx_thread_context_save.S new file mode 100644 index 00000000..9f5e23db --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_context_save.S @@ -0,0 +1,202 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_irq_processing_return +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_enter +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_save(VOID) +{ */ + .global _tx_thread_context_save + .type _tx_thread_context_save, "function" +_tx_thread_context_save: + + /* Upon entry to this routine, it is assumed that IRQ interrupts are locked + out, we are in IRQ mode, and all registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) + { */ + + STMDB sp!, {r0-r3} // Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3, #0] // Pickup system state + CMP r2, #0 // Is this the first interrupt? + BEQ __tx_thread_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + + /* Save the rest of the scratch registers on the stack and return to the + calling ISR. */ + + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other registers + + /* Return to the ISR. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_irq_processing_return // Continue IRQ processing + +__tx_thread_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) + { */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Save minimal context of interrupted thread. */ + + MRS r2, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} // Store other registers + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_irq_processing_return // Continue IRQ processing + + /* } + else + { */ + +__tx_thread_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + + /* Not much to do here, just adjust the stack pointer, and return to IRQ + processing. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + ADD sp, sp, #16 // Recover saved registers + B __tx_irq_processing_return // Continue IRQ processing + + /* } */ +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..8d26087f --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ +/* #include "tx_timer.h" */ + + +#define FIQ_MODE 0x11 // FIQ mode +#define SVC_MODE 0x13 // SVC mode +#define MODE_MASK 0x1F // Mode mask +#define IRQ_MODE_BITS 0x12 // IRQ mode bits + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_exit +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_context_restore Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the fiq interrupt context when processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling routine */ +/* */ +/* CALLED BY */ +/* */ +/* FIQ ISR Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_fiq_context_restore(VOID) */ +/* { */ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore, "function" +_tx_thread_fiq_context_restore: + + /* Lockout interrupts. */ + + CPSID if // Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR exit function to indicate an ISR is complete. */ + + BL _tx_execution_isr_exit // Call the ISR exit function +#endif + + /* Determine if interrupts are nested. */ + /* if (--_tx_thread_system_state) */ + /* { */ + + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3] // Pickup system state + SUB r2, r2, #1 // Decrement the counter + STR r2, [r3] // Store the counter + CMP r2, #0 // Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore // If so, not a nested restore + + /* Interrupts are nested. */ + + /* Just recover the saved registers and return to the point of + interrupt. */ + + LDMIA sp!, {r0, r10, r12, lr} // Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + + /* } */ +__tx_thread_fiq_not_nested_restore: + + /* Determine if a thread was interrupted and no preemption is required. */ + /* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) */ + /* (_tx_thread_preempt_disable)) */ + /* { */ + + LDR r1, [sp] // Pickup the saved SPSR + MOV r2, #MODE_MASK // Build mask to isolate the interrupted mode + AND r1, r1, r2 // Isolate mode bits + CMP r1, #IRQ_MODE_BITS // Was an interrupt taken in IRQ mode before we + // got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore // Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1] // Pickup actual current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore // Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable // Pickup preempt disable address + LDR r2, [r3] // Pickup actual preempt disable flag + CMP r2, #0 // Is it set? + BNE __tx_thread_fiq_no_preempt_restore // Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr // Pickup address of execute thread ptr + LDR r2, [r3] // Pickup actual execute thread pointer + CMP r0, r2 // Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore // No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: + + /* Restore interrupted thread or ISR. */ + + /* Pickup the saved stack pointer. */ + /* tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; */ + + /* Recover the saved context and return to the point of interrupt. */ + + LDMIA sp!, {r0, lr} // Recover SPSR and POI + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + /* } */ + /* else */ + /* { */ +__tx_thread_fiq_preempt_restore: + + LDMIA sp!, {r3, lr} // Recover temporarily saved registers + MOV r1, lr // Save lr (point of interrupt) + + CPS #SVC_MODE // Switch to SVC mode to save context on thread stack + STR r1, [sp, #-4]! // Save point of interrupt + STMDB sp!, {r4-r12, lr} // Save upper half of registers + MOV r4, r3 // Save SPSR in r4 + + CPS #FIQ_MODE // Switch back to FIQ mode + LDMIA sp!, {r0-r3} // Recover r0-r3 + + CPS #SVC_MODE // Switch to SVC mode to save remaining context on thread stack + STMDB sp!, {r0-r3} // Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1] // Pickup current thread pointer + +#ifdef __ARM_FP + LDR r2, [r0, #144] // Pickup the VFP enabled flag + CMP r2, #0 // Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save // No, skip VFP FIQ save + VMRS r2, FPSCR // Pickup the FPSCR + STR r2, [sp, #-4]! // Save FPSCR + VSTMDB sp!, {D0-D15} // Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 // Build interrupt stack type + STMDB sp!, {r3, r4} // Save interrupt stack type and SPSR + STR sp, [r0, #8] // Save stack pointer in thread control + // block + + /* Save the remaining time-slice and disable it. */ + /* if (_tx_timer_time_slice) */ + /* { */ + + LDR r3, =_tx_timer_time_slice // Pickup time-slice variable address + LDR r2, [r3] // Pickup time-slice + CMP r2, #0 // Is it active? + BEQ __tx_thread_fiq_dont_save_ts // No, don't save it + + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; */ + /* _tx_timer_time_slice = 0; */ + + STR r2, [r0, #24] // Save thread's time-slice + MOV r2, #0 // Clear value + STR r2, [r3] // Disable global time-slice flag + + /* } */ +__tx_thread_fiq_dont_save_ts: + + + /* Clear the current task pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + MOV r0, #0 // NULL value + STR r0, [r1] // Clear current thread pointer + + /* Return to the scheduler. */ + /* _tx_thread_schedule(); */ + + B _tx_thread_schedule // Return to scheduler + /* } */ + +__tx_thread_fiq_idle_system_restore: + + /* Just return back to the scheduler! */ + + ADD sp, sp, #24 // Recover FIQ stack space + CPS #SVC_MODE // Switch to SVC mode + B _tx_thread_schedule // Return to scheduler + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..3221a358 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S @@ -0,0 +1,209 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_enter +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_context_save Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + /* VOID _tx_thread_fiq_context_save(VOID) */ +/* { */ + + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save, "function" +_tx_thread_fiq_context_save: + + /* Upon entry to this routine, it is assumed that IRQ interrupts are locked + out, we are in IRQ mode, and all registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) */ + /* { */ + + STMDB sp!, {r0-r3} // Save some working registers + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3] // Pickup system state + CMP r2, #0 // Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3] // Store it back in the variable + + /* Save the rest of the scratch registers on the stack and return to the + calling ISR. */ + + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other registers + + /* Return to the ISR. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_fiq_processing_return // Continue FIQ processing + +__tx_thread_fiq_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) */ + /* { */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3] // Store it back in the variable + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1] // Pickup current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_fiq_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Save minimal context of interrupted thread. */ + + MRS r2, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r2, lr} // Store other registers, Note that we don't + // need to save sl and ip since FIQ has + // copies of these registers. Nested + // interrupt processing does need to save + // these registers. + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_fiq_processing_return // Continue FIQ processing + + /* } */ + /* else */ + /* { */ + +__tx_thread_fiq_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + /* Not much to do here, save the current SPSR and LR for possible + use in IRQ interrupted in idle system conditions, and return to + FIQ interrupt processing. */ + + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, lr} // Store other registers that will get used + // or stripped off the stack in context + // restore + B __tx_fiq_processing_return // Continue FIQ processing + + /* } */ +/* } */ + +#endif diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..8568b961 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,108 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define FIQ_MODE 0x11 // FIQ Mode bits + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_nesting_end Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from FIQ mode after */ +/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +/* processing from system mode back to FIQ mode prior to the ISR */ +/* calling _tx_thread_fiq_context_restore. Note that this function */ +/* assumes the system stack pointer is in the same position after */ +/* nesting start function was called. */ +/* */ +/* This function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with FIQ interrupts disabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_fiq_nesting_end(VOID) */ +/* { */ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end, "function" +_tx_thread_fiq_nesting_end: + MOV r3, lr // Save ISR return address + + #ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts + #else + CPSID i // Disable IRQ interrupts + #endif + + LDMIA sp!, {r1, lr} // Pickup saved lr (and r1 throw-away for + // 8-byte alignment logic) + CPS #FIQ_MODE // Switch back to FIQ mode + BX r3 // Return to caller +/* } */ + + + diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..60bd335f --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,96 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define SYS_MODE 0x12 // System mode + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_nesting_start Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from FIQ mode after */ +/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +/* processing to the system mode so nested FIQ interrupt processing */ +/* is possible (system mode has its own "lr" register). Note that */ +/* this function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with FIQ interrupts enabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_fiq_nesting_start(VOID) */ +/* { */ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start, "function" +_tx_thread_fiq_nesting_start: + MOV r3, lr // Save ISR return address + CPS #SYS_MODE // Switch to system mode + STMDB sp!, {r1, lr} // Push the system mode lr on the system mode stack + // and push r1 just to keep 8-byte alignment + CPSIE f // Enable FIQ interrupts + BX r3 // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S b/ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..aa0215ac --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S @@ -0,0 +1,102 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define INT_MASK 0xC0 // Interrupt bit mask +#else +#define INT_MASK 0x80 // Interrupt bit mask +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_control(UINT new_posture) */ +/* { */ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, "function" +_tx_thread_interrupt_control: + + /* Pickup current interrupt lockout posture. */ + + MRS r3, CPSR // Pickup current CPSR + BIC r1, r3, #INT_MASK // Clear interrupt lockout bits + ORR r1, r1, r0 // Or-in new interrupt lockout bits + + /* Apply the new interrupt posture. */ + + MSR CPSR_c, r1 // Setup new CPSR + AND r0, r3, #INT_MASK // Return previous interrupt mask + BX lr // Return to caller + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S b/ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..079cbfdc --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S @@ -0,0 +1,96 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_disable Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for disabling interrupts */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_disable(void) */ +/* { */ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable, "function" +_tx_thread_interrupt_disable: + + /* Pickup current interrupt lockout posture. */ + + MRS r0, CPSR // Pickup current CPSR + + /* Mask interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ +#else + CPSID i // Disable IRQ +#endif + + BX lr // Return to caller + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S b/ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..7c374cad --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S @@ -0,0 +1,90 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_restore Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for restoring interrupts to the state */ +/* returned by a previous _tx_thread_interrupt_disable call. */ +/* */ +/* INPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_restore(UINT old_posture) */ +/* { */ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore, "function" +_tx_thread_interrupt_restore: + + /* Apply the new interrupt posture. */ + + MSR CPSR_c, r0 // Setup new CPSR + BX lr // Return to caller +/* } */ + + + diff --git a/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..7f81779a --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,105 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define IRQ_MODE 0x12 // IRQ Mode bits + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_irq_nesting_end Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from IRQ mode after */ +/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +/* processing from system mode back to IRQ mode prior to the ISR */ +/* calling _tx_thread_context_restore. Note that this function */ +/* assumes the system stack pointer is in the same position after */ +/* nesting start function was called. */ +/* */ +/* This function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with IRQ interrupts disabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_irq_nesting_end(VOID) */ +/* { */ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end, "function" +_tx_thread_irq_nesting_end: + MOV r3, lr // Save ISR return address + + #ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts + #else + CPSID i // Disable IRQ interrupts + #endif + + LDMIA sp!, {r1, lr} // Pickup saved lr (and r1 throw-away for + // 8-byte alignment logic) + CPS #IRQ_MODE // Switch back to IRQ mode + BX r3 // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..c8cd19a5 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,96 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define SYS_MODE 0x1F // System mode bits + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_irq_nesting_start Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from IRQ mode after */ +/* _tx_thread_context_save has been called and switches the IRQ */ +/* processing to the system mode so nested IRQ interrupt processing */ +/* is possible (system mode has its own "lr" register). Note that */ +/* this function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with IRQ interrupts enabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_irq_nesting_start(VOID) */ +/* { */ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start, "function" +_tx_thread_irq_nesting_start: + MOV r3, lr // Save ISR return address + CPS #SYS_MODE // Switch to System Mode + STMDB sp!, {r1, lr} // Push the system mode lr on the system mode stack + // and push r1 just to keep 8-byte alignment + CPSIE i // Enable IRQ interrupts + BX r3 // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_schedule.S b/ports/cortex_r4/ac6/src/tx_thread_schedule.S new file mode 100644 index 00000000..75d29128 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_schedule.S @@ -0,0 +1,230 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ +/* #include "tx_timer.h" */ + + + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_thread_enter +#endif + + .arm + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* _tx_thread_system_return Return to system from thread */ +/* _tx_thread_context_restore Restore thread's context */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_schedule(VOID) */ +/* { */ + .global _tx_thread_schedule + .type _tx_thread_schedule, "function" +_tx_thread_schedule: + + /* Enable interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if // Enable IRQ and FIQ interrupts +#else + CPSIE i // Enable IRQ interrupts +#endif + + /* Wait for a thread to execute. */ + /* do */ + /* { */ + LDR r1, =_tx_thread_execute_ptr // Address of thread execute ptr + +__tx_thread_schedule_loop: + + LDR r0, [r1, #0] // Pickup next thread to execute + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_schedule_loop // If so, keep looking for a thread + + /* } */ + /* while(_tx_thread_execute_ptr == TX_NULL); */ + + /* Yes! We have a thread to execute. Lockout interrupts and + transfer control to it. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + + /* Setup the current thread pointer. */ + /* _tx_thread_current_ptr = _tx_thread_execute_ptr; */ + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread + STR r0, [r1, #0] // Setup current thread pointer + + /* Increment the run count for this thread. */ + /* _tx_thread_current_ptr -> tx_thread_run_count++; */ + + LDR r2, [r0, #4] // Pickup run counter + LDR r3, [r0, #24] // Pickup time-slice for this thread + ADD r2, r2, #1 // Increment thread run-counter + STR r2, [r0, #4] // Store the new run counter + + /* Setup time-slice, if present. */ + /* _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; */ + + LDR r2, =_tx_timer_time_slice // Pickup address of time slice + // variable + LDR sp, [r0, #8] // Switch stack pointers + STR r3, [r2, #0] // Setup time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread entry function to indicate the thread is executing. */ + + MOV r5, r0 // Save r0 + BL _tx_execution_thread_enter // Call the thread execution enter function + MOV r0, r5 // Restore r0 +#endif + + /* Switch to the thread's stack. */ + /* sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; */ + + /* Determine if an interrupt frame or a synchronous task suspension frame + is present. */ + + LDMIA sp!, {r4, r5} // Pickup the stack type and saved CPSR + CMP r4, #0 // Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 // Setup SPSR for return +#ifdef __ARM_FP + LDR r1, [r0, #144] // Pickup the VFP enabled flag + CMP r1, #0 // Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore // No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} // Recover D0-D15 + LDR r4, [sp], #4 // Pickup FPSCR + VMSR FPSCR, r4 // Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ // Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef __ARM_FP + LDR r1, [r0, #144] // Pickup the VFP enabled flag + CMP r1, #0 // Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore // No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} // Recover D8-D15 + LDR r4, [sp], #4 // Pickup FPSCR + VMSR FPSCR, r4 // Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 // Recover CPSR + LDMIA sp!, {r4-r11, lr} // Return to thread synchronously + BX lr // Return to caller + +/* } */ + + +#ifdef __ARM_FP + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable, "function" +tx_thread_vfp_enable: + MRS r2, CPSR // Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr // Build current thread pointer address + LDR r1, [r0] // Pickup current thread pointer + CMP r1, #0 // Check for NULL thread pointer + BEQ __tx_no_thread_to_enable // If NULL, skip VFP enable + MOV r0, #1 // Build enable value + STR r0, [r1, #144] // Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 // Recover CPSR + BX LR // Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable, "function" +tx_thread_vfp_disable: + MRS r2, CPSR // Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr // Build current thread pointer address + LDR r1, [r0] // Pickup current thread pointer + CMP r1, #0 // Check for NULL thread pointer + BEQ __tx_no_thread_to_disable // If NULL, skip VFP disable + MOV r0, #0 // Build disable value + STR r0, [r1, #144] // Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 // Recover CPSR + BX LR // Return to caller +#endif diff --git a/ports/cortex_r4/ac6/src/tx_thread_stack_build.S b/ports/cortex_r4/ac6/src/tx_thread_stack_build.S new file mode 100644 index 00000000..57fbb637 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_stack_build.S @@ -0,0 +1,164 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#define SVC_MODE 0x13 // SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +#define CPSR_MASK 0xDF // Mask initial CPSR, IRQ & FIQ ints enabled +#else +#define CPSR_MASK 0x9F // Mask initial CPSR, IRQ ints enabled +#endif + +#define THUMB_BIT 0x20 // Thumb-bit + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) */ +/* { */ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, "function" +_tx_thread_stack_build: + + + /* Build a fake interrupt frame. The form of the fake interrupt stack + on the Cortex-R4 should look like the following after it is built: + + Stack Top: 1 Interrupt stack frame type + CPSR Initial value for CPSR + a1 (r0) Initial value for a1 + a2 (r1) Initial value for a2 + a3 (r2) Initial value for a3 + a4 (r3) Initial value for a4 + v1 (r4) Initial value for v1 + v2 (r5) Initial value for v2 + v3 (r6) Initial value for v3 + v4 (r7) Initial value for v4 + v5 (r8) Initial value for v5 + sb (r9) Initial value for sb + sl (r10) Initial value for sl + fp (r11) Initial value for fp + ip (r12) Initial value for ip + lr (r14) Initial value for lr + pc (r15) Initial value for pc + 0 For stack backtracing */ + + /* Stack Bottom: (higher memory address) */ + + LDR r2, [r0, #16] // Pickup end of stack area + BIC r2, r2, #7 // Ensure 8-byte alignment + SUB r2, r2, #76 // Allocate space for the stack frame + + /* Actually build the stack frame. */ + + MOV r3, #1 // Build interrupt stack type + STR r3, [r2, #0] // Store stack type + MOV r3, #0 // Build initial register value + STR r3, [r2, #8] // Store initial r0 + STR r3, [r2, #12] // Store initial r1 + STR r3, [r2, #16] // Store initial r2 + STR r3, [r2, #20] // Store initial r3 + STR r3, [r2, #24] // Store initial r4 + STR r3, [r2, #28] // Store initial r5 + STR r3, [r2, #32] // Store initial r6 + STR r3, [r2, #36] // Store initial r7 + STR r3, [r2, #40] // Store initial r8 + STR r3, [r2, #44] // Store initial r9 + LDR r3, [r0, #12] // Pickup stack starting address + STR r3, [r2, #48] // Store initial r10 (sl) + MOV r3, #0 // Build initial register value + STR r3, [r2, #52] // Store initial r11 + STR r3, [r2, #56] // Store initial r12 + STR r3, [r2, #60] // Store initial lr + STR r1, [r2, #64] // Store initial pc + STR r3, [r2, #68] // 0 for back-trace + + MRS r3, CPSR // Pickup CPSR + BIC r3, r3, #CPSR_MASK // Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE // Build CPSR, SVC mode, interrupts enabled + TST r1, 1 // Test if Thumb bit is set in entry function address + ITE NE + ORRNE r3, r3, #THUMB_BIT // Yes, set the Thumb bit + BICEQ r3, r3, #THUMB_BIT // No, clear the Thumb bit + STR r3, [r2, #4] // Store initial CPSR + + /* Setup stack pointer. */ + /* thread_ptr -> tx_thread_stack_ptr = r2; */ + + STR r2, [r0, #8] // Save stack pointer in thread's + // control block + BX lr // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_system_return.S b/ports/cortex_r4/ac6/src/tx_thread_system_return.S new file mode 100644 index 00000000..4c025765 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_system_return.S @@ -0,0 +1,162 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ +/* #include "tx_timer.h" */ + + + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_thread_exit +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the ThreadX system. Only a */ +/* minimal context is saved since the compiler assumes temp registers */ +/* are going to get slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling loop */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_system_return(VOID) */ +/* { */ + .global _tx_thread_system_return + .type _tx_thread_system_return, "function" +_tx_thread_system_return: + + /* Save minimal context on the stack. */ + + STMDB sp!, {r4-r11, lr} // Save minimal context + LDR r5, =_tx_thread_current_ptr // Pickup address of current ptr + LDR r6, [r5, #0] // Pickup current thread pointer + +#ifdef __ARM_FP + LDR r0, [r6, #144] // Pickup the VFP enabled flag + CMP r0, #0 // Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save // No, skip VFP solicited save + VMRS r4, FPSCR // Pickup the FPSCR + STR r4, [sp, #-4]! // Save FPSCR + VSTMDB sp!, {D8-D15} // Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 // Build a solicited stack type + MRS r1, CPSR // Pickup the CPSR + STMDB sp!, {r0-r1} // Save type and CPSR + + /* Lockout interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread exit function to indicate the thread is no longer executing. */ + + BL _tx_execution_thread_exit // Call the thread exit function +#endif + LDR r2, =_tx_timer_time_slice // Pickup address of time slice + LDR r1, [r2, #0] // Pickup current time slice + + /* Save current stack and switch to system stack. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + /* sp = _tx_thread_system_stack_ptr; */ + + STR sp, [r6, #8] // Save thread stack pointer + + /* Determine if the time-slice is active. */ + /* if (_tx_timer_time_slice) */ + /* { */ + + MOV r4, #0 // Build clear value + CMP r1, #0 // Is a time-slice active? + BEQ __tx_thread_dont_save_ts // No, don't save the time-slice + + /* Save the current remaining time-slice. */ + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; */ + /* _tx_timer_time_slice = 0; */ + + STR r4, [r2, #0] // Clear time-slice + STR r1, [r6, #24] // Store current time-slice + + /* } */ +__tx_thread_dont_save_ts: + + /* Clear the current thread pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + STR r4, [r5, #0] // Clear current thread pointer + + B _tx_thread_schedule // Jump to scheduler! + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S b/ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..0b7134bd --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S @@ -0,0 +1,193 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_enter +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_vectored_context_save Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_vectored_context_save(VOID) */ +/* { */ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save, "function" +_tx_thread_vectored_context_save: + + /* Upon entry to this routine, it is assumed that IRQ interrupts are locked + out, we are in IRQ mode, and all registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) */ + /* { */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3, #0] // Pickup system state + CMP r2, #0 // Is this the first interrupt? + BEQ __tx_thread_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + + /* Note: Minimal context of interrupted thread is already saved. */ + + /* Return to the ISR. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + BX lr // Return to caller + + +__tx_thread_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) */ + /* { */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Note: Minimal context of interrupted thread is already saved. */ + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + BX lr // Return to caller + + /* } */ + /* else */ + /* { */ + +__tx_thread_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + + /* Not much to do here, just adjust the stack pointer, and return to IRQ + processing. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + ADD sp, sp, #32 // Recover saved registers + + BX lr // Return to caller + + /* } */ +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_timer_interrupt.S b/ports/cortex_r4/ac6/src/tx_timer_interrupt.S new file mode 100644 index 00000000..1426b7f9 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_timer_interrupt.S @@ -0,0 +1,257 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_timer.h" */ +/* #include "tx_thread.h" */ + + +/* Define Assembly language external references... */ + + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice + .global _tx_timer_expiration_process + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_timer_interrupt(VOID) */ +/* { */ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, "function" +_tx_timer_interrupt: + + /* Upon entry to this routine, it is assumed that context save has already + been called, and therefore the compiler scratch registers are available + for use. */ + + /* Increment the system clock. */ + /* _tx_timer_system_clock++; */ + + LDR r1, =_tx_timer_system_clock // Pickup address of system clock + LDR r0, [r1, #0] // Pickup system clock + ADD r0, r0, #1 // Increment system clock + STR r0, [r1, #0] // Store new system clock + + /* Test for time-slice expiration. */ + /* if (_tx_timer_time_slice) */ + /* { */ + + LDR r3, =_tx_timer_time_slice // Pickup address of time-slice + LDR r2, [r3, #0] // Pickup time-slice + CMP r2, #0 // Is it non-active? + BEQ __tx_timer_no_time_slice // Yes, skip time-slice processing + + /* Decrement the time_slice. */ + /* _tx_timer_time_slice--; */ + + SUB r2, r2, #1 // Decrement the time-slice + STR r2, [r3, #0] // Store new time-slice value + + /* Check for expiration. */ + /* if (__tx_timer_time_slice == 0) */ + + CMP r2, #0 // Has it expired? + BNE __tx_timer_no_time_slice // No, skip expiration processing + + /* Set the time-slice expired flag. */ + /* _tx_timer_expired_time_slice = TX_TRUE; */ + + LDR r3, =_tx_timer_expired_time_slice // Pickup address of expired flag + MOV r0, #1 // Build expired value + STR r0, [r3, #0] // Set time-slice expiration flag + + /* } */ + +__tx_timer_no_time_slice: + + /* Test for timer expiration. */ + /* if (*_tx_timer_current_ptr) */ + /* { */ + + LDR r1, =_tx_timer_current_ptr // Pickup current timer pointer addr + LDR r0, [r1, #0] // Pickup current timer + LDR r2, [r0, #0] // Pickup timer list entry + CMP r2, #0 // Is there anything in the list? + BEQ __tx_timer_no_timer // No, just increment the timer + + /* Set expiration flag. */ + /* _tx_timer_expired = TX_TRUE; */ + + LDR r3, =_tx_timer_expired // Pickup expiration flag address + MOV r2, #1 // Build expired value + STR r2, [r3, #0] // Set expired flag + B __tx_timer_done // Finished timer processing + + /* } */ + /* else */ + /* { */ +__tx_timer_no_timer: + + /* No timer expired, increment the timer pointer. */ + /* _tx_timer_current_ptr++; */ + + ADD r0, r0, #4 // Move to next timer + + /* Check for wrap-around. */ + /* if (_tx_timer_current_ptr == _tx_timer_list_end) */ + + LDR r3, =_tx_timer_list_end // Pickup addr of timer list end + LDR r2, [r3, #0] // Pickup list end + CMP r0, r2 // Are we at list end? + BNE __tx_timer_skip_wrap // No, skip wrap-around logic + + /* Wrap to beginning of list. */ + /* _tx_timer_current_ptr = _tx_timer_list_start; */ + + LDR r3, =_tx_timer_list_start // Pickup addr of timer list start + LDR r0, [r3, #0] // Set current pointer to list start + +__tx_timer_skip_wrap: + + STR r0, [r1, #0] // Store new current timer pointer + /* } */ + +__tx_timer_done: + + + /* See if anything has expired. */ + /* if ((_tx_timer_expired_time_slice) (_tx_timer_expired)) */ + /* { */ + + LDR r3, =_tx_timer_expired_time_slice // Pickup addr of expired flag + LDR r2, [r3, #0] // Pickup time-slice expired flag + CMP r2, #0 // Did a time-slice expire? + BNE __tx_something_expired // If non-zero, time-slice expired + LDR r1, =_tx_timer_expired // Pickup addr of other expired flag + LDR r0, [r1, #0] // Pickup timer expired flag + CMP r0, #0 // Did a timer expire? + BEQ __tx_timer_nothing_expired // No, nothing expired + +__tx_something_expired: + + + STMDB sp!, {r0, lr} // Save the lr register on the stack + // and save r0 just to keep 8-byte alignment + + /* Did a timer expire? */ + /* if (_tx_timer_expired) */ + /* { */ + + LDR r1, =_tx_timer_expired // Pickup addr of expired flag + LDR r0, [r1, #0] // Pickup timer expired flag + CMP r0, #0 // Check for timer expiration + BEQ __tx_timer_dont_activate // If not set, skip timer activation + + /* Process timer expiration. */ + /* _tx_timer_expiration_process(); */ + + BL _tx_timer_expiration_process // Call the timer expiration handling routine + + /* } */ +__tx_timer_dont_activate: + + /* Did time slice expire? */ + /* if (_tx_timer_expired_time_slice) */ + /* { */ + + LDR r3, =_tx_timer_expired_time_slice // Pickup addr of time-slice expired + LDR r2, [r3, #0] // Pickup the actual flag + CMP r2, #0 // See if the flag is set + BEQ __tx_timer_not_ts_expiration // No, skip time-slice processing + + /* Time slice interrupted thread. */ + /* _tx_thread_time_slice(); */ + + BL _tx_thread_time_slice // Call time-slice processing + + /* } */ + +__tx_timer_not_ts_expiration: + + LDMIA sp!, {r0, lr} // Recover lr register (r0 is just there for + // the 8-byte stack alignment + + /* } */ + +__tx_timer_nothing_expired: + BX lr // Return to caller + +/* } */ diff --git a/ports/cortex_r4/gnu/example_build/build_threadx.bat b/ports/cortex_r4/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..106c3447 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r4/gnu/example_build/build_threadx_sample.bat b/ports/cortex_r4/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..517b6d62 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-r4 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_r4/gnu/example_build/crt0.S b/ports/cortex_r4/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_r4/gnu/example_build/libc.a b/ports/cortex_r4/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 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

Q>dP6leU^u3WJIStz4({jFOv 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 z%0D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

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 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�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�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l 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 E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_r5/gnu/example_build/libgcc.a b/ports/cortex_r5/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R5/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_r5/gnu/readme_threadx.txt b/ports/cortex_r5/gnu/readme_threadx.txt new file mode 100644 index 00000000..8c26cebd --- /dev/null +++ b/ports/cortex_r5/gnu/readme_threadx.txt @@ -0,0 +1,496 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R5 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R5 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-r5 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-r5 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R5 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R5 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r5/gnu/src/tx_thread_context_restore.S b/ports/cortex_r5/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..cdca28e5 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,256 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif +@ + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_context_save.S b/ports/cortex_r5/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..ac7a98f4 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..955a9e8c --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,247 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..576ecc4c --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..d3e4972a --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..0b2ef7e0 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ac10ca1e --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..dd2ba781 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..885b43c8 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..8d1d1952 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..e2d38c62 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_schedule.S b/ports/cortex_r5/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..e62fc22c --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_schedule.S @@ -0,0 +1,250 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + BL _tx_execution_thread_enter @ Call the thread execution enter function +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt +@ +_tx_solicited_return: +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 @ Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously + MSR CPSR_cxsf, r0 @ Recover CPSR +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ +@ +#ifdef TX_ENABLE_VFP_SUPPORT + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +@ + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +#endif + diff --git a/ports/cortex_r5/gnu/src/tx_thread_stack_build.S b/ports/cortex_r5/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..bed62a6d --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the ARM9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_system_return.S b/ports/cortex_r5/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..c7c551a5 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_system_return.S @@ -0,0 +1,177 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Lockout interrupts. */ +@ + MRS r1, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + LDR r5, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r6, [r5, #0] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r0, [r6, #144] @ Pickup the VFP enabled flag + CMP r0, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r4, FPSCR @ Pickup the FPSCR + STR r4, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif +@ + MOV r0, #0 @ Build a solicited stack type + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2, #0] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r6, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2, #0] @ Clear time-slice + STR r1, [r6, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r5, #0] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..3d99f69f --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_r5/gnu/src/tx_timer_interrupt.S b/ports/cortex_r5/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..050258bd --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_r5/iar/example_build/azure_rtos.eww b/ports/cortex_r5/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_r5/iar/example_build/cstartup.s b/ports/cortex_r5/iar/example_build/cstartup.s new file mode 100644 index 00000000..7a46bec0 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/cstartup.s @@ -0,0 +1,163 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 49919 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __iar_program_start + EXTERN Undefined_Handler + EXTERN SWI_Handler + EXTERN Prefetch_Handler + EXTERN Abort_Handler + EXTERN IRQ_Handler + EXTERN FIQ_Handler + + DATA + +__iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__vector: ; Make this a DATA label, so that stack usage + ; analysis doesn't consider it an uncalled fun + + ARM + + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + + DATA + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD Undefined_Handler +SWI_Addr: DCD SWI_Handler +Prefetch_Addr: DCD Prefetch_Handler +Abort_Addr: DCD Abort_Handler +IRQ_Addr: DCD IRQ_Handler +FIQ_Addr: DCD FIQ_Handler + + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reset execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + + EXTERN __cmain + REQUIRE __vector + EXTWEAK __iar_init_core + EXTWEAK __iar_init_vfp + + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +#define MODE_MSK 0x1F ; Bit mask for mode bits in CPSR + +#define USR_MODE 0x10 ; User mode +#define FIQ_MODE 0x11 ; Fast Interrupt Request mode +#define IRQ_MODE 0x12 ; Interrupt Request mode +#define SVC_MODE 0x13 ; Supervisor mode +#define ABT_MODE 0x17 ; Abort mode +#define UND_MODE 0x1B ; Undefined Instruction mode +#define SYS_MODE 0x1F ; System mode + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Turn on core features assumed to be enabled. + FUNCALL __iar_program_start, __iar_init_core + BL __iar_init_core + + ;; Initialize VFP (if needed). + FUNCALL __iar_program_start, __iar_init_vfp + BL __iar_init_vfp + +;;; +;;; Add more initialization here +;;; + +;;; Continue to __cmain for C-level initialization. + + FUNCALL __iar_program_start, __cmain + B __cmain + + END diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.c b/ports/cortex_r5/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..983109cc --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.c @@ -0,0 +1,376 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.dep b/ports/cortex_r5/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..5dad90e2 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.dep @@ -0,0 +1,253 @@ + + + 4 + 811054824 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\rti.h + $PROJ_DIR$\Debug\Obj\demo.r79 + $PROJ_DIR$\Debug\Obj\rti.pbi + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\rti.__cstat.et + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\tx_initialize_low_level.s79 + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\intrinsics.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\lib\dl7Sx_tbn.a + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\lib\rt7Sx_tb.a + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\Debug\Obj\rti.o + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\tx_execution_profile.c + $PROJ_DIR$\tx_port.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\lib\sh7Sxs_b.a + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\tx_cstartup.s79 + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\lib\m7Sx_tbv.a + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\Debug\Obj\cstartup.o + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\DLib_Product.h + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\rti.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + [ROOT_NODE] + + + ILINK + 1 17 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 17 + + + + + ILINK + 6 52 22 34 28 41 29 48 24 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 28 21 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 52 12 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 22 + + + __cstat + 0 + + + BICOMP + 51 + + + + + ICCARM + 62 63 20 40 30 19 9 46 47 59 23 49 14 44 54 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 28 21 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 61 + + + BICOMP + 27 + + + + + ICCARM + 36 39 25 53 42 8 11 56 26 5 7 57 15 16 + + + BICOMP + 36 39 25 53 42 8 56 26 5 7 57 15 16 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 45 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 3 + + + + + ICCARM + 36 39 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 52 + + + + + $PROJ_DIR$\rti.c + + + ICCARM + 32 + + + __cstat + 10 + + + BICOMP + 4 + + + + + ICCARM + 2 + + + BICOMP + 2 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 33 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.ewd b/ports/cortex_r5/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..28a9ad4c --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.ewp b/ports/cortex_r5/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..a7c609f4 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2140 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.ewt b/ports/cortex_r5/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..77fe620f --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.icf b/ports/cortex_r5/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..13723763 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; +define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define symbol __region_DRAM_start__ = 0x80000000; +define symbol __region_DRAM_end__ = 0x807FFFFF; +define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; +place in DRAM_region { section DRAM }; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..0923efcb --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 253 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000004A0003DA000001000000578600000100000029810000020000001386000001000000259600000200000056840000010000005486000001000000158100000300000008B000000200000000DA000002000000268100000100000059920000010000000184000001000000108600005F000000239200000100000029E10000020000000A860000010000000F810000010000002081000001000000ED8000000100000008DA000001000000EA800000010000001D8100000100000001E10000010000000D800000010000000C8100001600000005DA00000100000003DC00000100000004860000010000009A86000001000000288100000100000002DA0000010000000384000005000000568600000600000017810000020000002496000001000000008400000100000007B000000100000014810000030000000C86000001000000008100000300000009860000010000001F810000010000005E86000003000000EC800000010000001A8600000100000003E10000010000000E8100000100000000E10000010000000B81000002000000E9800000010000001882000003000000588600000100000004DA000001000000148600002500000001DA000001000000239600000800000009B00000010000005586000001000000F4800000010000000086000001000000028400000100000011860000250000004681000029000000248100000100000003B0000001000000EE800000010000005D86000001000000EB800000010000000D810000020000000886000001000000168600000100000006DA000001000000E880000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000048040000000A000065050000 + 0000000031040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 0000000032000000450100002D040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF4501000032000000490100002D0400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000002D040000000A000031040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000048040000000A0000650500000000000031040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..ed996cec --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..198168ed --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..7f8b9b49 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R5" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE8" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..23f67303 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.crun b/ports/cortex_r5/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..43d2a650 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1797 @@ + + + + + + + 447 + 27 + 27 + 2010398909 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + 47 + 1666 + + + 20 + 915 + 244 + 61 + + + + 2 + 0 + 0 + + + + + + 3 + 0 + 0 + + + 0 + 1 + 0 + + + + + + + + 2 + 0 + 0 + + + 187 + 100 + 100 + 100 + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + + + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 161 + 150 + 100 + 100 + + + + + + + + TabID-32281-8114 + Workspace + Workspace + + + <ws> + <ws>/sample_threadx + <ws>/sample_threadx/Common sources + <ws>/sample_threadx/Common sources/tx_cstartup.s79 + sample_threadx + sample_threadx/Output + sample_threadx/Output/sample_threadx.out + sample_threadx/Output/sample_threadx.out/Output + + + + + 0 + + + + + TabID-31758-8124 + Debug Log + Debug-Log + + + + TabID-9738-8128 + Build + Build + + + + TabID-20156-25745 + Breakpoints + Breakpoints + + + 0 + + + + + TabID-19697-5905 + Thread List + TX-THREAD + + 1 + + + + TabID-19175-5914 + Message Queues + TX-MESSAGEQUEUE + + + TabID-29400-5927 + Semaphores + TX-SEMAPHORE + + + TabID-6858-5940 + Mutexes + TX-MUTEX + + + TabID-6335-5950 + Byte Pools + TX-BYTEPOOL + + + TabID-16561-5963 + Block Pools + TX-BLOCKPOOL + + + TabID-26786-5976 + Timers + TX-TIMER + + + TabID-26264-5986 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + TabID-4531-19825 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 40 + 1720 + 1720 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 572 + 521 + -2 + -2 + 151 + 168 + 99473 + 181425 + 344532 + 619870 + + + + + + + + + + + -2 + -2 + 572 + 307 + -2 + -2 + 214 + 217 + 140975 + 234341 + 203557 + 619870 + + + + + + + + + + + -2 + -2 + 65 + 1520 + -2 + -2 + 1522 + 67 + 1002635 + 72354 + 99473 + 181425 + + + + + + + + + 63 + -2 + 261 + 1520 + -2 + 63 + 1522 + 198 + 1002635 + 213823 + 142292 + 213823 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + Disassembly + _I0 + + + 500 + 20 + + + 0x3e94 + 0x9ec + 0x1c9c + IRQ_Handler + + 1 + 1 + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + E90000004A0003DA000001000000578600000100000029810000020000001386000001000000259600000200000056840000010000005486000001000000158100000300000008B000000200000000DA000002000000268100000100000059920000010000000184000001000000108600005F000000239200000100000029E10000020000000A860000010000000F810000010000002081000001000000ED8000000100000008DA000001000000EA800000010000001D8100000100000001E10000010000000D800000010000000C8100001600000005DA00000100000003DC00000100000004860000010000009A86000001000000288100000100000002DA0000010000000384000005000000568600000600000017810000020000002496000001000000008400000100000007B000000100000014810000030000000C86000001000000008100000300000009860000010000001F810000010000005E86000003000000EC800000010000001A8600000100000003E10000010000000E8100000600000000E10000010000000B81000002000000E9800000010000001882000003000000588600000100000004DA000001000000148600002500000001DA000001000000239600000800000009B00000010000005586000001000000F4800000010000000086000001000000028400000100000011860000250000004681000029000000248100000100000003B0000001000000EE800000010000005D86000001000000EB800000010000000D810000020000000886000001000000168600000100000006DA000001000000E880000001000000 + + + 41000D8400000F84000008840000FFFFFFFF54840000328100001C81000009840000D4840000E8800000838600005886000001B0000002B0000003B0000004B0000005B0000006B0000007B0000008B0000009B000000AB000000BB000000CB000000DB000000EB000000FB0000000B000002481000000880000018800000288000003880000048800000588000000DA000001DA000002DA000003DA000004DA000005DA000006DA000007DA000008DA000009DA00000ADA00000BDA00000CDA00000DDA00001B8600001C8600001D8600001E8600005A8600005B86000053860000A4860000A3860000439200001E920000289200002992000024960000259600001F960000 + 3A005786000018000000028600000F00000059920000240000001581000052000000268100005B000000239200000000000007E100006900000029E100006F0000000A8600002A00000004E10000670000001D920000110000000786000027000000008D00001D00000001E10000640000000D8000004400000004860000240000009A860000160000001781000054000000018600000E000000259200001900000000840000770000001481000051000000449200002200000000810000460000000E8400007F00000030840000810000001F9200001F00000009860000290000001A8600003100000003E100006600000025E100006D0000002D9200002100000006860000260000008E8600003A00000000E10000630000000B8100004C00000022E100006A000000698600003700000041E10000740000000386000010000000239600008700000055860000060000001681000053000000008600000D0000000E860000170000000B8600002B00000005E100006800000051840000850000000886000028000000C386000003000000A18600003B00000002E10000650000000D8100004E00000024E100006C0000002C9200002000000005860000250000001686000030000000C08600000A000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 34050000AF0400005606000060050000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 4294967295 + 00000000630000000601000028030000 + 000000004C0000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34062 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34094 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 7A0000005F000000FA020000F0000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 7A0000005F00000080010000C0010000 + D504000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34066 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0x080018c4 + 0x080001f8 + 0x08001cac + 0x080002f8 + + 0 + 134224072 + 134224072 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 8389003 + + + 34070 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 7A0000005F00000080010000C0010000 + C405000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + Access + Current CPU Registers + Value + + + 180 + 180 + 180 + + + sctlr + + 0 + + + 34076 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 7A0000005F0000009C01000010010000 + 0000000002020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + ID + Max Stack Usage + Name + Priority + Run Count + Stack End + Stack Ptr + Stack Size + Stack Start + State + + + 125 + 125 + 100 + 65 + 75 + 125 + 125 + 75 + 125 + 100 + + + + 34091 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 7A0000005F00000080010000C0010000 + 040000004A000000020100008A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34107 + 7A0000005F00000080010000C0010000 + 00000000600000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34096 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 7A0000005F0000002802000020010000 + 0000000000000000AE010000C1000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 7A0000005F00000080010000C0010000 + F50700004C000000000A000099040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 173 + 150 + 100 + 100 + + + + 34104 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 000000007E000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000040000001000000FFFFFFFFFFFFFFFFF10700004C000000F50700009904000001000000020000100400000001000000F2F8FFFF8E010000378500000000000000000000000000000000000001000000378500000100000037850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A01000099040000010000000200001004000000010000000000000000000000FFFFFFFF010000003B850000FFFF02000B004354616262656450616E65001000000100000000000000630000000601000028030000000000004C0000000601000099040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000003B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF3B85000001000000FFFFFFFF3B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF00000000FE010000A4060000020200000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001D85000000000000000000000000000000000000010000001D850000010000001D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001C85000000000000000000000000000000000000010000001C850000010000001C850000000000000040000000000000FFFFFFFFFFFFFFFFC005000032000000C4050000B3020000000000000200000004000000010000001CFBFFFFFE0000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EE010000D1040000F2010000000000000100000004000000010000000000000000000000FFFFFFFF0400000015850000168500001785000018850000018000800000000000000000000009020000D1040000CA02000000000000F2010000D1040000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001585000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001685000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001785000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001885000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1585000001000000FFFFFFFF15850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000128500000000000000000000000000000000000001000000128500000100000012850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFFD104000032000000D5040000B30200000000000002000000040000000100000000F9FFFFB50000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF08000000058500000C8500000E8500000F850000108500002E850000368500000485000001800080000001000000000000002C030000C7060000DD030000000000009D040000000A00004E050000000000004080005608000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000C85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000002E85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B42007200650061006B0070006F0069006E0074007300010000000485000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000A406000004020000000000000100000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000080000000000000FFFFFFFFFFFFFFFF00000000B4020000A4060000B8020000000000000100000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000080000000000000FFFFFFFFFFFFFFFF0000000020020000A406000024020000000000000100000004000000010000000000000000000000FFFFFFFF010000004285000001800080000000000000000000003B020000A4060000CB0200000000000024020000A4060000B4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000004285000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF4285000001000000FFFFFFFF42850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004B85000000000000000000000000000000000000010000004B850000010000004B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 000000001A0000001503000034000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + 34108 + 4608000060000000F4090000F0000000 + 040000003C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 46080000600000006809000010010000 + 0000000038020000A4060000B4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 46080000600000004C090000C0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + 4608000060000000F409000020010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 46080000600000006809000010010000 + 00000000B8020000A406000068030000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 46080000600000006809000010010000 + 0000000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34123 + 6E0100007B00000074020000DC010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34124 + 6E0100007B000000900200002C010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34125 + 6E0100007B000000EE0300000C010000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34127 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34126 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..4c51289b --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,130 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 256381086 + + + 0 + + + HL512000 + + 0 + 2 + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + 0 + 1 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 + + + 0 + + + 1 + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups b/ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat b/ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat new file mode 100644 index 00000000..192ce771 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat @@ -0,0 +1,32 @@ +# config version=3.5 +$ sepk + pod_drvr=jioxds110.dll + pod_port=0 + pod_serial=HL512000 +$ / +$ product + title="Texas Instruments XDS110 USB" + alias=TI_XDS110_USB + name=XDS110 +$ / +$ uscif + tdoedge=FALL + tclk_program=DEFAULT + tclk_frequency=2.5MHz +$ / +$ dot7 + dts_usage=nothing +$ / +$ swd + swd_debug=disabled + swo_data=aux_uart +$ / +@ icepick family=icepick_c irbits=6 drbits=1 subpaths=2 + & port17 address=17 default=no custom=no force=yes pseudo=no + & port16 address=16 default=no custom=no force=yes pseudo=no + @ dap family=cs_dap irbits=4 drbits=1 subpaths=1 identify=0 + & portr4 type=debug address=0 default=no custom=no force=no pseudo=no + @ cortexr4 family=cortex_rxx irbits=0 drbits=0 address=0x80001000 identify=0x02000100 traceid=0x0 + & / + & / +# / diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..ddbce99e --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..903a188b --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..7f8b9b49 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R5" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE8" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..d5205384 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.crun b/ports/cortex_r5/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.dbgdt b/ports/cortex_r5/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.dnx b/ports/cortex_r5/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r5/iar/example_build/tx.dep b/ports/cortex_r5/iar/example_build/tx.dep new file mode 100644 index 00000000..a10cf92c --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.dep @@ -0,0 +1,10476 @@ + + + 4 + 2479021136 + + Debug + + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Txe_sig.c + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Tx_td.c + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Tx_br.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Tx_times.c + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 557 + + + __cstat + 558 + + + BICOMP + 914 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 1 + + + BICOMP + 585 491 131 900 0 1 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 390 + + + __cstat + 580 + + + BICOMP + 282 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 1 + + + BICOMP + 585 1 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 569 + + + __cstat + 793 + + + BICOMP + 286 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 900 1 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 690 + + + __cstat + 373 + + + BICOMP + 817 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 1 + + + BICOMP + 65 900 81 491 585 0 1 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 795 + + + __cstat + 554 + + + BICOMP + 324 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 900 1 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 691 + + + __cstat + 442 + + + BICOMP + 621 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 1 + + + BICOMP + 585 1 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 916 + + + __cstat + 924 + + + BICOMP + 262 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 1 + + + BICOMP + 585 1 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 800 + + + __cstat + 824 + + + BICOMP + 194 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 900 1 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 622 + + + __cstat + 831 + + + BICOMP + 459 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 1 + + + BICOMP + 65 900 81 491 585 0 1 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 431 + + + __cstat + 337 + + + BICOMP + 314 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 1 + + + BICOMP + 585 491 131 900 0 1 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 460 + + + __cstat + 524 + + + BICOMP + 537 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 25 + + + BICOMP + 853 131 401 875 0 25 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 882 + + + __cstat + 903 + + + BICOMP + 926 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 26 + + + BICOMP + 26 401 425 131 413 848 887 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 295 + + + __cstat + 317 + + + BICOMP + 527 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 26 + + + BICOMP + 65 401 425 131 413 848 887 0 26 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 818 + + + __cstat + 183 + + + BICOMP + 645 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 413 26 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 450 + + + __cstat + 275 + + + BICOMP + 761 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 131 41 + + + BICOMP + 41 401 425 81 413 848 887 0 131 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 710 + + + __cstat + 357 + + + BICOMP + 625 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 25 + + + BICOMP + 875 401 81 65 853 0 25 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 377 + + + __cstat + 841 + + + BICOMP + 756 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 26 + + + BICOMP + 65 401 425 131 413 848 887 0 26 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 764 + + + __cstat + 382 + + + BICOMP + 175 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 401 25 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 788 + + + __cstat + 572 + + + BICOMP + 671 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 25 + + + BICOMP + 853 131 401 875 0 25 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 654 + + + __cstat + 189 + + + BICOMP + 452 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 401 25 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 403 + + + __cstat + 548 + + + BICOMP + 724 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 25 + + + BICOMP + 25 853 131 401 875 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 842 + + + __cstat + 556 + + + BICOMP + 607 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 25 + + + BICOMP + 65 25 853 131 401 875 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 279 + + + __cstat + 816 + + + BICOMP + 945 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 401 25 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 344 + + + __cstat + 176 + + + BICOMP + 674 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 26 + + + BICOMP + 65 26 401 425 131 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 852 + + + __cstat + 574 + + + BICOMP + 843 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 26 + + + BICOMP + 65 401 425 131 413 848 887 0 26 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 811 + + + __cstat + 424 + + + BICOMP + 758 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 413 26 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 498 + + + __cstat + 369 + + + BICOMP + 712 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 25 + + + BICOMP + 875 401 65 81 853 0 25 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 820 + + + __cstat + 606 + + + BICOMP + 741 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 26 + + + BICOMP + 26 401 425 131 413 848 887 0 81 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 517 + + + __cstat + 265 + + + BICOMP + 171 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 41 + + + BICOMP + 401 875 81 0 853 33 41 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 753 + + + __cstat + 609 + + + BICOMP + 933 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 33 81 108 49 43 26 41 1 25 + + + BICOMP + 848 49 237 1 462 370 401 131 81 26 65 853 875 0 33 108 43 41 25 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 170 + + + __cstat + 333 + + + BICOMP + 896 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 26 + + + BICOMP + 887 848 413 81 401 425 0 26 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 276 + + + __cstat + 723 + + + BICOMP + 439 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 853 108 33 401 875 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 752 + + + __cstat + 198 + + + BICOMP + 711 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 25 + + + BICOMP + 875 401 65 81 853 0 25 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 272 + + + __cstat + 765 + + + BICOMP + 684 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 + + + BICOMP + 900 33 491 585 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 731 + + + __cstat + 451 + + + BICOMP + 241 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 41 + + + BICOMP + 887 848 65 413 81 401 425 0 41 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 394 + + + __cstat + 840 + + + BICOMP + 897 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 413 26 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 605 + + + __cstat + 604 + + + BICOMP + 384 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 25 + + + BICOMP + 25 853 131 401 875 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + [ROOT_NODE] + + + IARCHIVE + 717 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 536 + + + __cstat + 376 + + + BICOMP + 678 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 43 + + + BICOMP + 237 848 131 462 370 401 0 43 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 480 + + + __cstat + 264 + + + BICOMP + 232 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 462 370 43 237 848 0 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 804 + + + __cstat + 495 + + + BICOMP + 308 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 65 49 491 131 900 0 81 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 766 + + + __cstat + 603 + + + BICOMP + 541 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 746 + + + __cstat + 865 + + + BICOMP + 195 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 41 + + + BICOMP + 401 425 131 413 848 887 0 41 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 774 + + + __cstat + 730 + + + BICOMP + 247 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 348 + + + __cstat + 769 + + + BICOMP + 493 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 462 370 43 237 848 0 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 434 + + + __cstat + 506 + + + BICOMP + 253 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 49 + + + BICOMP + 65 585 491 131 900 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 908 + + + __cstat + 635 + + + BICOMP + 363 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 900 49 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 406 + + + __cstat + 597 + + + BICOMP + 260 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 367 + + + __cstat + 471 + + + BICOMP + 482 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 664 + + + __cstat + 640 + + + BICOMP + 454 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 378 + + + __cstat + 745 + + + BICOMP + 781 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 413 848 887 0 81 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 693 + + + __cstat + 742 + + + BICOMP + 412 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 43 + + + BICOMP + 237 848 131 462 370 401 0 43 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 773 + + + __cstat + 754 + + + BICOMP + 532 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 43 + + + BICOMP + 401 462 370 81 65 237 848 0 43 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 683 + + + __cstat + 576 + + + BICOMP + 391 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 848 413 41 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 345 + + + __cstat + 920 + + + BICOMP + 698 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 41 + + + BICOMP + 887 65 848 413 81 401 425 0 41 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 560 + + + __cstat + 588 + + + BICOMP + 748 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 519 + + + __cstat + 699 + + + BICOMP + 346 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 340 + + + __cstat + 694 + + + BICOMP + 736 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 848 413 41 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 915 + + + __cstat + 613 + + + BICOMP + 686 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 43 + + + BICOMP + 237 65 848 131 462 370 401 0 43 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 644 + + + __cstat + 726 + + + BICOMP + 894 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 49 + + + BICOMP + 65 900 81 491 585 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 500 + + + __cstat + 733 + + + BICOMP + 938 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 240 + + + __cstat + 328 + + + BICOMP + 290 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 462 370 43 237 848 0 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 703 + + + __cstat + 718 + + + BICOMP + 550 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 413 848 887 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 320 + + + __cstat + 236 + + + BICOMP + 720 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 49 + + + BICOMP + 65 585 491 131 900 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 821 + + + __cstat + 271 + + + BICOMP + 814 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 65 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 783 + + + __cstat + 780 + + + BICOMP + 662 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 848 413 41 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 487 + + + __cstat + 261 + + + BICOMP + 615 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 413 848 887 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 256 + + + __cstat + 520 + + + BICOMP + 443 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 656 + + + __cstat + 435 + + + BICOMP + 641 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 33 + + + BICOMP + 491 33 585 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 359 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 534 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 180 + + + __cstat + 631 + + + BICOMP + 685 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 65 131 853 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 342 + + + __cstat + 311 + + + BICOMP + 252 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 401 425 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 301 + + + __cstat + 358 + + + BICOMP + 570 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 65 401 131 853 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 860 + + + __cstat + 336 + + + BICOMP + 721 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 900 49 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 393 + + + __cstat + 732 + + + BICOMP + 801 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 728 + + + __cstat + 876 + + + BICOMP + 595 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 511 + + + __cstat + 713 + + + BICOMP + 508 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 696 + + + __cstat + 380 + + + BICOMP + 296 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 65 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 893 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 362 + + + __cstat + 620 + + + BICOMP + 440 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 49 + + + BICOMP + 585 65 491 131 900 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 258 + + + __cstat + 589 + + + BICOMP + 719 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 507 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 483 + + + __cstat + 543 + + + BICOMP + 676 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 33 + + + BICOMP + 491 33 585 131 900 0 81 413 848 401 425 887 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 688 + + + __cstat + 416 + + + BICOMP + 751 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 823 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 257 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 743 + + + __cstat + 626 + + + BICOMP + 396 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 900 49 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 618 + + + __cstat + 501 + + + BICOMP + 591 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 65 853 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 577 + + + __cstat + 727 + + + BICOMP + 319 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 65 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 179 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 682 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 768 + + + __cstat + 522 + + + BICOMP + 687 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 65 401 425 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 467 + + + __cstat + 331 + + + BICOMP + 877 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 647 + + + __cstat + 381 + + + BICOMP + 675 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 + + + BICOMP + 462 81 65 0 491 585 33 848 401 425 887 900 413 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 705 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 634 + + + __cstat + 708 + + + BICOMP + 939 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 559 + + + __cstat + 913 + + + BICOMP + 813 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 401 425 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 438 + + + __cstat + 937 + + + BICOMP + 899 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 401 425 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 828 + + + __cstat + 479 + + + BICOMP + 792 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 65 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 849 + + + __cstat + 420 + + + BICOMP + 277 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 + + + BICOMP + 401 425 108 65 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 316 + + + __cstat + 463 + + + BICOMP + 453 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 457 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 669 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 512 + + + __cstat + 661 + + + BICOMP + 565 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 + + + BICOMP + 401 425 65 108 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 547 + + + __cstat + 868 + + + BICOMP + 836 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 706 + + + __cstat + 523 + + + BICOMP + 385 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 280 + + + __cstat + 474 + + + BICOMP + 533 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 65 81 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 315 + + + __cstat + 355 + + + BICOMP + 884 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 81 + + + BICOMP + 887 848 81 413 131 401 425 0 108 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 932 + + + __cstat + 847 + + + BICOMP + 587 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 401 425 0 81 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 254 + + + __cstat + 864 + + + BICOMP + 190 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 401 425 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 529 + + + __cstat + 538 + + + BICOMP + 623 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 401 425 81 65 413 848 887 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 291 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 448 + + + __cstat + 304 + + + BICOMP + 397 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 131 + + + BICOMP + 887 848 131 413 108 401 425 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 312 + + + __cstat + 321 + + + BICOMP + 499 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 65 81 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 293 + + + __cstat + 779 + + + BICOMP + 941 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 601 + + + __cstat + 709 + + + BICOMP + 747 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 374 + + + __cstat + 469 + + + BICOMP + 181 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 401 425 81 413 848 887 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 578 + + + __cstat + 871 + + + BICOMP + 680 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 251 + + + __cstat + 652 + + + BICOMP + 928 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 387 + + + __cstat + 799 + + + BICOMP + 300 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 65 108 413 848 887 0 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 590 + + + __cstat + 902 + + + BICOMP + 716 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 401 425 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 571 + + + __cstat + 870 + + + BICOMP + 784 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 65 413 131 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 410 + + + __cstat + 281 + + + BICOMP + 906 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 65 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 819 + + + __cstat + 689 + + + BICOMP + 575 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 81 + + + BICOMP + 887 848 81 413 131 401 425 0 108 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 697 + + + __cstat + 515 + + + BICOMP + 436 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 771 + + + __cstat + 925 + + + BICOMP + 267 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 65 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 502 + + + __cstat + 923 + + + BICOMP + 470 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 449 + + + __cstat + 890 + + + BICOMP + 666 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 65 401 131 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 798 + + + __cstat + 757 + + + BICOMP + 740 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 25 + + + BICOMP + 401 875 900 33 491 585 0 108 413 848 81 25 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 564 + + + __cstat + 335 + + + BICOMP + 288 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 65 401 900 25 491 585 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 468 + + + __cstat + 285 + + + BICOMP + 873 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 26 + + + BICOMP + 65 848 887 108 853 33 401 425 0 81 26 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 573 + + + __cstat + 944 + + + BICOMP + 833 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 26 + + + BICOMP + 401 65 26 81 413 848 0 108 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 323 + + + __cstat + 911 + + + BICOMP + 936 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 26 + + + BICOMP + 401 26 81 65 413 848 0 108 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 307 + + + __cstat + 477 + + + BICOMP + 602 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 825 + + + __cstat + 408 + + + BICOMP + 593 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 827 + + + __cstat + 379 + + + BICOMP + 794 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 65 900 1 491 585 0 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 611 + + + __cstat + 341 + + + BICOMP + 701 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 880 + + + __cstat + 427 + + + BICOMP + 426 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 25 + + + BICOMP + 65 887 848 25 853 81 401 425 0 108 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 549 + + + __cstat + 297 + + + BICOMP + 912 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 65 848 853 26 401 425 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 862 + + + __cstat + 898 + + + BICOMP + 513 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 65 401 900 25 491 585 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 399 + + + __cstat + 504 + + + BICOMP + 521 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 1 + + + BICOMP + 1 65 853 81 401 875 0 108 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 441 + + + __cstat + 330 + + + BICOMP + 484 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 853 26 401 425 0 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 629 + + + __cstat + 909 + + + BICOMP + 866 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 853 26 401 425 0 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 812 + + + __cstat + 922 + + + BICOMP + 518 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 25 + + + BICOMP + 401 875 108 900 33 491 585 0 81 25 413 848 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 673 + + + __cstat + 921 + + + BICOMP + 349 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 41 + + + BICOMP + 65 848 887 108 853 33 401 425 0 81 462 237 370 491 41 900 413 585 875 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 539 + + + __cstat + 931 + + + BICOMP + 327 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 598 + + + __cstat + 447 + + + BICOMP + 655 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 329 + + + __cstat + 475 + + + BICOMP + 739 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 826 + + + __cstat + 854 + + + BICOMP + 437 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 665 + + + __cstat + 544 + + + BICOMP + 235 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 1 + + + BICOMP + 108 900 33 491 585 0 81 1 413 848 401 425 887 65 462 237 853 370 875 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 481 + + + __cstat + 429 + + + BICOMP + 704 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 25 + + + BICOMP + 401 875 900 33 491 585 0 108 413 848 81 25 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 238 + + + __cstat + 942 + + + BICOMP + 526 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 65 900 1 491 585 0 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 284 + + + __cstat + 389 + + + BICOMP + 869 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 65 401 131 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 810 + + + __cstat + 546 + + + BICOMP + 776 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 423 + + + __cstat + 472 + + + BICOMP + 383 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 237 848 1 462 370 491 0 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 846 + + + __cstat + 610 + + + BICOMP + 830 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 1 + + + BICOMP + 65 1 853 81 401 875 0 108 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 473 + + + __cstat + 255 + + + BICOMP + 444 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 65 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 365 + + + __cstat + 200 + + + BICOMP + 343 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 65 401 108 853 848 887 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 553 + + + __cstat + 750 + + + BICOMP + 455 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 65 401 108 853 848 887 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 0 65 667 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 943 + + + __cstat + 505 + + + BICOMP + 322 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 65 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 851 + + + __cstat + 867 + + + BICOMP + 185 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 364 + + + __cstat + 303 + + + BICOMP + 497 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 491 108 585 33 65 900 401 875 0 81 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 594 + + + __cstat + 624 + + + BICOMP + 433 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 425 401 81 853 848 887 0 108 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 763 + + + __cstat + 917 + + + BICOMP + 935 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 465 + + + __cstat + 283 + + + BICOMP + 600 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 65 401 108 853 848 887 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 476 + + + __cstat + 608 + + + BICOMP + 361 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 491 108 585 33 900 401 875 0 81 413 848 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 368 + + + __cstat + 829 + + + BICOMP + 809 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 900 401 875 0 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 250 + + + __cstat + 273 + + + BICOMP + 837 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 900 401 875 0 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 715 + + + __cstat + 892 + + + BICOMP + 302 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 65 848 853 41 401 425 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 245 + + + __cstat + 531 + + + BICOMP + 672 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 65 43 413 848 0 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 243 + + + __cstat + 889 + + + BICOMP + 807 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 900 401 875 0 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 428 + + + __cstat + 681 + + + BICOMP + 904 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 41 + + + BICOMP + 401 65 41 81 413 848 0 108 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 929 + + + __cstat + 874 + + + BICOMP + 787 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 65 237 43 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 492 + + + __cstat + 242 + + + BICOMP + 637 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 49 + + + BICOMP + 585 65 49 491 81 900 401 875 0 108 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 767 + + + __cstat + 802 + + + BICOMP + 278 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 49 + + + BICOMP + 585 49 491 81 900 401 875 0 108 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 778 + + + __cstat + 496 + + + BICOMP + 857 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 65 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 614 + + + __cstat + 445 + + + BICOMP + 386 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 41 + + + BICOMP + 65 848 887 108 853 33 401 425 0 81 41 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 855 + + + __cstat + 844 + + + BICOMP + 790 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 425 401 81 853 848 887 0 108 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 785 + + + __cstat + 806 + + + BICOMP + 805 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 65 848 853 41 401 425 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 263 + + + __cstat + 409 + + + BICOMP + 581 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 237 848 49 462 370 491 0 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 338 + + + __cstat + 879 + + + BICOMP + 430 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 65 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 907 + + + __cstat + 803 + + + BICOMP + 489 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 485 + + + __cstat + 371 + + + BICOMP + 535 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 305 + + + __cstat + 318 + + + BICOMP + 582 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 41 + + + BICOMP + 401 65 875 41 900 33 491 585 0 81 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 299 + + + __cstat + 292 + + + BICOMP + 486 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 108 81 43 + + + BICOMP + 401 108 413 848 0 43 900 491 585 875 33 81 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 934 + + + __cstat + 919 + + + BICOMP + 796 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 43 413 848 0 65 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 702 + + + __cstat + 366 + + + BICOMP + 184 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 237 43 65 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 567 + + + __cstat + 584 + + + BICOMP + 755 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 65 43 413 848 0 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 334 + + + __cstat + 659 + + + BICOMP + 196 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 237 43 65 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 786 + + + __cstat + 918 + + + BICOMP + 259 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 49 + + + BICOMP + 237 108 848 33 462 370 491 0 81 49 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 530 + + + __cstat + 360 + + + BICOMP + 421 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 65 237 848 49 462 370 491 0 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 695 + + + __cstat + 725 + + + BICOMP + 777 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 237 848 49 462 370 491 0 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 834 + + + __cstat + 503 + + + BICOMP + 289 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 65 237 848 49 462 370 491 0 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 372 + + + __cstat + 762 + + + BICOMP + 405 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 65 237 848 49 462 370 491 0 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 649 + + + __cstat + 878 + + + BICOMP + 306 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 65 43 413 848 0 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 239 + + + __cstat + 940 + + + BICOMP + 735 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 237 43 65 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 402 + + + __cstat + 772 + + + BICOMP + 643 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 875 401 900 108 491 585 33 413 848 0 81 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 0 65 352 178 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 0 65 178 352 596 677 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 0 65 927 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 0 65 178 352 596 667 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 0 65 596 352 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 0 65 596 352 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 0 65 375 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 0 65 677 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 0 65 178 352 596 839 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 0 65 178 352 596 927 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 0 65 352 178 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 0 65 927 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 0 65 375 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 0 65 178 352 596 638 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 0 65 352 596 178 927 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 0 65 178 352 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 0 65 839 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 0 65 178 352 596 677 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 0 65 178 352 596 667 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 418 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 0 65 638 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 0 65 178 352 596 927 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 404 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 0 65 638 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 0 65 178 352 596 375 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 188 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 0 65 839 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 690 622 431 390 557 569 800 795 691 916 498 752 788 605 460 279 764 654 403 710 842 170 295 882 344 852 394 811 818 820 377 517 753 276 272 976 731 450 703 821 746 683 783 340 487 345 378 773 536 664 500 367 693 240 480 348 560 406 519 915 804 644 320 766 774 434 908 860 743 393 634 362 507 705 483 688 180 577 256 647 179 682 534 823 257 511 258 301 618 768 467 656 359 728 342 696 893 706 312 697 280 315 457 819 932 448 254 529 291 293 438 590 601 571 410 828 771 849 559 374 669 316 578 251 387 512 547 502 810 611 307 539 826 449 284 598 825 329 399 665 846 238 827 423 481 798 880 862 564 812 468 573 323 549 441 629 673 428 614 715 785 305 299 929 567 702 245 649 239 334 934 263 786 492 767 372 530 834 695 402 338 243 907 368 778 250 855 485 851 473 943 763 465 364 476 553 594 365 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 0 65 178 352 596 638 375 677 839 667 927 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 0 65 352 677 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 0 65 375 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 0 65 178 352 596 839 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 0 65 352 677 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 881 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 0 65 596 352 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 0 65 677 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 0 65 667 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 0 65 178 352 596 667 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 0 65 839 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 340 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 487 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 753 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 962 974 968 954 972 969 970 964 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 345 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 773 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 731 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 820 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 378 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 276 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 377 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 272 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 976 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 703 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 450 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 953 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 821 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 683 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 746 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 783 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 665 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 798 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 827 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 846 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 862 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 549 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 441 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 329 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 573 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 673 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 428 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 614 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 299 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 929 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 702 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 245 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 880 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 564 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 812 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 715 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 629 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 785 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 305 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 567 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 649 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 399 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 423 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 238 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 481 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 468 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 323 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 800 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 788 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 403 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 710 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 852 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 811 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 279 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 431 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 752 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 295 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 795 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 622 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 691 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 690 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 916 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 605 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 764 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 498 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 460 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 654 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 842 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 170 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 882 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 344 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 394 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 818 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 390 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 569 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 485 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 473 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 239 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 943 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 465 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 364 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 763 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 553 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 594 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 530 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 365 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 851 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 476 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 907 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 334 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 934 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 786 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 834 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 695 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 263 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 338 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 767 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 243 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 492 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 368 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 372 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 778 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 402 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 250 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 855 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 560 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 291 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 406 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 367 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 823 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 519 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 915 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 804 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 705 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 669 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 179 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 664 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 644 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 320 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 954 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 257 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 693 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 972 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 517 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 970 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 507 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 536 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 240 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 500 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 480 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 534 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 348 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 682 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 457 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 893 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 359 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 647 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 301 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 618 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 467 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 696 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 312 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 688 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 768 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 908 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 697 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 656 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 962 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 315 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 280 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 362 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 434 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 706 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 511 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 258 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 743 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 860 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 256 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 728 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 819 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 342 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 774 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 766 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 393 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 634 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 483 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 962 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 180 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 577 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 448 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 512 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 601 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 559 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 387 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 251 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 547 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 502 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 539 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 254 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 316 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 590 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 284 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 598 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 825 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 374 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 810 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 826 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 578 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 932 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 571 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 438 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 449 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 828 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 771 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 611 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 529 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 307 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 293 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 849 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 410 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r5/iar/example_build/tx.ewd b/ports/cortex_r5/iar/example_build/tx.ewd new file mode 100644 index 00000000..23d5eff1 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r5/iar/example_build/tx.ewp b/ports/cortex_r5/iar/example_build/tx.ewp new file mode 100644 index 00000000..06b41982 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.ewp @@ -0,0 +1,2764 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r5/iar/example_build/tx.ewt b/ports/cortex_r5/iar/example_build/tx.ewt new file mode 100644 index 00000000..016f76bc --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.ewt @@ -0,0 +1,3415 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r5/iar/example_build/tx_initialize_low_level.s b/ports/cortex_r5/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..6e5da9e4 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,277 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore + +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif + + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + ARM + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + CPS #SVC_MODE ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + BX lr ; Return to caller +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return + PUBLIC IRQ_Handler +__tx_irq_handler +IRQ_Handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +; /* FIQ Handler */ + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_r5/iar/inc/tx_port.h b/ports/cortex_r5/iar/inc/tx_port.h new file mode 100644 index 00000000..5c597d04 --- /dev/null +++ b/ports/cortex_r5/iar/inc/tx_port.h @@ -0,0 +1,384 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R5/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 1 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_IRQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-R5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R5/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + + + + diff --git a/ports/cortex_r5/iar/readme_threadx.txt b/ports/cortex_r5/iar/readme_threadx.txt new file mode 100644 index 00000000..96f7a37f --- /dev/null +++ b/ports/cortex_r5/iar/readme_threadx.txt @@ -0,0 +1,426 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R5 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-R5 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-R5 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R5 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R5 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of a thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +ThreadX management of FIQ interrupts is not provided because FIQ interrupts +cannot be disabled. The hardware does not support nested FIQ interrupts. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-R5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version for Cortex-R5 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r5/iar/src/tx_iar.c b/ports/cortex_r5/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_r5/iar/src/tx_thread_context_restore.s b/ports/cortex_r5/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..3d28fdb5 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_context_restore.s @@ -0,0 +1,247 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + +SVC_MODE DEFINE 0x13 ; SVC mode +IRQ_MODE DEFINE 0x12 ; IRQ mode +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +THUMB_MASK DEFINE 0x20 ; Thumb bit mask + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + ARM +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + CPSID i ; Disable IRQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + CPS #SVC_MODE ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + CPS #IRQ_MODE ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + CPS #SVC_MODE ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + CPS #SVC_MODE ; Enter SVC mode + + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_context_save.s b/ports/cortex_r5/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..97b1d3cf --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_context_save.s @@ -0,0 +1,198 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + ARM +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_interrupt_control.s b/ports/cortex_r5/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..ad3a6bae --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + +INT_MASK DEFINE 0x80 ; Interrupt bit mask +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + ARM +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + + BX lr ; Return to caller +; +;} +; +; + END diff --git a/ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b795d14f --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,89 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + ARM +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR + CPSID i ; Mask interrupts + BX lr ; Return to caller +;} +; +; + END diff --git a/ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..9fc7b4e4 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + ARM +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR + + BX lr ; Return to caller +;} +; + END diff --git a/ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..e9bb5eee --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_MODE DEFINE 0x12 ; IRQ mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + ARM +_tx_thread_irq_nesting_end + MOV r3, lr ; Save ISR return address + CPSID i ; Disable interrupts + POP {lr} ; Pickup saved lr + CPS #IRQ_MODE ; Switch to IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..70e6116b --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SYS_MODE DEFINE 0x1F ; System mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + ARM +_tx_thread_irq_nesting_start + MOV r3, lr ; Save ISR return address + CPS #SYS_MODE ; Enter SYS mode + PUSH {lr} ; Save system mode lr on the system mode stack + CPSIE i ; Enable interrupts + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_schedule.s b/ports/cortex_r5/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..14403ee3 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_schedule.s @@ -0,0 +1,220 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + ARM +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + CPSIE i ; Enable IRQ interrupts + +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + CPSID i ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR + + BX lr ; Return to caller +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_stack_build.s b/ports/cortex_r5/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..b09b4f98 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_stack_build.s @@ -0,0 +1,151 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + ARM +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_system_return.s b/ports/cortex_r5/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..fbd5b756 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_system_return.s @@ -0,0 +1,155 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + ARM +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR + CPSID i ; Disable interrupts +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..ebc54f54 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,184 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + ARM +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_r5/iar/src/tx_timer_interrupt.s b/ports/cortex_r5/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..007fc2aa --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_timer_interrupt.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + ARM +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + BX lr ; Return to caller +; +;} + END + diff --git a/ports/linux/gnu/example_build/file_list.mk b/ports/linux/gnu/example_build/file_list.mk new file mode 100644 index 00000000..73497590 --- /dev/null +++ b/ports/linux/gnu/example_build/file_list.mk @@ -0,0 +1,201 @@ +LINUX_SRCS = \ +tx_initialize_low_level.c \ +tx_thread_context_restore.c \ +tx_thread_context_save.c \ +tx_thread_interrupt_control.c \ +tx_thread_schedule.c \ +tx_thread_stack_build.c \ +tx_thread_system_return.c \ +tx_timer_interrupt.c \ + +LINUX_OBJS = $(LINUX_SRCS:%.c=.tmp/%.o) + + +GENERIC_SRCS = \ +tx_block_allocate.c \ +tx_block_pool_cleanup.c \ +tx_block_pool_create.c \ +tx_block_pool_delete.c \ +tx_block_pool_info_get.c \ +tx_block_pool_initialize.c \ +tx_block_pool_performance_info_get.c \ +tx_block_pool_performance_system_info_get.c \ +tx_block_pool_prioritize.c \ +tx_block_release.c \ +tx_byte_allocate.c \ +tx_byte_pool_cleanup.c \ +tx_byte_pool_create.c \ +tx_byte_pool_delete.c \ +tx_byte_pool_info_get.c \ +tx_byte_pool_initialize.c \ +tx_byte_pool_performance_info_get.c \ +tx_byte_pool_performance_system_info_get.c \ +tx_byte_pool_prioritize.c \ +tx_byte_pool_search.c \ +tx_byte_release.c \ +txe_block_allocate.c \ +txe_block_pool_create.c \ +txe_block_pool_delete.c \ +txe_block_pool_info_get.c \ +txe_block_pool_prioritize.c \ +txe_block_release.c \ +txe_byte_allocate.c \ +txe_byte_pool_create.c \ +txe_byte_pool_delete.c \ +txe_byte_pool_info_get.c \ +txe_byte_pool_prioritize.c \ +txe_byte_release.c \ +txe_event_flags_create.c \ +txe_event_flags_delete.c \ +txe_event_flags_get.c \ +txe_event_flags_info_get.c \ +txe_event_flags_set.c \ +txe_event_flags_set_notify.c \ +txe_mutex_create.c \ +txe_mutex_delete.c \ +txe_mutex_get.c \ +txe_mutex_info_get.c \ +txe_mutex_prioritize.c \ +txe_mutex_put.c \ +txe_queue_create.c \ +txe_queue_delete.c \ +txe_queue_flush.c \ +txe_queue_front_send.c \ +txe_queue_info_get.c \ +txe_queue_prioritize.c \ +txe_queue_receive.c \ +txe_queue_send.c \ +txe_queue_send_notify.c \ +txe_semaphore_ceiling_put.c \ +txe_semaphore_create.c \ +txe_semaphore_delete.c \ +txe_semaphore_get.c \ +txe_semaphore_info_get.c \ +txe_semaphore_prioritize.c \ +txe_semaphore_put.c \ +txe_semaphore_put_notify.c \ +txe_thread_create.c \ +txe_thread_delete.c \ +txe_thread_entry_exit_notify.c \ +txe_thread_info_get.c \ +txe_thread_preemption_change.c \ +txe_thread_priority_change.c \ +txe_thread_relinquish.c \ +txe_thread_reset.c \ +txe_thread_resume.c \ +txe_thread_suspend.c \ +txe_thread_terminate.c \ +txe_thread_time_slice_change.c \ +txe_thread_wait_abort.c \ +txe_timer_activate.c \ +txe_timer_change.c \ +txe_timer_create.c \ +txe_timer_deactivate.c \ +txe_timer_delete.c \ +txe_timer_info_get.c \ +tx_event_flags_cleanup.c \ +tx_event_flags_create.c \ +tx_event_flags_delete.c \ +tx_event_flags_get.c \ +tx_event_flags_info_get.c \ +tx_event_flags_initialize.c \ +tx_event_flags_performance_info_get.c \ +tx_event_flags_performance_system_info_get.c \ +tx_event_flags_set.c \ +tx_event_flags_set_notify.c \ +tx_initialize_high_level.c \ +tx_initialize_kernel_enter.c \ +tx_initialize_kernel_setup.c \ +tx_misra.c \ +tx_mutex_cleanup.c \ +tx_mutex_create.c \ +tx_mutex_delete.c \ +tx_mutex_get.c \ +tx_mutex_info_get.c \ +tx_mutex_initialize.c \ +tx_mutex_performance_info_get.c \ +tx_mutex_performance_system_info_get.c \ +tx_mutex_prioritize.c \ +tx_mutex_priority_change.c \ +tx_mutex_put.c \ +tx_queue_cleanup.c \ +tx_queue_create.c \ +tx_queue_delete.c \ +tx_queue_flush.c \ +tx_queue_front_send.c \ +tx_queue_info_get.c \ +tx_queue_initialize.c \ +tx_queue_performance_info_get.c \ +tx_queue_performance_system_info_get.c \ +tx_queue_prioritize.c \ +tx_queue_receive.c \ +tx_queue_send.c \ +tx_queue_send_notify.c \ +tx_semaphore_ceiling_put.c \ +tx_semaphore_cleanup.c \ +tx_semaphore_create.c \ +tx_semaphore_delete.c \ +tx_semaphore_get.c \ +tx_semaphore_info_get.c \ +tx_semaphore_initialize.c \ +tx_semaphore_performance_info_get.c \ +tx_semaphore_performance_system_info_get.c \ +tx_semaphore_prioritize.c \ +tx_semaphore_put.c \ +tx_semaphore_put_notify.c \ +tx_thread_create.c \ +tx_thread_delete.c \ +tx_thread_entry_exit_notify.c \ +tx_thread_identify.c \ +tx_thread_info_get.c \ +tx_thread_initialize.c \ +tx_thread_performance_info_get.c \ +tx_thread_performance_system_info_get.c \ +tx_thread_preemption_change.c \ +tx_thread_priority_change.c \ +tx_thread_relinquish.c \ +tx_thread_reset.c \ +tx_thread_resume.c \ +tx_thread_shell_entry.c \ +tx_thread_sleep.c \ +tx_thread_stack_analyze.c \ +tx_thread_stack_error_handler.c \ +tx_thread_stack_error_notify.c \ +tx_thread_suspend.c \ +tx_thread_system_preempt_check.c \ +tx_thread_system_resume.c \ +tx_thread_system_suspend.c \ +tx_thread_terminate.c \ +tx_thread_timeout.c \ +tx_thread_time_slice.c \ +tx_thread_time_slice_change.c \ +tx_thread_wait_abort.c \ +tx_time_get.c \ +tx_timer_activate.c \ +tx_timer_change.c \ +tx_timer_create.c \ +tx_timer_deactivate.c \ +tx_timer_delete.c \ +tx_timer_expiration_process.c \ +tx_timer_info_get.c \ +tx_timer_initialize.c \ +tx_timer_performance_info_get.c \ +tx_timer_performance_system_info_get.c \ +tx_timer_system_activate.c \ +tx_timer_system_deactivate.c \ +tx_timer_thread_entry.c \ +tx_time_set.c \ +tx_trace_buffer_full_notify.c \ +tx_trace_disable.c \ +tx_trace_enable.c \ +tx_trace_event_filter.c \ +tx_trace_event_unfilter.c \ +tx_trace_initialize.c \ +tx_trace_interrupt_control.c \ +tx_trace_isr_enter_insert.c \ +tx_trace_isr_exit_insert.c \ +tx_trace_object_register.c \ +tx_trace_object_unregister.c \ +tx_trace_user_event_insert.c \ + +GENERIC_OBJS = $(GENERIC_SRCS:%.c=.tmp/generic/%.o) diff --git a/ports/linux/gnu/example_build/sample_threadx.c b/ports/linux/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..080be3c4 --- /dev/null +++ b/ports/linux/gnu/example_build/sample_threadx.c @@ -0,0 +1,380 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Print results. */ + printf("**** ThreadX Linux Demonstration **** (c) 1996-2020 Microsoft Corporation\n\n"); + printf(" thread 0 events sent: %lu\n", thread_0_counter); + printf(" thread 1 messages sent: %lu\n", thread_1_counter); + printf(" thread 2 messages received: %lu\n", thread_2_counter); + printf(" thread 3 obtained semaphore: %lu\n", thread_3_counter); + printf(" thread 4 obtained semaphore: %lu\n", thread_4_counter); + printf(" thread 5 events received: %lu\n", thread_5_counter); + printf(" thread 6 mutex obtained: %lu\n", thread_6_counter); + printf(" thread 7 mutex obtained: %lu\n\n", thread_7_counter); + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/linux/gnu/inc/tx_port.h b/ports/linux/gnu/inc/tx_port.h new file mode 100644 index 00000000..9422e100 --- /dev/null +++ b/ports/linux/gnu/inc/tx_port.h @@ -0,0 +1,575 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Linux/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +#define TX_MAX_PRIORITIES 32 +/* #define TX_MISRA_ENABLE */ + + +/* #define TX_INLINE_INITIALIZATION */ + +/* #define TX_NOT_INTERRUPTABLE */ +/* #define TX_TIMER_PROCESS_IN_ISR */ +/* #define TX_REACTIVATE_INLINE */ +/* #define TX_DISABLE_STACK_FILLING */ +/* #define TX_ENABLE_STACK_CHECKING */ +/* #define TX_DISABLE_PREEMPTION_THRESHOLD */ +/* #define TX_DISABLE_REDUNDANT_CLEARING */ +/* #define TX_DISABLE_NOTIFY_CALLBACKS */ +/* #define TX_INLINE_THREAD_RESUME_SUSPEND */ +/* #define TX_ENABLE_EVENT_TRACE */ + + +/* For MISRA, define enable performance info. Also, for MISRA TX_DISABLE_NOTIFY_CALLBACKS should not be defined. */ + + +/* #define TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO +#define TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO +#define TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO +#define TX_MUTEX_ENABLE_PERFORMANCE_INFO +#define TX_QUEUE_ENABLE_PERFORMANCE_INFO +#define TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO +#define TX_THREAD_ENABLE_PERFORMANCE_INFO +#define TX_TIMER_ENABLE_PERFORMANCE_INFO */ + + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifndef __USE_POSIX199309 +#define __USE_POSIX199309 +#include +#include +#include +#undef __USE_POSIX199309 +#else /* __USE_POSIX199309 */ +#include +#include +#include +#endif /* __USE_POSIX199309 */ + + +/* Define ThreadX basic types for this port. */ + +typedef void VOID; +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +#if __x86_64__ +typedef int LONG; +typedef unsigned int ULONG; +#else /* __x86_64__ */ +typedef long LONG; +typedef unsigned long ULONG; +#endif /* __x86_64__ */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef uint64_t ULONG64; + + +/* Override the alignment type to use 64-bit alignment and storage for pointers. */ + +#if __x86_64__ +#define ALIGN_TYPE_DEFINED +typedef unsigned long long ALIGN_TYPE; + +/* Override the free block marker for byte pools to be a 64-bit constant. */ + +#define TX_BYTE_BLOCK_FREE ((ALIGN_TYPE) 0xFFFFEEEEFFFFEEEE) +#endif + +/* Define automated coverage test extensions... These are required for the + ThreadX regression test. */ + +typedef unsigned int TEST_FLAG; +extern TEST_FLAG threadx_byte_allocate_loop_test; +extern TEST_FLAG threadx_byte_release_loop_test; +extern TEST_FLAG threadx_mutex_suspension_put_test; +extern TEST_FLAG threadx_mutex_suspension_priority_test; +#ifndef TX_TIMER_PROCESS_IN_ISR +extern TEST_FLAG threadx_delete_timer_thread; +#endif + +extern void abort_and_resume_byte_allocating_thread(void); +extern void abort_all_threads_suspended_on_mutex(void); +extern void suspend_lowest_priority(void); +#ifndef TX_TIMER_PROCESS_IN_ISR +extern void delete_timer_thread(void); +#endif +extern TEST_FLAG test_stack_analyze_flag; +extern TEST_FLAG test_initialize_flag; +extern TEST_FLAG test_forced_mutex_timeout; + + +#ifdef TX_REGRESSION_TEST + +/* Define extension macros for automated coverage tests. */ + + +#define TX_BYTE_ALLOCATE_EXTENSION if (threadx_byte_allocate_loop_test == ((TEST_FLAG) 1)) \ + { \ + pool_ptr -> tx_byte_pool_owner = TX_NULL; \ + threadx_byte_allocate_loop_test = ((TEST_FLAG) 0); \ + } + +#define TX_BYTE_RELEASE_EXTENSION if (threadx_byte_release_loop_test == ((TEST_FLAG) 1)) \ + { \ + threadx_byte_release_loop_test = ((TEST_FLAG) 0); \ + abort_and_resume_byte_allocating_thread(); \ + } + +#define TX_MUTEX_PUT_EXTENSION_1 if (threadx_mutex_suspension_put_test == ((TEST_FLAG) 1)) \ + { \ + threadx_mutex_suspension_put_test = ((TEST_FLAG) 0); \ + abort_all_threads_suspended_on_mutex(); \ + } + + +#define TX_MUTEX_PUT_EXTENSION_2 if (test_forced_mutex_timeout == ((TEST_FLAG) 1)) \ + { \ + test_forced_mutex_timeout = ((TEST_FLAG) 0); \ + _tx_thread_wait_abort(mutex_ptr -> tx_mutex_suspension_list); \ + } + + +#define TX_MUTEX_PRIORITY_CHANGE_EXTENSION if (threadx_mutex_suspension_priority_test == ((TEST_FLAG) 1)) \ + { \ + threadx_mutex_suspension_priority_test = ((TEST_FLAG) 0); \ + suspend_lowest_priority(); \ + } + +#ifndef TX_TIMER_PROCESS_IN_ISR + +#define TX_TIMER_INITIALIZE_EXTENSION(a) if (threadx_delete_timer_thread == ((TEST_FLAG) 1)) \ + { \ + threadx_delete_timer_thread = ((TEST_FLAG) 0); \ + delete_timer_thread(); \ + (a) = ((UINT) 1); \ + } + +#endif + +#define TX_THREAD_STACK_ANALYZE_EXTENSION if (test_stack_analyze_flag == ((TEST_FLAG) 1)) \ + { \ + thread_ptr -> tx_thread_id = ((TEST_FLAG) 0); \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } \ + else if (test_stack_analyze_flag == ((TEST_FLAG) 2)) \ + { \ + stack_ptr = thread_ptr -> tx_thread_stack_start; \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } \ + else if (test_stack_analyze_flag == ((TEST_FLAG) 3)) \ + { \ + *stack_ptr = TX_STACK_FILL; \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } \ + else \ + { \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } + +#define TX_INITIALIZE_KERNEL_ENTER_EXTENSION if (test_initialize_flag == ((TEST_FLAG) 1)) \ + { \ + test_initialize_flag = ((TEST_FLAG) 0); \ + return; \ + } + +#endif + + + +/* Add Linux debug insert prototype. */ + +void _tx_linux_debug_entry_insert(char *action, char *file, unsigned long line); + +#ifndef TX_LINUX_DEBUG_ENABLE + +/* If Linux debug is not enabled, turn logging into white-space. */ + +#define _tx_linux_debug_entry_insert(a, b, c) + +#endif + + + +/* Define the TX_MEMSET macro to remove library reference. */ + +#ifndef TX_MISRA_ENABLE +#define TX_MEMSET(a,b,c) { \ + UCHAR *ptr; \ + UCHAR value; \ + UINT i, size; \ + ptr = (UCHAR *) ((VOID *) a); \ + value = (UCHAR) b; \ + size = (UINT) c; \ + for (i = 0; i < size; i++) \ + { \ + *ptr++ = value; \ + } \ + } +#endif + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 400 /* Default timer thread stack size - Not used in Linux port! */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ((ULONG) (_tx_linux_time_stamp.tv_nsec)); +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port-specific trace extension to pickup the Windows timer. */ + +#define TX_TRACE_PORT_EXTENSION clock_gettime(CLOCK_REALTIME, &_tx_linux_time_stamp); + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Define the Linux-specific initialization code that is expanded in the generic source. */ + +void _tx_initialize_start_interrupts(void); + +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION _tx_initialize_start_interrupts(); + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 pthread_t tx_thread_linux_thread_id; \ + sem_t tx_thread_linux_thread_run_semaphore; \ + UINT tx_thread_linux_suspension_type; \ + UINT tx_thread_linux_int_disabled_flag; + +#define TX_THREAD_EXTENSION_1 VOID *tx_thread_extension_ptr; +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + +struct TX_THREAD_STRUCT; + +/* Define post completion processing for tx_thread_delete, so that the Linux thread resources are properly removed. */ + +void _tx_thread_delete_port_completion(struct TX_THREAD_STRUCT *thread_ptr, UINT tx_saved_posture); +#define TX_THREAD_DELETE_PORT_COMPLETION(thread_ptr) _tx_thread_delete_port_completion(thread_ptr, tx_saved_posture); + +/* Define post completion processing for tx_thread_reset, so that the Linux thread resources are properly removed. */ + +void _tx_thread_reset_port_completion(struct TX_THREAD_STRUCT *thread_ptr, UINT tx_saved_posture); +#define TX_THREAD_RESET_PORT_COMPLETION(thread_ptr) _tx_thread_reset_port_completion(thread_ptr, tx_saved_posture); + +#if __x86_64__ +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + +/* Define the internal timer extension to also hold the thread pointer such that _tx_thread_timeout + can figure out what thread timeout to process. */ + +#define TX_TIMER_INTERNAL_EXTENSION VOID *tx_timer_internal_extension_ptr; + + +/* Define the thread timeout setup logic in _tx_thread_create. */ + +#define TX_THREAD_CREATE_TIMEOUT_SETUP(t) (t) -> tx_thread_timer.tx_timer_internal_timeout_function = &(_tx_thread_timeout); \ + (t) -> tx_thread_timer.tx_timer_internal_timeout_param = 0; \ + (t) -> tx_thread_timer.tx_timer_internal_extension_ptr = (VOID *) (t); + + +/* Define the thread timeout pointer setup in _tx_thread_timeout. */ + +#define TX_THREAD_TIMEOUT_POINTER_SETUP(t) (t) = (TX_THREAD *) _tx_timer_expired_timer_ptr -> tx_timer_internal_extension_ptr; +#endif /* __x86_64__ */ + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +UINT _tx_thread_interrupt_disable(void); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA UINT tx_saved_posture; + +#ifndef TX_LINUX_DEBUG_ENABLE +#define TX_DISABLE tx_saved_posture = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(tx_saved_posture); +#else +#define TX_DISABLE _tx_linux_debug_entry_insert("DISABLE", __FILE__, __LINE__); \ + tx_saved_posture = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_linux_debug_entry_insert("RESTORE", __FILE__, __LINE__); \ + _tx_thread_interrupt_restore(tx_saved_posture); +#endif /* TX_LINUX_DEBUG_ENABLE */ +#define tx_linux_mutex_lock(p) pthread_mutex_lock(&p) +#define tx_linux_mutex_unlock(p) pthread_mutex_unlock(&p) +#define tx_linux_mutex_recursive_unlock(p) {\ + int _recursive_count = tx_linux_mutex_recursive_count;\ + while(_recursive_count)\ + {\ + pthread_mutex_unlock(&p);\ + _recursive_count--;\ + }\ + } +#define tx_linux_mutex_recursive_count _tx_linux_mutex.__data.__count +#define tx_linux_sem_post(p) tx_linux_mutex_lock(_tx_linux_mutex);\ + sem_post(p);\ + tx_linux_mutex_unlock(_tx_linux_mutex) +#define tx_linux_sem_post_nolock(p) sem_post(p) +#define tx_linux_sem_wait(p) sem_wait(p) + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation * ThreadX Linux/gcc Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +/* Define externals for the Linux port of ThreadX. */ + +extern pthread_mutex_t _tx_linux_mutex; +extern sem_t _tx_linux_semaphore; +extern sem_t _tx_linux_semaphore_no_idle; +extern ULONG _tx_linux_global_int_disabled_flag; +extern struct timespec _tx_linux_time_stamp; +extern __thread int _tx_linux_threadx_thread; + +/* Define functions for linux thread. */ +void _tx_linux_thread_suspend(pthread_t thread_id); +void _tx_linux_thread_resume(pthread_t thread_id); +void _tx_linux_thread_init(); + +#ifndef TX_LINUX_MEMORY_SIZE +#define TX_LINUX_MEMORY_SIZE 64000 +#endif + +#define TX_TIMER_TICKS_PER_SECOND 100UL + +/* Define priorities of pthreads. */ + +#define TX_LINUX_PRIORITY_SCHEDULE (3) +#define TX_LINUX_PRIORITY_ISR (2) +#define TX_LINUX_PRIORITY_USER_THREAD (1) + +#endif + diff --git a/ports/linux/gnu/readme_threadx.txt b/ports/linux/gnu/readme_threadx.txt new file mode 100644 index 00000000..5fdd6c3f --- /dev/null +++ b/ports/linux/gnu/readme_threadx.txt @@ -0,0 +1,155 @@ + Microsoft's Azure RTOS ThreadX for Linux + + Using the GNU GCC Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. The following command retrieves and installs GCC +multilib on a Ubuntu system: + +sudo apt-get install gcc-multilib + +At this point you may run the GNU make command to build the ThreadX core +library. This will build the ThreadX run-time environment in the +"example_build" directory. + + make tx.a + +you should now observe the compilation of the ThreadX library source. At the +end of the make, they are all combined into the run-time library file: tx.a. +This file must be linked with your application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the GNU make command while +inside the "example_build" directory. + + make sample_threadx + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file DEMO is a binary file +that can be executed. + + +3. System Initialization + +The system entry point is at main(), which is defined in the application. +Once the application calls tx_kernel_enter, ThreadX starts running and +performs various initialization duties prior to starting the scheduler. The +Linux-specific initialization is done in the function _tx_initialize_low_level, +which is located in the file tx_initialize_low_level.c. This function is +responsible for setting up various system data structures and simulated +interrupts - including the periodic timer interrupt source for ThreadX. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application. In Linux, this is basically done +by using malloc to get a big block of memory from Linux. + + +4. Linux Implementation + +ThreadX for Linux is implemented using POSIX pthreads. Each application +thread in ThreadX actually runs as a Linux pthread. The determination of +which application thread to run is made by the ThreadX scheduler, which +itself is a Linux pthread. The ThreadX scheduler is the highest priority +thread in the system. + +Interrupts in ThreadX/Linux are also simulated by pthreads. A good example +is the ThreadX system timer interrupt, which can be found in +tx_initialize_low_level.c. + +ThreadX for linux utilizes the API pthread_setschedparam() which requires +the ThreadX application running with privilege. The following command is used +to run a ThreadX application: + +./sample_threadx + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the makefile to +enable all compiler optimizations. In addition, you can eliminate the +ThreadX basic API error checking by compiling your application code with the +symbol TX_DISABLE_ERROR_CHECKING defined. + + +6. Interrupt Handling + +ThreadX provides simulated interrupt handling with Linux pthreads. Simulated +interrupt threads may be created by the application or may be added to the +simulated timer interrupt defined in tx_initialize_low_level.c. The following +format for creating simulated interrupts should be used: + +6.1 Data structures + +Here is an example of how to define the Linux data structures and prototypes +necessary to create a simulated interrupt thread: + +pthread_t _sample_linux_interrupt_thread; +void *_sample_linux_interrupt_entry(void *p); + +6.2 Creating a Simulated Interrupt Thread + +Here is an example of how to create a simulated interrupt thread in Linux. +This may be done inside of tx_initialize_low_level.c or from your application code + + +struct sched_param sp; + + /* Create the ISR thread */ + pthread_create(&_sample_linux_interrupt_thread, NULL, _sample_linux_interrupt_entry, &_sample_linux_interrupt_thread); + + /* Set up the ISR priority */ + sp.sched_priority = TX_LINUX_PRIORITY_ISR; + pthread_setschedparam(_sample_linux_interrupt_thread, SCHED_FIFO, &sp); + + + +6.3 Simulated Interrupt Thread Template + +The following is a template for the simulated interrupt thread. This interrupt will occur on +a periodic basis. + +void *_sample_linux_interrupt_entry(void *p) +{ +struct timespec ts; + + while(1) + { + + ts.tv_sec = 0; + ts.tv_nsec = 10000; + while(nanosleep(&ts, &ts)); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + /* Call the real ISR routine */ + _sample_linux_interrupt_isr(); + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + } +} + + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Linux using GNU GCC tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/linux/gnu/src/tx_initialize_low_level.c b/ports/linux/gnu/src/tx_initialize_low_level.c new file mode 100644 index 00000000..f8cd604b --- /dev/null +++ b/ports/linux/gnu/src/tx_initialize_low_level.c @@ -0,0 +1,443 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include +#include +#include +#include +#include +#include + + +/* Define various Linux objects used by the ThreadX port. */ + +pthread_mutex_t _tx_linux_mutex; +sem_t _tx_linux_semaphore; +sem_t _tx_linux_semaphore_no_idle; +ULONG _tx_linux_global_int_disabled_flag; +struct timespec _tx_linux_time_stamp; +__thread int _tx_linux_threadx_thread = 0; + +/* Define signals for linux thread. */ +#define SUSPEND_SIG SIGUSR1 +#define RESUME_SIG SIGUSR2 + +static sigset_t _tx_linux_thread_wait_mask; +static __thread int _tx_linux_thread_suspended; +static sem_t _tx_linux_thread_timer_wait; +static sem_t _tx_linux_thread_other_wait; + +/* Define simulated timer interrupt. This is done inside a thread, which is + how other interrupts may be defined as well. See code below for an + example. */ + +pthread_t _tx_linux_timer_id; +sem_t _tx_linux_timer_semaphore; +sem_t _tx_linux_isr_semaphore; +void *_tx_linux_timer_interrupt(void *p); + + +#ifdef TX_LINUX_DEBUG_ENABLE + +extern ULONG _tx_thread_system_state; +extern UINT _tx_thread_preempt_disable; +extern TX_THREAD *_tx_thread_current_ptr; +extern TX_THREAD *_tx_thread_execute_ptr; + + +/* Define debug log in order to debug Linux issues with this port. */ + +typedef struct TX_LINUX_DEBUG_ENTRY_STRUCT +{ + char *tx_linux_debug_entry_action; + struct timespec tx_linux_debug_entry_timestamp; + char *tx_linux_debug_entry_file; + unsigned long tx_linux_debug_entry_line; + pthread_mutex_t tx_linux_debug_entry_mutex; + unsigned long tx_linux_debug_entry_int_disabled_flag; + ULONG tx_linux_debug_entry_system_state; + UINT tx_linux_debug_entry_preempt_disable; + TX_THREAD *tx_linux_debug_entry_current_thread; + TX_THREAD *tx_linux_debug_entry_execute_thread; +} TX_LINUX_DEBUG_ENTRY; + + +/* Define the maximum size of the Linux debug array. */ + +#ifndef TX_LINUX_DEBUG_EVENT_SIZE +#define TX_LINUX_DEBUG_EVENT_SIZE 400 +#endif + + +/* Define the circular array of Linux debug entries. */ + +TX_LINUX_DEBUG_ENTRY _tx_linux_debug_entry_array[TX_LINUX_DEBUG_EVENT_SIZE]; + + +/* Define the Linux debug index. */ + +unsigned long _tx_linux_debug_entry_index = 0; + + +/* Now define the debug entry function. */ +void _tx_linux_debug_entry_insert(char *action, char *file, unsigned long line) +{ + +pthread_mutex_t temp_copy; + + /* Save the current critical section value. */ + temp_copy = _tx_linux_mutex; + + /* Lock mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Get the time stamp. */ + clock_gettime(CLOCK_REALTIME, &_tx_linux_time_stamp); + + /* Setup the debub entry. */ + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_action = action; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_timestamp = _tx_linux_time_stamp; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_file = file; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_line = line; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_mutex = temp_copy; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_int_disabled_flag = _tx_linux_global_int_disabled_flag; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_system_state = _tx_thread_system_state; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_preempt_disable = _tx_thread_preempt_disable; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_current_thread = _tx_thread_current_ptr; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_execute_thread = _tx_thread_execute_ptr; + + /* Now move to the next entry. */ + _tx_linux_debug_entry_index++; + + /* Determine if we need to wrap the list. */ + if (_tx_linux_debug_entry_index >= TX_LINUX_DEBUG_EVENT_SIZE) + { + + /* Yes, wrap the list! */ + _tx_linux_debug_entry_index = 0; + } + + /* Unlock mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); +} + +#endif + + +/* Define the ThreadX timer interrupt handler. */ + +void _tx_timer_interrupt(void); + + +/* Define other external function references. */ + +VOID _tx_initialize_low_level(VOID); +VOID _tx_thread_context_save(VOID); +VOID _tx_thread_context_restore(VOID); + + +/* Define other external variable references. */ + +extern VOID *_tx_initialize_unused_memory; + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* sched_setaffinity */ +/* getpid */ +/* _tx_linux_thread_init */ +/* pthread_setschedparam */ +/* pthread_mutexattr_init */ +/* pthread_mutex_init */ +/* _tx_linux_thread_suspend */ +/* sem_init */ +/* pthread_create */ +/* printf */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_initialize_low_level(VOID) +{ +struct sched_param sp; +pthread_mutexattr_t attr; + +#ifdef TX_LINUX_MULTI_CORE +cpu_set_t mask; + + sched_getaffinity(getpid(), sizeof(mask), &mask); + if (CPU_COUNT(&mask) > 1) + { + + srand((ULONG)pthread_self()); + + /* Limit this ThreadX simulation on Linux to a single core. */ + CPU_ZERO(&mask); + CPU_SET(rand() % get_nprocs(), &mask); + if (sched_setaffinity(getpid(), sizeof(mask), &mask) != 0) + { + + /* Error restricting the process to one core. */ + printf("ThreadX Linux error restricting the process to one core!\n"); + while(1) + { + } + } + } +#endif + + /* Pickup the first available memory address. */ + + /* Save the first available memory address. */ + _tx_initialize_unused_memory = malloc(TX_LINUX_MEMORY_SIZE); + + /* Init Linux thread. */ + _tx_linux_thread_init(); + + /* Set priority and schedual of main thread. */ + sp.sched_priority = TX_LINUX_PRIORITY_SCHEDULE; + pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp); + + /* Create the system critical section. This is used by the + scheduler thread (which is the main thread) to block all + other stuff out. */ + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_tx_linux_mutex, &attr); + sem_init(&_tx_linux_semaphore, 0, 0); +#ifdef TX_LINUX_NO_IDLE_ENABLE + sem_init(&_tx_linux_semaphore_no_idle, 0, 0); +#endif /* TX_LINUX_NO_IDLE_ENABLE */ + + /* Initialize the global interrupt disabled flag. */ + _tx_linux_global_int_disabled_flag = TX_FALSE; + + /* Create semaphore for timer thread. */ + sem_init(&_tx_linux_timer_semaphore, 0, 0); + + /* Create semaphore for ISR thread. */ + sem_init(&_tx_linux_isr_semaphore, 0, 0); + + /* Setup periodic timer interrupt. */ + if(pthread_create(&_tx_linux_timer_id, NULL, _tx_linux_timer_interrupt, NULL)) + { + + /* Error creating the timer interrupt. */ + printf("ThreadX Linux error creating timer interrupt thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. Now set the priority to + a level lower than the system thread but higher than the application + threads. */ + sp.sched_priority = TX_LINUX_PRIORITY_ISR; + pthread_setschedparam(_tx_linux_timer_id, SCHED_FIFO, &sp); + + /* Done, return to caller. */ +} + + +/* This routine is called after initialization is complete in order to start + all interrupt threads. Interrupt threads in addition to the timer may + be added to this routine as well. */ + +void _tx_initialize_start_interrupts(void) +{ + + /* Kick the timer thread off to generate the ThreadX periodic interrupt + source. */ + tx_linux_sem_post(&_tx_linux_timer_semaphore); +} + + +/* Define the ThreadX system timer interrupt. Other interrupts may be simulated + in a similar way. */ + +void *_tx_linux_timer_interrupt(void *p) +{ +struct timespec ts; +long timer_periodic_nsec; +int err; + + /* Calculate periodic timer. */ + timer_periodic_nsec = 1000000000 / TX_TIMER_TICKS_PER_SECOND; + nice(10); + + /* Wait startup semaphore. */ + tx_linux_sem_wait(&_tx_linux_timer_semaphore); + + while(1) + { + + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += timer_periodic_nsec; + if (ts.tv_nsec > 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec++; + } + do + { + if (sem_timedwait(&_tx_linux_timer_semaphore, &ts) == 0) + { + break; + } + err = errno; + } while (err != ETIMEDOUT); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + /* Call trace ISR enter event insert. */ + _tx_trace_isr_enter_insert(0); + + /* Call the ThreadX system timer interrupt processing. */ + _tx_timer_interrupt(); + + /* Call trace ISR exit event insert. */ + _tx_trace_isr_exit_insert(0); + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + +#ifdef TX_LINUX_NO_IDLE_ENABLE + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_semaphore_no_idle)); + + /* Wakeup the system thread by setting the system semaphore. */ + tx_linux_sem_post(&_tx_linux_semaphore_no_idle); + + tx_linux_mutex_unlock(_tx_linux_mutex); +#endif /* TX_LINUX_NO_IDLE_ENABLE */ + } +} + +/* Define functions for linux thread. */ +void _tx_linux_thread_resume_handler(int sig) +{ +} + +void _tx_linux_thread_suspend_handler(int sig) +{ + if(pthread_equal(pthread_self(), _tx_linux_timer_id)) + tx_linux_sem_post_nolock(&_tx_linux_thread_timer_wait); + else + tx_linux_sem_post_nolock(&_tx_linux_thread_other_wait); + + if(_tx_linux_thread_suspended) + return; + + _tx_linux_thread_suspended = 1; + sigsuspend(&_tx_linux_thread_wait_mask); + _tx_linux_thread_suspended = 0; +} + +void _tx_linux_thread_suspend(pthread_t thread_id) +{ + + /* Send signal. */ + tx_linux_mutex_lock(_tx_linux_mutex); + pthread_kill(thread_id, SUSPEND_SIG); + tx_linux_mutex_unlock(_tx_linux_mutex); + + /* Wait until signal is received. */ + if(pthread_equal(thread_id, _tx_linux_timer_id)) + tx_linux_sem_wait(&_tx_linux_thread_timer_wait); + else + tx_linux_sem_wait(&_tx_linux_thread_other_wait); +} + +void _tx_linux_thread_resume(pthread_t thread_id) +{ + + /* Send signal. */ + tx_linux_mutex_lock(_tx_linux_mutex); + pthread_kill(thread_id, RESUME_SIG); + tx_linux_mutex_unlock(_tx_linux_mutex); +} + +void _tx_linux_thread_init() +{ +struct sigaction sa; + + /* Create semaphore for linux thread. */ + sem_init(&_tx_linux_thread_timer_wait, 0, 0); + sem_init(&_tx_linux_thread_other_wait, 0, 0); + + sigfillset(&_tx_linux_thread_wait_mask); + sigdelset(&_tx_linux_thread_wait_mask, RESUME_SIG); + + sigfillset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = _tx_linux_thread_resume_handler; + sigaction(RESUME_SIG, &sa, NULL); + + sa.sa_handler = _tx_linux_thread_suspend_handler; + sigaction(SUSPEND_SIG, &sa, NULL); +} + + diff --git a/ports/linux/gnu/src/tx_thread_context_restore.c b/ports/linux/gnu/src/tx_thread_context_restore.c new file mode 100644 index 00000000..ab24759e --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_context_restore.c @@ -0,0 +1,163 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + +extern sem_t _tx_linux_isr_semaphore; +UINT _tx_linux_timer_waiting = 0; +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* sem_trywait */ +/* tx_linux_sem_post */ +/* tx_linux_sem_wait */ +/* _tx_linux_thread_resume */ +/* tx_linux_mutex_recursive_unlock */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_restore(VOID) +{ + + /* Debug entry. */ + _tx_linux_debug_entry_insert("CONTEXT_RESTORE", __FILE__, __LINE__); + + /* Lock mutex to ensure other threads are not playing with + the core ThreadX data structures. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Decrement the nested interrupt count. */ + _tx_thread_system_state--; + + /* Determine if this is the first nested interrupt and if a ThreadX + application thread was running at the time. */ + if ((!_tx_thread_system_state) && (_tx_thread_current_ptr)) + { + + /* Yes, this is the first and last interrupt processed. */ + + /* Check to see if preemption is required. */ + if ((_tx_thread_preempt_disable == 0) && (_tx_thread_current_ptr != _tx_thread_execute_ptr)) + { + + /* Preempt the running application thread. We don't need to suspend the + application thread since that is done in the context save processing. */ + + /* Indicate that this thread was suspended asynchronously. */ + _tx_thread_current_ptr -> tx_thread_linux_suspension_type = 1; + + /* Save the remaining time-slice and disable it. */ + if (_tx_timer_time_slice) + { + + _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Clear the current thread pointer. */ + _tx_thread_current_ptr = TX_NULL; + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_semaphore)); + + /* Indicate it is in timer ISR. */ + _tx_linux_timer_waiting = 1; + + /* Wakeup the system thread by setting the system semaphore. */ + tx_linux_sem_post(&_tx_linux_semaphore); + + if(_tx_thread_execute_ptr) + { + if(_tx_thread_execute_ptr -> tx_thread_linux_suspension_type == 0) + { + + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + + /* Wait until TX_THREAD start running. */ + tx_linux_sem_wait(&_tx_linux_isr_semaphore); + + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_isr_semaphore)); + } + } + + /* Indicate it is not in timer ISR. */ + _tx_linux_timer_waiting = 0; + } + else + { + + /* Since preemption is not required, resume the interrupted thread. */ + _tx_linux_thread_resume(_tx_thread_current_ptr -> tx_thread_linux_thread_id); + } + } + + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); +} + diff --git a/ports/linux/gnu/src/tx_thread_context_save.c b/ports/linux/gnu/src/tx_thread_context_save.c new file mode 100644 index 00000000..d2b54b23 --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_context_save.c @@ -0,0 +1,107 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* _tx_linux_thread_suspend */ +/* tx_linux_mutex_unlock */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_save(VOID) +{ + + /* Debug entry. */ + _tx_linux_debug_entry_insert("CONTEXT_SAVE", __FILE__, __LINE__); + + /* Lock mutex to ensure other threads are not playing with + the core ThreadX data structures. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* If an application thread is running, suspend it to simulate preemption. */ + if ((_tx_thread_current_ptr) && (_tx_thread_system_state == 0)) + { + + /* Debug entry. */ + _tx_linux_debug_entry_insert("CONTEXT_SAVE-suspend_thread", __FILE__, __LINE__); + + /* Yes, this is the first interrupt and an application thread is running... + suspend it! */ + _tx_linux_thread_suspend(_tx_thread_current_ptr -> tx_thread_linux_thread_id); + + /* Indicate that this thread was suspended asynchronously. */ + _tx_thread_current_ptr -> tx_thread_linux_suspension_type = 1; + } + + /* Increment the nested interrupt condition. */ + _tx_thread_system_state++; + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); +} + diff --git a/ports/linux/gnu/src/tx_thread_interrupt_control.c b/ports/linux/gnu/src/tx_thread_interrupt_control.c new file mode 100644 index 00000000..ea75e19f --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_interrupt_control.c @@ -0,0 +1,183 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + +/* Define small routines used for the TX_DISABLE/TX_RESTORE macros. */ + +UINT _tx_thread_interrupt_disable(void) +{ + +UINT previous_value; + + + previous_value = _tx_thread_interrupt_control(TX_INT_DISABLE); + return(previous_value); +} + + +VOID _tx_thread_interrupt_restore(UINT previous_posture) +{ + + previous_posture = _tx_thread_interrupt_control(previous_posture); +} + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* tx_linux_mutex_lock */ +/* pthread_self */ +/* pthread_getschedparam */ +/* tx_linux_mutex_recursive_unlock */ +/* pthread_exit */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +UINT _tx_thread_interrupt_control(UINT new_posture) +{ + +UINT old_posture; +TX_THREAD *thread_ptr; +pthread_t thread_id; +int exit_code = 0; + + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Pickup the id of the current thread. */ + thread_id = pthread_self(); + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread and it does not + match the current thread pointer. */ + if ((_tx_linux_threadx_thread) && + ((!thread_ptr) || (!pthread_equal(thread_ptr -> tx_thread_linux_thread_id, thread_id)))) + { + + /* This indicates the Linux thread was actually terminated by ThreadX is only + being allowed to run in order to cleanup its resources. */ + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + pthread_exit((void *)&exit_code); + } + + /* Determine the current interrupt lockout condition. */ + if (tx_linux_mutex_recursive_count == 1) + { + + /* Interrupts are enabled. */ + old_posture = TX_INT_ENABLE; + } + else + { + + /* Interrupts are disabled. */ + old_posture = TX_INT_DISABLE; + } + + /* First, determine if this call is from a non-thread. */ + if (_tx_thread_system_state) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_linux_global_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_linux_global_int_disabled_flag = TX_TRUE; + } + } + else if (thread_ptr) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_linux_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_linux_int_disabled_flag = TX_TRUE; + } + } + + /* Return the previous interrupt disable posture. */ + return(old_posture); +} + diff --git a/ports/linux/gnu/src/tx_thread_schedule.c b/ports/linux/gnu/src/tx_thread_schedule.c new file mode 100644 index 00000000..7843a3ec --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_schedule.c @@ -0,0 +1,264 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +#include +#include + +extern sem_t _tx_linux_timer_semaphore; +extern sem_t _tx_linux_isr_semaphore; +extern UINT _tx_linux_timer_waiting; +extern pthread_t _tx_linux_timer_id; +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* tx_linux_mutex_lock */ +/* tx_linux_mutex_unlock */ +/* _tx_linux_debug_entry_insert */ +/* _tx_linux_thread_resume */ +/* tx_linux_sem_post */ +/* sem_trywait */ +/* tx_linux_sem_wait */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_schedule(VOID) +{ +struct timespec ts; + + /* Set timer. */ + ts.tv_sec = 0; + ts.tv_nsec = 200000; + + /* Loop forever. */ + while(1) + { + + /* Wait for a thread to execute and all ISRs to complete. */ + while(1) + { + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Determine if there is a thread ready to execute AND all ISRs + are complete. */ + if ((_tx_thread_execute_ptr != TX_NULL) && (_tx_thread_system_state == 0)) + { + + /* Get out of this loop and schedule the thread! */ + break; + } + else + { + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); + + /* Don't waste all the processor time here in the master thread... */ +#ifdef TX_LINUX_NO_IDLE_ENABLE + while(!sem_trywait(&_tx_linux_timer_semaphore)); + tx_linux_sem_post(&_tx_linux_timer_semaphore); + /*nanosleep(&ts, &ts);*/ + + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += 200000; + if (ts.tv_nsec > 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec++; + } + sem_timedwait(&_tx_linux_semaphore_no_idle, &ts); +#else + nanosleep(&ts, &ts); +#endif /* TX_LINUX_NO_IDLE_ENABLE */ + } + } + + /* Yes! We have a thread to execute. Note that the critical section is already + active from the scheduling loop above. */ + + /* Setup the current thread pointer. */ + _tx_thread_current_ptr = _tx_thread_execute_ptr; + + /* Increment the run count for this thread. */ + _tx_thread_current_ptr -> tx_thread_run_count++; + + /* Setup time-slice, if present. */ + _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; + + /* Determine how the thread was suspended. */ + if (_tx_thread_current_ptr -> tx_thread_linux_suspension_type) + { + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-resume_thread", __FILE__, __LINE__); + + /* Pseudo interrupt suspension. The thread is not waiting on + its run semaphore. */ + _tx_linux_thread_resume(_tx_thread_current_ptr -> tx_thread_linux_thread_id); + } + else + { + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-release_sem", __FILE__, __LINE__); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_thread_current_ptr -> tx_thread_linux_thread_run_semaphore)); + + /* Let the thread run again by releasing its run semaphore. */ + tx_linux_sem_post(&_tx_thread_current_ptr -> tx_thread_linux_thread_run_semaphore); + + /* Block timer ISR. */ + if(_tx_linux_timer_waiting) + { + + /* It is woken up by timer ISR. */ + /* Let ThreadX thread wake up first. */ + tx_linux_sem_wait(&_tx_linux_semaphore); + + /* Wake up timer ISR. */ + tx_linux_sem_post_nolock(&_tx_linux_isr_semaphore); + } + else + { + + /* It is woken up by TX_THREAD. */ + /* Suspend timer thread and let ThreadX thread wake up first. */ + _tx_linux_thread_suspend(_tx_linux_timer_id); + tx_linux_sem_wait(&_tx_linux_semaphore); + _tx_linux_thread_resume(_tx_linux_timer_id); + + } + } + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-self_suspend_sem", __FILE__, __LINE__); + + /* Now suspend the main thread so the application thread can run. */ + tx_linux_sem_wait(&_tx_linux_semaphore); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-wake_up", __FILE__, __LINE__); + + } +} + +void _tx_thread_delete_port_completion(TX_THREAD *thread_ptr, UINT tx_saved_posture) +{ +INT linux_status; +sem_t *threadrunsemaphore; +pthread_t thread_id; +struct timespec ts; + + thread_id = thread_ptr -> tx_thread_linux_thread_id; + threadrunsemaphore = &(thread_ptr -> tx_thread_linux_thread_run_semaphore); + ts.tv_sec = 0; + ts.tv_nsec = 1000000; + TX_RESTORE + do + { + linux_status = pthread_cancel(thread_id); + if(linux_status != EAGAIN) + { + break; + } + _tx_linux_thread_resume(thread_id); + tx_linux_sem_post(threadrunsemaphore); + nanosleep(&ts, &ts); + } while (1); + pthread_join(thread_id, NULL); + sem_destroy(threadrunsemaphore); + TX_DISABLE +} + +void _tx_thread_reset_port_completion(TX_THREAD *thread_ptr, UINT tx_saved_posture) +{ +INT linux_status; +sem_t *threadrunsemaphore; +pthread_t thread_id; +struct timespec ts; + + thread_id = thread_ptr -> tx_thread_linux_thread_id; + threadrunsemaphore = &(thread_ptr -> tx_thread_linux_thread_run_semaphore); + ts.tv_sec = 0; + ts.tv_nsec = 1000000; + TX_RESTORE + do + { + linux_status = pthread_cancel(thread_id); + if(linux_status != EAGAIN) + { + break; + } + _tx_linux_thread_resume(thread_id); + tx_linux_sem_post(threadrunsemaphore); + nanosleep(&ts, &ts); + } while (1); + pthread_join(thread_id, NULL); + sem_destroy(threadrunsemaphore); + TX_DISABLE +} diff --git a/ports/linux/gnu/src/tx_thread_stack_build.c b/ports/linux/gnu/src/tx_thread_stack_build.c new file mode 100644 index 00000000..b18ae2fb --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_stack_build.c @@ -0,0 +1,153 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include +#include + + +/* Prototype for new thread entry function. */ + +void *_tx_linux_thread_entry(void *ptr); + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* pthread_create */ +/* pthread_setschedparam */ +/* _tx_linux_thread_suspend */ +/* sem_init */ +/* printf */ +/* _tx_linux_thread_resume */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* _tx_thread_reset Reset thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +{ +struct sched_param sp; + + /* Create the run semaphore for the thread. This will allow the scheduler + control over when the thread actually runs. */ + if(sem_init(&thread_ptr -> tx_thread_linux_thread_run_semaphore, 0, 0)) + { + + /* Display an error message. */ + printf("ThreadX Linux error creating thread running semaphore!\n"); + while(1) + { + } + } + + /* Create a Linux thread for the application thread. */ + if(pthread_create(&thread_ptr -> tx_thread_linux_thread_id, NULL, _tx_linux_thread_entry, thread_ptr)) + { + + /* Display an error message. */ + printf("ThreadX Linux error creating thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. */ + sp.sched_priority = TX_LINUX_PRIORITY_USER_THREAD; + pthread_setschedparam(thread_ptr -> tx_thread_linux_thread_id, SCHED_FIFO, &sp); + + /* Setup the thread suspension type to solicited thread suspension. + Pseudo interrupt handlers will suspend with this field set to 1. */ + thread_ptr -> tx_thread_linux_suspension_type = 0; + + /* Clear the disabled count that will keep track of the + tx_interrupt_control nesting. */ + thread_ptr -> tx_thread_linux_int_disabled_flag = 0; + + /* Setup a fake thread stack pointer. */ + thread_ptr -> tx_thread_stack_ptr = (VOID *) (((CHAR *) thread_ptr -> tx_thread_stack_end) - 8); + + /* Clear the first word of the stack. */ + *(((ULONG *) thread_ptr -> tx_thread_stack_ptr) - 1) = 0; +} + + +void *_tx_linux_thread_entry(void *ptr) +{ + +TX_THREAD *thread_ptr; + + /* Pickup the current thread pointer. */ + thread_ptr = (TX_THREAD *) ptr; + _tx_linux_threadx_thread = 1; + nice(20); + + /* Now suspend the thread initially. If the thread has already + been scheduled, this will return immediately. */ + tx_linux_sem_wait(&thread_ptr -> tx_thread_linux_thread_run_semaphore); + tx_linux_sem_post_nolock(&_tx_linux_semaphore); + + /* Call ThreadX thread entry point. */ + _tx_thread_shell_entry(); + + return EXIT_SUCCESS; +} + diff --git a/ports/linux/gnu/src/tx_thread_system_return.c b/ports/linux/gnu/src/tx_thread_system_return.c new file mode 100644 index 00000000..9ee68d0d --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_system_return.c @@ -0,0 +1,207 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +#include + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the system. Only a minimal context */ +/* is saved since the compiler assumes temp registers are going to get */ +/* slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* pthread_self */ +/* pthread_getschedparam */ +/* pthread_equal */ +/* tx_linux_mutex_recursive_unlock */ +/* tx_linux_mutex_unlock */ +/* pthread_exit */ +/* tx_linux_sem_post */ +/* sem_trywait */ +/* tx_linux_sem_wait */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_system_return(VOID) +{ + +TX_THREAD *temp_thread_ptr; +sem_t *temp_run_semaphore; +UINT temp_thread_state; +pthread_t thread_id; +int exit_code = 0; + + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN", __FILE__, __LINE__); + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* First, determine if the thread was terminated. */ + + /* Pickup the id of the current thread. */ + thread_id = pthread_self(); + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread (0) and it does not + match the current thread pointer. */ + if ((_tx_linux_threadx_thread) && + ((!temp_thread_ptr) || (!pthread_equal(temp_thread_ptr -> tx_thread_linux_thread_id, thread_id)))) + { + + /* This indicates the Linux thread was actually terminated by ThreadX is only + being allowed to run in order to cleanup its resources. */ + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + pthread_exit((void *)&exit_code); + } + + /* Determine if the time-slice is active. */ + if (_tx_timer_time_slice) + { + + /* Preserve current remaining time-slice for the thread and clear the current time-slice. */ + temp_thread_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Save the run semaphore into a temporary variable as well. */ + temp_run_semaphore = &temp_thread_ptr -> tx_thread_linux_thread_run_semaphore; + + /* Pickup the current thread state. */ + temp_thread_state = temp_thread_ptr -> tx_thread_state; + + /* Setup the suspension type for this thread. */ + temp_thread_ptr -> tx_thread_linux_suspension_type = 0; + + /* Set the current thread pointer to NULL. */ + _tx_thread_current_ptr = TX_NULL; + + /* Unlock Linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN-release_sem", __FILE__, __LINE__); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_semaphore)); + + /* Release the semaphore that the main scheduling thread is waiting + on. Note that the main scheduling algorithm will take care of + setting the current thread pointer to NULL. */ + tx_linux_sem_post(&_tx_linux_semaphore); + + /* Determine if the thread was self-terminating. */ + if (temp_thread_state == TX_TERMINATED) + { + + /* Exit the thread instead of waiting on the semaphore! */ + pthread_exit((void *)&exit_code); + } + + /* Wait on the run semaphore for this thread. This won't get set again + until the thread is scheduled. */ + tx_linux_sem_wait(temp_run_semaphore); + tx_linux_sem_post_nolock(&_tx_linux_semaphore); + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN-wake_up", __FILE__, __LINE__); + + /* Determine if the thread was terminated. */ + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread and it does not + match the current thread pointer. */ + if ((_tx_linux_threadx_thread) && + ((!temp_thread_ptr) || (!pthread_equal(temp_thread_ptr -> tx_thread_linux_thread_id, thread_id)))) + { + + /* Unlock Linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + + /* This indicates the Linux thread was actually terminated by ThreadX and is only + being allowed to run in order to cleanup its resources. */ + pthread_exit((void *)&exit_code); + } + + /* Now determine if the application thread last had interrupts disabled. */ + + /* Determine if this thread had interrupts disabled. */ + if (!_tx_thread_current_ptr -> tx_thread_linux_int_disabled_flag) + { + + /* Unlock Linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + } + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN-finish", __FILE__, __LINE__); +} + diff --git a/ports/linux/gnu/src/tx_timer_interrupt.c b/ports/linux/gnu/src/tx_timer_interrupt.c new file mode 100644 index 00000000..55207c14 --- /dev/null +++ b/ports/linux/gnu/src/tx_timer_interrupt.c @@ -0,0 +1,153 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_timer.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* tx_linux_mutex_unlock */ +/* _tx_timer_expiration_process */ +/* _tx_thread_time_slice */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_timer_interrupt(VOID) +{ + + /* Debug entry. */ + _tx_linux_debug_entry_insert("TIMER INTERRUPT", __FILE__, __LINE__); + + /* Lock mutex to ensure other threads are not playing with + the core ThreadX data structures. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Increment the system clock. */ + _tx_timer_system_clock++; + + /* Test for time-slice expiration. */ + if (_tx_timer_time_slice) + { + + /* Decrement the time_slice. */ + _tx_timer_time_slice--; + + /* Check for expiration. */ + if (_tx_timer_time_slice == 0) + { + + /* Set the time-slice expired flag. */ + _tx_timer_expired_time_slice = TX_TRUE; + } + } + + /* Test for timer expiration. */ + if (*_tx_timer_current_ptr) + { + + /* Set expiration flag. */ + _tx_timer_expired = TX_TRUE; + } + else + { + + /* No timer expired, increment the timer pointer. */ + _tx_timer_current_ptr++; + + /* Check for wrap-around. */ + if (_tx_timer_current_ptr == _tx_timer_list_end) + { + + /* Wrap to beginning of list. */ + _tx_timer_current_ptr = _tx_timer_list_start; + } + } + + /* See if anything has expired. */ + if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) + { + + /* Did a timer expire? */ + if (_tx_timer_expired) + { + + /* Process timer expiration. */ + _tx_timer_expiration_process(); + } + + /* Did time slice expire? */ + if (_tx_timer_expired_time_slice) + { + + /* Time slice interrupted thread. */ + _tx_thread_time_slice(); + } + } + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); +} + diff --git a/ports/win32/vs_2019/example_build/azure_rtos.sln b/ports/win32/vs_2019/example_build/azure_rtos.sln new file mode 100644 index 00000000..fb6be8b5 --- /dev/null +++ b/ports/win32/vs_2019/example_build/azure_rtos.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30204.135 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_threadx", "sample_threadx\sample_threadx.vcxproj", "{7342DEEF-AB3F-00D5-9EDB-2829CD277B76}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tx", "tx\tx.vcxproj", "{51907112-62DA-98D6-7897-5A2FD48B99C3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + Template|Win32 = Template|Win32 + Template|x64 = Template|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Debug|Win32.ActiveCfg = Debug|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Debug|Win32.Build.0 = Debug|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Debug|x64.ActiveCfg = Debug|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Release|Win32.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Release|Win32.Build.0 = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Release|x64.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|Win32.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|Win32.Build.0 = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|x64.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|x64.Build.0 = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Debug|Win32.ActiveCfg = Debug|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Debug|Win32.Build.0 = Debug|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Debug|x64.ActiveCfg = Debug|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Release|Win32.ActiveCfg = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Release|Win32.Build.0 = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Release|x64.ActiveCfg = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Template|Win32.ActiveCfg = Template|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Template|Win32.Build.0 = Template|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Template|x64.ActiveCfg = Template|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FAE0BBF6-14F8-4320-AAB9-65E1361EB38A} + EndGlobalSection +EndGlobal diff --git a/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..46d2aff4 --- /dev/null +++ b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,381 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Print results. */ + printf("**** ThreadX Win32 Demonstration **** (c) 1996-2020 Microsoft Corporation\n\n"); + printf(" thread 0 events sent: %lu\n", thread_0_counter); + printf(" thread 1 messages sent: %lu\n", thread_1_counter); + printf(" thread 2 messages received: %lu\n", thread_2_counter); + printf(" thread 3 obtained semaphore: %lu\n", thread_3_counter); + printf(" thread 4 obtained semaphore: %lu\n", thread_4_counter); + printf(" thread 5 events received: %lu\n", thread_5_counter); + printf(" thread 6 mutex obtained: %lu\n", thread_6_counter); + printf(" thread 7 mutex obtained: %lu\n\n", thread_7_counter); + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj new file mode 100644 index 00000000..dbb6c98b --- /dev/null +++ b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76} + 10.0 + + + + Application + false + MultiByte + v142 + + + Application + false + MultiByte + v142 + + + + + + + + + + + + + + + .\Debug\ + .\Debug\ + false + + + .\Release\ + .\Release\ + false + + + + MultiThreadedDebug + Default + true + Disabled + true + Level3 + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + .\Debug\ + .\Debug\sample_threadx.pch + .\Debug\ + .\Debug\ + EnableFastChecks + ..\..\inc;..\..\..\..\..\common\inc + false + false + + + .\Debug\sample_threadx.tlb + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\sample_threadx.bsc + + + true + true + Console + .\Debug\sample_threadx.exe + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + MultiThreaded + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + .\Release\ + .\Release\sample_threadx.pch + .\Release\ + .\Release\ + ../../../generic + false + + + .\Release\sample_threadx.tlb + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\sample_threadx.bsc + + + true + Console + .\Release\sample_threadx.exe + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters new file mode 100644 index 00000000..457cd446 --- /dev/null +++ b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters @@ -0,0 +1,29 @@ + + + + + {6006269e-f4d4-4e46-be11-4a87e3703f4b} + h;hpp;hxx;hm;inl + + + {92d04b48-db8b-4511-a4fd-305688bda3d5} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + + + inc + + + inc + + + + + src + + + + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/example_build/tx/tx.vcxproj b/ports/win32/vs_2019/example_build/tx/tx.vcxproj new file mode 100644 index 00000000..827ae65e --- /dev/null +++ b/ports/win32/vs_2019/example_build/tx/tx.vcxproj @@ -0,0 +1,339 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Template + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {51907112-62DA-98D6-7897-5A2FD48B99C3} + 10.0 + + + + Application + v142 + + + StaticLibrary + false + MultiByte + v142 + + + StaticLibrary + false + MultiByte + v142 + + + + + + + + + + + + + + + + + + .\Release\ + .\Release\ + + + .\Debug\ + .\Debug\ + + + + MultiThreaded + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + .\Release\ + .\Release\tx.pch + .\Release\ + .\Release\ + ..\;..\..\..\generic + None + false + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\tx.bsc + + + true + .\Release\tx.lib + + + + + MultiThreadedDebug + Default + true + Disabled + true + Level3 + ProgramDatabase + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + .\Debug\ + .\Debug\tx.pch + .\Debug\ + .\Debug\ + EnableFastChecks + ..\..\inc;..\..\..\..\..\common\inc + false + true + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\tx.bsc + + + true + .\Debug\tx.lib + + + + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters b/ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters new file mode 100644 index 00000000..303c5d5f --- /dev/null +++ b/ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters @@ -0,0 +1,633 @@ + + + + + {096c4605-3053-4040-8f19-1e6fedb9568e} + + + {3786c84c-e250-4a5c-b0a0-2a1d2c8979e3} + + + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/inc/tx_port.h b/ports/win32/vs_2019/inc/tx_port.h new file mode 100644 index 00000000..c5f666f8 --- /dev/null +++ b/ports/win32/vs_2019/inc/tx_port.h @@ -0,0 +1,453 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Win32/Visual */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define performance metric symbols. */ + +#ifndef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO +#define TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO +#define TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO +#define TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_MUTEX_ENABLE_PERFORMANCE_INFO +#define TX_MUTEX_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_QUEUE_ENABLE_PERFORMANCE_INFO +#define TX_QUEUE_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO +#define TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_THREAD_ENABLE_PERFORMANCE_INFO +#define TX_THREAD_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_TIMER_ENABLE_PERFORMANCE_INFO +#define TX_TIMER_ENABLE_PERFORMANCE_INFO +#endif + + +/* Enable trace info. */ + +#ifndef TX_ENABLE_EVENT_TRACE +#define TX_ENABLE_EVENT_TRACE +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Add Win32 debug insert prototype. */ + +void _tx_win32_debug_entry_insert(char *action, char *file, unsigned long line); + +#ifndef TX_WIN32_DEBUG_ENABLE + +/* If Win32 debug is not enabled, turn logging into white-space. */ + +#define _tx_win32_debug_entry_insert(a, b, c) + +#endif + + + +/* Define the TX_MEMSET macro to remove library reference. */ + +#define TX_MEMSET(a,b,c) { \ + UCHAR *ptr; \ + UCHAR value; \ + UINT i, size; \ + ptr = (UCHAR *) ((VOID *) a); \ + value = (UCHAR) b; \ + size = (UINT) c; \ + for (i = 0; i < size; i++) \ + { \ + *ptr++ = value; \ + } \ + } + + +/* Include windows include file. */ + +#include + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 400 /* Default timer thread stack size - Not used in Win32 port! */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ((ULONG) (_tx_win32_time_stamp.LowPart)); +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port-specific trace extension to pickup the Windows timer. */ + +#define TX_TRACE_PORT_EXTENSION QueryPerformanceCounter((LARGE_INTEGER *)&_tx_win32_time_stamp); + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Define the Win32-specific initialization code that is expanded in the generic source. */ + +void _tx_initialize_start_interrupts(void); + +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION _tx_initialize_start_interrupts(); + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 HANDLE tx_thread_win32_thread_handle; \ + DWORD tx_thread_win32_thread_id; \ + HANDLE tx_thread_win32_thread_run_semaphore; \ + UINT tx_thread_win32_suspension_type; \ + UINT tx_thread_win32_int_disabled_flag; +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +struct TX_THREAD_STRUCT; + +/* Define the Win32 critical section data structure. */ + +typedef struct TX_WIN32_CRITICAL_SECTION_STRUCT +{ + HANDLE tx_win32_critical_section_mutex_handle; + DWORD tx_win32_critical_section_owner; + ULONG tx_win32_critical_section_nested_count; +} TX_WIN32_CRITICAL_SECTION; + + +/* Define Win32-specific critical section APIs. */ + +void _tx_win32_critical_section_obtain(TX_WIN32_CRITICAL_SECTION *critical_section); +void _tx_win32_critical_section_release(TX_WIN32_CRITICAL_SECTION *critical_section); +void _tx_win32_critical_section_release_all(TX_WIN32_CRITICAL_SECTION *critical_section); + + +/* Define post completion processing for tx_thread_delete, so that the Win32 thread resources are properly removed. */ + +#define TX_THREAD_DELETE_PORT_COMPLETION(thread_ptr) \ +{ \ +BOOL win32_status; \ +DWORD exitcode; \ +HANDLE threadrunsemaphore; \ +HANDLE threadhandle; \ + threadhandle = thread_ptr -> tx_thread_win32_thread_handle; \ + threadrunsemaphore = thread_ptr -> tx_thread_win32_thread_run_semaphore; \ + _tx_thread_interrupt_restore(tx_saved_posture); \ + do \ + { \ + win32_status = GetExitCodeThread(threadhandle, &exitcode); \ + if ((win32_status) && (exitcode != STILL_ACTIVE)) \ + { \ + break; \ + } \ + ResumeThread(threadhandle); \ + ReleaseSemaphore(threadrunsemaphore, 1, NULL); \ + Sleep(1); \ + } while (1); \ + CloseHandle(threadhandle); \ + tx_saved_posture = _tx_thread_interrupt_disable(); \ +} + + +/* Define post completion processing for tx_thread_reset, so that the Win32 thread resources are properly removed. */ + +#define TX_THREAD_RESET_PORT_COMPLETION(thread_ptr) \ +{ \ +BOOL win32_status; \ +DWORD exitcode; \ +HANDLE threadrunsemaphore; \ +HANDLE threadhandle; \ + threadhandle = thread_ptr -> tx_thread_win32_thread_handle; \ + threadrunsemaphore = thread_ptr -> tx_thread_win32_thread_run_semaphore; \ + _tx_thread_interrupt_restore(tx_saved_posture); \ + do \ + { \ + win32_status = GetExitCodeThread(threadhandle, &exitcode); \ + if ((win32_status) && (exitcode != STILL_ACTIVE)) \ + { \ + break; \ + } \ + ResumeThread(threadhandle); \ + ReleaseSemaphore(threadrunsemaphore, 1, NULL); \ + Sleep(1); \ + } while (1); \ + CloseHandle(threadhandle); \ + tx_saved_posture = _tx_thread_interrupt_disable(); \ +} + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +UINT _tx_thread_interrupt_disable(void); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA UINT tx_saved_posture; + +#define TX_DISABLE tx_saved_posture = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(tx_saved_posture); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Win32/Visual Studio Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +/* Define externals for the Win32 port of ThreadX. */ + +extern TX_WIN32_CRITICAL_SECTION _tx_win32_critical_section; +extern HANDLE _tx_win32_scheduler_semaphore; +extern DWORD _tx_win32_scheduler_id; +extern ULONG _tx_win32_global_int_disabled_flag; +extern LARGE_INTEGER _tx_win32_time_stamp; +extern ULONG _tx_win32_system_error; +extern HANDLE _tx_win32_timer_handle; +extern DWORD _tx_win32_timer_id; +extern LARGE_INTEGER _tx_win32_time_stamp; + + +#ifndef TX_WIN32_MEMORY_SIZE +#define TX_WIN32_MEMORY_SIZE 64000 +#endif + +#ifndef TX_TIMER_PERIODIC +#define TX_TIMER_PERIODIC 18 +#endif + +#endif + + + + diff --git a/ports/win32/vs_2019/readme_threadx.txt b/ports/win32/vs_2019/readme_threadx.txt new file mode 100644 index 00000000..348d1a37 --- /dev/null +++ b/ports/win32/vs_2019/readme_threadx.txt @@ -0,0 +1,155 @@ + Microsoft's Azure RTOS ThreadX for Win32 + + Using the Visual Studio Tools + + +1. Open the ThreadX Project Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace azure_rtos.sln, which is located inside the "example_build" +directory. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply make the "tx" project active and +then select the build button. You should now observe the compilation of the +ThreadX library source. This project build produces the ThreadX library file +tx.lib. + + +3. Building the Demonstration System + +You are now ready to run the ThreadX Win32 demonstration. Simply make the +"sample_thread" project active and then select the build button. When the build +is finished, select the run button from Visual Studio and observe various +demonstration statistics being printed to the console window. You may also set +breakpoints, single step, perform data watches, etc. + + +4. System Initialization + +The system entry point is at main(), which is defined in the application. +Once the application calls tx_kernel_enter, ThreadX starts running and +performs various initialization duties prior to starting the scheduler. The +Win32-specific initialization is done in the function _tx_initialize_low_level, +which is located in the file tx_initialize_low_level.c. This function is +responsible for setting up various system data structures and simulated +interrupts - including the periodic timer interrupt source for ThreadX. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application. In Win32, this is basically done +by using malloc to get a big block of memory from Windows. + + +5. Win32 Implementation + +ThreadX for Win32 is implemented using Win32 threads. Each application +thread in ThreadX actually runs as a Win32 thread. The determination of +which application thread to run is made by the ThreadX scheduler, which +itself is a Win32 thread. The ThreadX scheduler is the highest priority +thread in the system. + +Interrupts in ThreadX/Win32 are also simulated by threads. A good example +is the ThreadX system timer interrupt, which can be found in +tx_initialize_low_level.c. + +5.1 ThreadX Limitations + +ThreadX for Win32 behaves in the same manner as ThreadX in an embedded +environment EXCEPT in the case of thread termination. Unfortunately, the +Win32 API does not have a good mechanism to terminate threads and instead +must rely on the thread itself terminating. Hence, threads in the ThreadX +Win32 implementation must have some ThreadX call periodically in their +processing if they can be terminated by another ThreadX thread. + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the tx project file to +enable all compiler optimizations. In addition, you can eliminate the +ThreadX basic API error checking by compiling your application code with the +symbol TX_DISABLE_ERROR_CHECKING defined. + + +7. Interrupt Handling + +ThreadX provides simulated interrupt handling with Win32 threads. Simulated +interrupt threads may be created by the application or may be added to the +simulated timer interrupt defined in tx_initialize_low_level.c. The following +format for creating simulated interrupts should be used: + +7.1 Data structures + +Here is an example of how to define the Win32 data structures and prototypes +necessary to create a simulated interrupt thread: + +HANDLE _sample_win32_interrupt_handle; +DWORD _sample_win32_interrupt_id; +DWORD WINAPI _sample_win32_interrupt(LPVOID); + + +7.2 Creating a Simulated Interrupt Thread + +Here is an example of how to create a simulated interrupt thread in Win32. +This may be done inside of tx_initialize_low_level.c or from your application code + + _sample_win32_interrupt_handle = + CreateThread(NULL, 0, _sample_win32_interrupt, (LPVOID) &_sample_win32_interrupt_handle, + CREATE_SUSPENDED, &_sample_win32_interrupt_id); + + SetThreadPriority(_sample_win32_interrupt_handle, THREAD_PRIORITY_BELOW_NORMAL); + + +7.3 Activating the Simulated Interrupt Thread + +Simulated interrupt threads should not be activated until initialization is complete, i.e. until +ThreadX is ready to schedule threads. The following activation code may be added to the routine +in tx_initialize_low_level.c called _tx_initialize_start_interrupts or into the application code directly: + + ResumeThread(_sample_win32_interrupt_handle); + + +7.4 Simulated Interrupt Thread Template + +The following is a template for the simulated interrupt thread. This interrupt will occur on +a periodic basis. + +DWORD WINAPI _sample_win32_interrupt(LPVOID *ptr) +{ + + + while(1) + { + + /* Sleep for the desired time. */ + Sleep(18); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + /* Call application ISR here! */ + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + } +} + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version for Win32 using Microsoft Visual C/C++. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/win32/vs_2019/src/tx_initialize_low_level.c b/ports/win32/vs_2019/src/tx_initialize_low_level.c new file mode 100644 index 00000000..f11df9dc --- /dev/null +++ b/ports/win32/vs_2019/src/tx_initialize_low_level.c @@ -0,0 +1,307 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include +#include +#include + + +/* Define various Win32 objects used by the ThreadX port. */ + +TX_WIN32_CRITICAL_SECTION _tx_win32_critical_section; +HANDLE _tx_win32_scheduler_semaphore; +DWORD _tx_win32_scheduler_id; +ULONG _tx_win32_global_int_disabled_flag; +LARGE_INTEGER _tx_win32_time_stamp; +ULONG _tx_win32_system_error; +extern TX_THREAD *_tx_thread_current_ptr; + + +/* Define simulated timer interrupt. This is done inside a thread, which is + how other interrupts may be defined as well. See code below for an + example. */ + +HANDLE _tx_win32_timer_handle; +DWORD _tx_win32_timer_id; +DWORD WINAPI _tx_win32_timer_interrupt(LPVOID p); + + +#ifdef TX_WIN32_DEBUG_ENABLE + +extern ULONG _tx_thread_system_state; +extern UINT _tx_thread_preempt_disable; +extern TX_THREAD *_tx_thread_current_ptr; +extern TX_THREAD *_tx_thread_execute_ptr; + + +/* Define the maximum size of the Win32 debug array. */ + +#ifndef TX_WIN32_DEBUG_EVENT_SIZE +#define TX_WIN32_DEBUG_EVENT_SIZE 400 +#endif + + +/* Define debug log in order to debug Win32 issues with this port. */ + +typedef struct TX_WIN32_DEBUG_ENTRY_STRUCT +{ + char *tx_win32_debug_entry_action; + LARGE_INTEGER tx_win32_debug_entry_timestamp; + char *tx_win32_debug_entry_file; + unsigned long tx_win32_debug_entry_line; + TX_WIN32_CRITICAL_SECTION tx_win32_debug_entry_critical_section; + unsigned long tx_win32_debug_entry_int_disabled_flag; + ULONG tx_win32_debug_entry_system_state; + UINT tx_win32_debug_entry_preempt_disable; + TX_THREAD *tx_win32_debug_entry_current_thread; + DWORD tx_win32_debug_entry_current_thread_id; + TX_THREAD *tx_win32_debug_entry_execute_thread; + DWORD tx_win32_debug_entry_execute_thread_id; + DWORD tx_win32_debug_entry_running_id; +} TX_WIN32_DEBUG_ENTRY; + + +/* Define the circular array of Win32 debug entries. */ + +TX_WIN32_DEBUG_ENTRY _tx_win32_debug_entry_array[TX_WIN32_DEBUG_EVENT_SIZE]; + + +/* Define the Win32 debug index. */ + +unsigned long _tx_win32_debug_entry_index = 0; + + +/* Now define the debug entry function. */ +void _tx_win32_debug_entry_insert(char *action, char *file, unsigned long line) +{ + + + /* Get the time stamp. */ + QueryPerformanceCounter((LARGE_INTEGER *)&_tx_win32_time_stamp); + + /* Setup the debug entry. */ + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_action = action; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_timestamp = _tx_win32_time_stamp; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_file = file; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_line = line; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_critical_section = _tx_win32_critical_section; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_int_disabled_flag = _tx_win32_global_int_disabled_flag; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_system_state = _tx_thread_system_state; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_preempt_disable = _tx_thread_preempt_disable; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_current_thread = _tx_thread_current_ptr; + if (_tx_thread_current_ptr) + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_current_thread_id = _tx_thread_current_ptr -> tx_thread_win32_thread_id; + else + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_current_thread_id = 0; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_execute_thread = _tx_thread_execute_ptr; + if (_tx_thread_execute_ptr) + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_execute_thread_id = _tx_thread_execute_ptr -> tx_thread_win32_thread_id; + else + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_execute_thread_id = 0; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_running_id = GetCurrentThreadId(); + + /* Now move to the next entry. */ + _tx_win32_debug_entry_index++; + + /* Determine if we need to wrap the list. */ + if (_tx_win32_debug_entry_index >= TX_WIN32_DEBUG_EVENT_SIZE) + { + + /* Yes, wrap the list! */ + _tx_win32_debug_entry_index = 0; + } +} + +#endif + + +/* Define the ThreadX timer interrupt handler. */ + +void _tx_timer_interrupt(void); + + +/* Define other external function references. */ + +VOID _tx_initialize_low_level(VOID); +VOID _tx_thread_context_save(VOID); +VOID _tx_thread_context_restore(VOID); + + +/* Define other external variable references. */ + +extern VOID *_tx_initialize_unused_memory; + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* CreateMutex Win32 create mutex */ +/* CreateThread Win32 create thread */ +/* CreateSemaphore Win32 create semaphore */ +/* GetCurrentThreadId Win32 get current thread ID */ +/* SetProcessAffinityMask Win32 process affinity set */ +/* SetThreadPriority Win32 set thread priority */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_initialize_low_level(VOID) +{ + +/* Deprecate TX_WIN32_MULTI_CORE build option and default to restricting + execution to one core. */ + +#ifndef TX_WIN32_BYPASS_AFFINITY_SETUP + + /* Limit this ThreadX simulation on Win32 to a single core. */ + if (SetProcessAffinityMask( GetCurrentProcess(), 1 ) == 0) + { + + /* Error restricting the process to one core. */ + printf("ThreadX Win32 error restricting the process to one core!\n"); + while(1) + { + } + } +#endif + + /* Pickup the first available memory address. */ + + /* Save the first available memory address. */ + _tx_initialize_unused_memory = malloc(TX_WIN32_MEMORY_SIZE); + + /* Pickup the unique Id of the current thread, which will also be the Id of the scheduler. */ + _tx_win32_scheduler_id = GetCurrentThreadId(); + + /* Create the system critical section mutex. This is used by the system to block all other access, + analogous to an interrupt lockout on an embedded target. */ + _tx_win32_critical_section.tx_win32_critical_section_mutex_handle = CreateMutex(NULL, FALSE, NULL); + _tx_win32_critical_section.tx_win32_critical_section_nested_count = 0; + _tx_win32_critical_section.tx_win32_critical_section_owner = 0; + + /* Create the semaphore that regulates when the scheduler executes. */ + _tx_win32_scheduler_semaphore = CreateSemaphore(NULL, 0, 1, NULL); + + /* Initialize the global interrupt disabled flag. */ + _tx_win32_global_int_disabled_flag = TX_FALSE; + + /* Setup periodic timer interrupt. */ + _tx_win32_timer_handle = + CreateThread(NULL, 0, _tx_win32_timer_interrupt, (LPVOID) &_tx_win32_timer_handle,CREATE_SUSPENDED, &_tx_win32_timer_id); + + /* Check for a good thread create. */ + if (!_tx_win32_timer_handle) + { + + /* Error creating the timer interrupt. */ + printf("ThreadX Win32 error creating timer interrupt thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. Now set the priority to + a level lower than the system thread but higher than the application + threads. */ + SetThreadPriority(_tx_win32_timer_handle, THREAD_PRIORITY_BELOW_NORMAL); + + /* Done, return to caller. */ +} + + +/* This routine is called after initialization is complete in order to start + all interrupt threads. Interrupt threads in addition to the timer may + be added to this routine as well. */ + +void _tx_initialize_start_interrupts(void) +{ + + /* Kick the timer thread off to generate the ThreadX periodic interrupt + source. */ + ResumeThread(_tx_win32_timer_handle); +} + + +/* Define the ThreadX system timer interrupt. Other interrupts may be simulated + in a similar way. */ + + +DWORD WINAPI _tx_win32_timer_interrupt(LPVOID p) +{ + + while(1) + { + + /* Sleep for the desired time. */ + Sleep(TX_TIMER_PERIODIC); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + + /* Call the ThreadX system timer interrupt processing. */ + _tx_timer_interrupt(); + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + } +} diff --git a/ports/win32/vs_2019/src/tx_thread_context_restore.c b/ports/win32/vs_2019/src/tx_thread_context_restore.c new file mode 100644 index 00000000..8ff1ef23 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_context_restore.c @@ -0,0 +1,132 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* ReleaseSemaphore Win32 release semaphore */ +/* ResumeThread Win32 resume thread */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_restore(VOID) +{ + + /* Enter critical section to ensure other threads are not playing with + the core ThreadX data structures. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("CONTEXT_RESTORE", __FILE__, __LINE__); + + /* Decrement the nested interrupt count. */ + _tx_thread_system_state--; + + /* Determine if this is the first nested interrupt and if a ThreadX + application thread was running at the time. */ + if ((!_tx_thread_system_state) && (_tx_thread_current_ptr)) + { + + /* Yes, this is the first and last interrupt processed. */ + + /* Check to see if preemption is required. */ + if ((_tx_thread_preempt_disable == 0) && (_tx_thread_current_ptr != _tx_thread_execute_ptr)) + { + + /* Preempt the running application thread. We don't need to suspend the + application thread since that is done in the context save processing. */ + + /* Indicate that this thread was suspended asynchronously. */ + _tx_thread_current_ptr -> tx_thread_win32_suspension_type = 1; + + /* Save the remaining time-slice and disable it. */ + if (_tx_timer_time_slice) + { + + _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Clear the current thread pointer. */ + _tx_thread_current_ptr = TX_NULL; + + /* Wakeup the system thread by setting the system semaphore. */ + ReleaseSemaphore(_tx_win32_scheduler_semaphore, 1, NULL); + } + else + { + + /* Since preemption is not required, resume the interrupted thread. */ + ResumeThread(_tx_thread_current_ptr -> tx_thread_win32_thread_handle); + } + } + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); +} + diff --git a/ports/win32/vs_2019/src/tx_thread_context_save.c b/ports/win32/vs_2019/src/tx_thread_context_save.c new file mode 100644 index 00000000..676c2832 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_context_save.c @@ -0,0 +1,113 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* SuspendThread Win32 thread suspend */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_save(VOID) +{ + +TX_THREAD *thread_ptr; + + + /* Enter critical section to ensure other threads are not playing with + the core ThreadX data structures. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("CONTEXT_SAVE", __FILE__, __LINE__); + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* If an application thread is running, suspend it to simulate preemption. */ + if ((thread_ptr) && (_tx_thread_system_state == 0)) + { + + /* Yes, this is the first interrupt and an application thread is running... + suspend it! */ + + /* Suspend the thread to simulate preemption. Note that the thread is suspended BEFORE the protection get + flag is checked to ensure there is not a race condition between this thread and the update of that flag. */ + SuspendThread(thread_ptr -> tx_thread_win32_thread_handle); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("CONTEXT_SAVE-suspend_thread", __FILE__, __LINE__); + + } + + /* Increment the nested interrupt condition. */ + _tx_thread_system_state++; + + /* Exit Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); +} + diff --git a/ports/win32/vs_2019/src/tx_thread_interrupt_control.c b/ports/win32/vs_2019/src/tx_thread_interrupt_control.c new file mode 100644 index 00000000..671758a1 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_interrupt_control.c @@ -0,0 +1,213 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + +#include + +/* Define small routines used for the TX_DISABLE/TX_RESTORE macros. */ + +UINT _tx_thread_interrupt_disable(void) +{ + +UINT previous_value; + + + previous_value = _tx_thread_interrupt_control(TX_INT_DISABLE); + return(previous_value); +} + + +VOID _tx_thread_interrupt_restore(UINT previous_posture) +{ + + previous_posture = _tx_thread_interrupt_control(previous_posture); +} + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* ExitThread Win32 thread exit */ +/* GetCurrentThread Win32 get current thread */ +/* GetCurrentThreadId Win32 get current thread ID */ +/* GetThreadPriority Win32 get thread priority */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* _tx_win32_critical_section_release_all */ +/* Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +UINT _tx_thread_interrupt_control(UINT new_posture) +{ + +UINT old_posture; +HANDLE threadhandle; +int threadpriority; +DWORD threadid; +TX_THREAD *thread_ptr; + + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + +#ifdef TX_WIN32_DEBUG_ENABLE + + /* Determine if this is a disable or enable request. */ + if (new_posture == TX_INT_ENABLE) + { + /* Enable. */ + _tx_win32_debug_entry_insert("RESTORE", __FILE__, __LINE__); + } + else + { + /* Disable. */ + _tx_win32_debug_entry_insert("DISABLE", __FILE__, __LINE__); + } +#endif + + /* Determine if the thread was terminated. */ + + /* Pickup the handle of the current thread. */ + threadhandle = GetCurrentThread(); + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* Pickup the priority of the current thread. */ + threadpriority = GetThreadPriority(threadhandle); + + /* Pickup the ID of the current thread. */ + threadid = GetCurrentThreadId(); + + /* Determine if this is a thread (THREAD_PRIORITY_LOWEST) and it does not + match the current thread pointer. */ + if ((threadpriority == THREAD_PRIORITY_LOWEST) && + ((!thread_ptr) || (thread_ptr -> tx_thread_win32_thread_id != threadid))) + { + + /* This indicates the Win32 thread was actually terminated by ThreadX is only + being allowed to run in order to cleanup its resources. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* Exit this thread. */ + ExitThread(0); + } + + /* Determine the current interrupt lockout condition. */ + if (_tx_win32_critical_section.tx_win32_critical_section_nested_count == 1) + { + + /* First pass through, interrupts are enabled. */ + old_posture = TX_INT_ENABLE; + } + else + { + + /* Interrupts are disabled. */ + old_posture = TX_INT_DISABLE; + } + + /* First, determine if this call is from a non-thread. */ + if (_tx_thread_system_state) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_win32_global_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_win32_global_int_disabled_flag = TX_TRUE; + } + } + else if (thread_ptr) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_win32_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_win32_int_disabled_flag = TX_TRUE; + } + } + + /* Return the previous interrupt disable posture. */ + return(old_posture); +} + diff --git a/ports/win32/vs_2019/src/tx_thread_schedule.c b/ports/win32/vs_2019/src/tx_thread_schedule.c new file mode 100644 index 00000000..5b8a756d --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_schedule.c @@ -0,0 +1,291 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* ReleaseSemaphore Win32 release semaphore */ +/* ResumeThread Win32 resume thread */ +/* Sleep Win32 thread sleep */ +/* WaitForSingleObject Win32 wait on a semaphore */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_schedule(VOID) +{ + + + /* Loop forever. */ + while(1) + { + + /* Wait for a thread to execute and all ISRs to complete. */ + while(1) + { + + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-wake_up", __FILE__, __LINE__); + + /* Determine if there is a thread ready to execute AND all ISRs + are complete. */ + if ((_tx_thread_execute_ptr != TX_NULL) && (_tx_thread_system_state == 0)) + { + + /* Get out of this loop and schedule the thread! */ + break; + } + else + { + + /* Leave the critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); + + /* Now sleep so we don't block forever. */ + Sleep(2); + } + } + + /* Yes! We have a thread to execute. Note that the critical section is already + active from the scheduling loop above. */ + + /* Setup the current thread pointer. */ + _tx_thread_current_ptr = _tx_thread_execute_ptr; + + /* Increment the run count for this thread. */ + _tx_thread_current_ptr -> tx_thread_run_count++; + + /* Setup time-slice, if present. */ + _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; + + /* Determine how the thread was suspended. */ + if (_tx_thread_current_ptr -> tx_thread_win32_suspension_type) + { + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-resume_thread", __FILE__, __LINE__); + + /* Pseudo interrupt suspension. The thread is not waiting on + its run semaphore. */ + ResumeThread(_tx_thread_current_ptr -> tx_thread_win32_thread_handle); + } + else + { + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-release_sem", __FILE__, __LINE__); + + /* Let the thread run again by releasing its run semaphore. */ + ReleaseSemaphore(_tx_thread_current_ptr -> tx_thread_win32_thread_run_semaphore, 1, NULL); + } + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-self_suspend_sem", __FILE__, __LINE__); + + /* Exit Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); + + /* Now suspend the main thread so the application thread can run. */ + WaitForSingleObject(_tx_win32_scheduler_semaphore, INFINITE); + } +} + + +/* Define the ThreadX Win32 critical section get, release, and release all functions. */ + +void _tx_win32_critical_section_obtain(TX_WIN32_CRITICAL_SECTION *critical_section) +{ + +TX_THREAD *thread_ptr; + + + /* Is the protection owned? */ + if (critical_section -> tx_win32_critical_section_owner == GetCurrentThreadId()) + { + + /* Simply increment the nested counter. */ + critical_section -> tx_win32_critical_section_nested_count++; + } + else + { + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* Get the Win32 critical section. */ + while (WaitForSingleObject(critical_section -> tx_win32_critical_section_mutex_handle, 3) != WAIT_OBJECT_0) + { + } + + /* At this point we have the mutex. */ + + /* Increment the nesting counter. */ + critical_section -> tx_win32_critical_section_nested_count = 1; + + /* Remember the owner. */ + critical_section -> tx_win32_critical_section_owner = GetCurrentThreadId(); + } +} + + +void _tx_win32_critical_section_release(TX_WIN32_CRITICAL_SECTION *critical_section) +{ + + + /* Ensure the caller is the mutex owner. */ + if (critical_section -> tx_win32_critical_section_owner == GetCurrentThreadId()) + { + + /* Determine if there is protection. */ + if (critical_section -> tx_win32_critical_section_nested_count) + { + + /* Decrement the nesting counter. */ + critical_section -> tx_win32_critical_section_nested_count--; + + /* Determine if the critical section is now being released. */ + if (critical_section -> tx_win32_critical_section_nested_count == 0) + { + + /* Yes, it is being released clear the owner. */ + critical_section -> tx_win32_critical_section_owner = 0; + + /* Finally, release the mutex. */ + if (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) != TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + + /* Just in case, make sure there the mutex is not owned. */ + while (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) == TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + + /* Sleep for 0, just to relinquish to other ready threads. */ + Sleep(0); + } + } + } + else + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } +} + + +void _tx_win32_critical_section_release_all(TX_WIN32_CRITICAL_SECTION *critical_section) +{ + + /* Ensure the caller is the mutex owner. */ + if (critical_section -> tx_win32_critical_section_owner == GetCurrentThreadId()) + { + + /* Determine if there is protection. */ + if (critical_section -> tx_win32_critical_section_nested_count) + { + + /* Clear the nesting counter. */ + critical_section -> tx_win32_critical_section_nested_count = 0; + + /* Yes, it is being release clear the owner. */ + critical_section -> tx_win32_critical_section_owner = 0; + + /* Finally, release the mutex. */ + if (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) != TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + + /* Just in case, make sure there the mutex is not owned. */ + while (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) == TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + } + } + else + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } +} + diff --git a/ports/win32/vs_2019/src/tx_thread_stack_build.c b/ports/win32/vs_2019/src/tx_thread_stack_build.c new file mode 100644 index 00000000..649a9066 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_stack_build.c @@ -0,0 +1,157 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include + + +/* Prototype for new thread entry function. */ + +DWORD WINAPI _tx_win32_thread_entry(LPVOID p); + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* CreateThread Win32 create thread */ +/* ResumeThread Win32 resume thread */ +/* SetThreadPriority Win32 set thread priority */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* _tx_thread_reset Reset thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +{ + + /* Create a Win32 thread for the application thread. */ + thread_ptr -> tx_thread_win32_thread_handle = + CreateThread(NULL, 0, _tx_win32_thread_entry, (LPVOID) thread_ptr, CREATE_SUSPENDED, + &(thread_ptr -> tx_thread_win32_thread_id)); + + /* Check for a good thread create. */ + if (!thread_ptr -> tx_thread_win32_thread_handle) + { + + /* Display an error message. */ + printf("ThreadX Win32 error creating thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. Now set the priority to + a lower level. */ + SetThreadPriority(thread_ptr -> tx_thread_win32_thread_handle, THREAD_PRIORITY_LOWEST); + + /* Create the run semaphore for the thread. This will allow the scheduler + control over when the thread actually runs. */ + thread_ptr -> tx_thread_win32_thread_run_semaphore = CreateSemaphore(NULL, 0, 1, NULL); + + /* Determine if the run semaphore was created successfully. */ + if (!thread_ptr -> tx_thread_win32_thread_run_semaphore) + { + + /* Display an error message. */ + printf("ThreadX Win32 error creating thread running semaphore!\n"); + while(1) + { + } + } + + /* Setup the thread suspension type to solicited thread suspension. + Pseudo interrupt handlers will suspend with this field set to 1. */ + thread_ptr -> tx_thread_win32_suspension_type = 0; + + /* Clear the disabled count that will keep track of the + tx_interrupt_control nesting. */ + thread_ptr -> tx_thread_win32_int_disabled_flag = 0; + + /* Setup a fake thread stack pointer. */ + thread_ptr -> tx_thread_stack_ptr = (VOID *) (((CHAR *) thread_ptr -> tx_thread_stack_end) - 8); + + /* Clear the first word of the stack. */ + *(((ULONG *) thread_ptr -> tx_thread_stack_ptr) - 1) = 0; + + /* Make the thread initially ready so it will run to the initial wait on + its run semaphore. */ + ResumeThread(thread_ptr -> tx_thread_win32_thread_handle); +} + + +DWORD WINAPI _tx_win32_thread_entry(LPVOID ptr) +{ + +TX_THREAD *thread_ptr; + + /* Pickup the current thread pointer. */ + thread_ptr = (TX_THREAD *) ptr; + + /* Now suspend the thread initially. If the thread has already + been scheduled, this will return immediately. */ + WaitForSingleObject(thread_ptr -> tx_thread_win32_thread_run_semaphore, INFINITE); + + /* Call ThreadX thread entry point. */ + _tx_thread_shell_entry(); + + return EXIT_SUCCESS; +} + diff --git a/ports/win32/vs_2019/src/tx_thread_system_return.c b/ports/win32/vs_2019/src/tx_thread_system_return.c new file mode 100644 index 00000000..921ce850 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_system_return.c @@ -0,0 +1,212 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +#include + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the system. Only a minimal context */ +/* is saved since the compiler assumes temp registers are going to get */ +/* slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* _tx_win32_critical_section_release_all */ +/* Release critical section */ +/* ExitThread Win32 thread exit */ +/* GetCurrentThread Win32 get current thread */ +/* GetCurrentThreadId Win32 get current thread ID */ +/* GetThreadPriority Win32 get thread priority */ +/* ReleaseSemaphore Win32 release semaphore */ +/* WaitForSingleObject Win32 wait on semaphore */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_system_return(VOID) +{ + +TX_THREAD *temp_thread_ptr; +HANDLE temp_run_semaphore; +UINT temp_thread_state; +HANDLE threadhandle; +int threadpriority; +DWORD threadid; + + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Pickup the handle of the current thread. */ + threadhandle = GetCurrentThread(); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN", __FILE__, __LINE__); + + /* First, determine if the thread was terminated. */ + + /* Pickup the priority of the current thread. */ + threadpriority = GetThreadPriority(threadhandle); + + /* Pickup the ID of the current thread. */ + threadid = GetCurrentThreadId(); + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread (THREAD_PRIORITY_LOWEST) and it does not + match the current thread pointer. */ + if ((threadpriority == THREAD_PRIORITY_LOWEST) && + ((!temp_thread_ptr) || (temp_thread_ptr -> tx_thread_win32_thread_id != threadid))) + { + + /* This indicates the Win32 thread was actually terminated by ThreadX and is only + being allowed to run in order to cleanup its resources. */ + + /* Release critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* Exit thread. */ + ExitThread(0); + } + + /* Determine if the time-slice is active. */ + if (_tx_timer_time_slice) + { + + /* Preserve current remaining time-slice for the thread and clear the current time-slice. */ + temp_thread_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Save the run semaphore into a temporary variable as well. */ + temp_run_semaphore = temp_thread_ptr -> tx_thread_win32_thread_run_semaphore; + + /* Pickup the current thread state. */ + temp_thread_state = temp_thread_ptr -> tx_thread_state; + + /* Setup the suspension type for this thread. */ + temp_thread_ptr -> tx_thread_win32_suspension_type = 0; + + /* Set the current thread pointer to NULL. */ + _tx_thread_current_ptr = TX_NULL; + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN-release_sem", __FILE__, __LINE__); + + /* Release the semaphore that the main scheduling thread is waiting + on. Note that the main scheduling algorithm will take care of + setting the current thread pointer to NULL. */ + ReleaseSemaphore(_tx_win32_scheduler_semaphore, 1, NULL); + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* Determine if the thread was self-terminating. */ + if (temp_thread_state == TX_TERMINATED) + { + + /* Exit the thread instead of waiting on the semaphore! */ + ExitThread(0); + } + + /* Wait on the run semaphore for this thread. This won't get set again + until the thread is scheduled. */ + WaitForSingleObject(temp_run_semaphore, INFINITE); + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN-wake_up", __FILE__, __LINE__); + + /* Determine if the thread was terminated. */ + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread (THREAD_PRIORITY_LOWEST) and it does not + match the current thread pointer. */ + if ((threadpriority == THREAD_PRIORITY_LOWEST) && + ((!temp_thread_ptr) || (temp_thread_ptr -> tx_thread_win32_thread_id != threadid))) + { + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* This indicates the Win32 thread was actually terminated by ThreadX and is only + being allowed to run in order to cleanup its resources. */ + ExitThread(0); + } + + /* Now determine if the application thread last had interrupts disabled. */ + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN-finish", __FILE__, __LINE__); + + /* Determine if this thread had interrupts disabled. */ + if (!_tx_thread_current_ptr -> tx_thread_win32_int_disabled_flag) + { + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); + } +} + diff --git a/ports/win32/vs_2019/src/tx_timer_interrupt.c b/ports/win32/vs_2019/src/tx_timer_interrupt.c new file mode 100644 index 00000000..83edfa34 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_timer_interrupt.c @@ -0,0 +1,153 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_timer.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_timer_interrupt(VOID) +{ + + + /* Enter critical section to ensure other threads are not playing with + the core ThreadX data structures. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("TIMER INTERRUPT", __FILE__, __LINE__); + + /* Increment the system clock. */ + _tx_timer_system_clock++; + + /* Test for time-slice expiration. */ + if (_tx_timer_time_slice) + { + + /* Decrement the time_slice. */ + _tx_timer_time_slice--; + + /* Check for expiration. */ + if (_tx_timer_time_slice == 0) + { + + /* Set the time-slice expired flag. */ + _tx_timer_expired_time_slice = TX_TRUE; + } + } + + /* Test for timer expiration. */ + if (*_tx_timer_current_ptr) + { + + /* Set expiration flag. */ + _tx_timer_expired = TX_TRUE; + } + else + { + + /* No timer expired, increment the timer pointer. */ + _tx_timer_current_ptr++; + + /* Check for wrap-around. */ + if (_tx_timer_current_ptr == _tx_timer_list_end) + { + + /* Wrap to beginning of list. */ + _tx_timer_current_ptr = _tx_timer_list_start; + } + } + + /* See if anything has expired. */ + if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) + { + + /* Did a timer expire? */ + if (_tx_timer_expired) + { + + /* Process timer expiration. */ + _tx_timer_expiration_process(); + } + + /* Did time slice expire? */ + if (_tx_timer_expired_time_slice) + { + + /* Time slice interrupted thread. */ + _tx_thread_time_slice(); + } + } + + /* Exit Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); +} +

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܌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 z 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

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 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�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�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l zs>^7b{3TtHnK+!~feAwI;pSl5VOnv27_6{5Sht0m_9^i@(_y)k(s1ZJ^-1C^Z(g< z7cjeuD(!#ob54>brwI*7BSHeFlORDzx^p1}xfnvgkOT-JTtuML-RUGPNji2XTpUJ` z1Vumw0WY7U62uEC@;S)KNSl`gUe=fLsHndJ(1*X={>b`pmCn(4ePAx@4Rdc}N@9D{^LXzz0=B zx_)V6s?sy4=W9&18fPAO0c9>B?}Pjf!V${3y4lht2ff8_o}N^`Oy2X#??_U6U#DkP z?k4^OzlQfp{?Qtsq^CD5CdEZG$~oYNYQb5`dwZ(AYhdPE@HT6~+1lylw$rl?T9c&j zP)DRolJQa)D0ts16SPiGy1(TOV~2z;1(Obz>RbGVF z%7k>`yeUmnzr47yy>Uiy{PM3YY?|Eo+TtGbJBoWQFP=Dm+Vpvijm3*Us@TEHH?ELE z3;Ha@{jZqD%Ca+x>*p8CQyMq4x4(I1J0tBh74H!1km#A=gD$aneFmSW^ye(E?z;4y zg)562OZi-}E{ctoH|DzZU4?fRuPkjGcHXG{P9=>Ck)YKk<&Vb^wHb%0dx6>CwpA@1 zt3lCdy4aztTh^{$>r%Fm;@s>aXDq)=A~&oH{yRa@<{mt2#9ps%jhJN9YY5C~#-Hap z7se__Z0IHHaMZ&bvm=i)_BtZAgKC3UX^46IoR)1iKG@Uoe`XId-fzAUyW)|Jtq;l) zf$TTUiymjh*kB{hgZhf;UpU2@*ou0`UCCtUI%v?mM9V|;xDZ9A8?~s_Hkn>drl*o=Cse7r z#7YA?7}GMy^j}Q-M#p8^AI*;a&ov{~p}r8<{T`|}RkvoYb&+c=cnzOk6qs_2jCCtJ zy6yHs%||Lv=ppp+XdOUn#-0!O)X_{JC&=skytp+ea`lW|e*K8QLT!tePQN04WBB(- zwSL7|66Wzn8N-j)TcUEjz_!z`cv_iJ@X^CaQ~7M1gSw*6aAke8iMZcZmdbrSO7NR= zs>;d7o!+WG_;S_y70Wmd%^~SH7*XcOVS_wh8T=?;i_#_c!Efpv9_=Q1g2`tcm*fe3 zzqGRL>#&)O*(>8SwXNX$xmv&CY2>L7ByXfEC%O6_jpbd2Jhj;epVvu3+`h4u&_0cG zeEZ(Twy(ox@;&5LwBdr!+dw>)H?flO)@mOVM=npCtm>%k3cp33d_ef1JpFEQ=+plh zL9=`$%KHr4oYJ*E>jlaUMsH#qgu+*RrAVIkosE>T%y~FSxtv7N9sBT8Q|tKYSp7B1 zX7a%P%(iR81F9XTEVjo1X`5E*>=B zIAEJAC+0%sZ*}-thvplHbn}e^nr|GimK)pTJ2c-oq?^eeXufg4r7qum;}AFBIN+Tw z{a%OW8;5kM-b=3e#sO=%NENp!GthkFfaV(qG~YPjldjw!9GY(&(#7<{Jkz-#DQ8#sSSY z4rsn{K=X|Qnr|Gin^{G*cY{NmxLEvFhhKE~Er&mJi1QFDXTEW$Z@zKB6L{fDp83WB z%{LDCluQ2)A=jGu$N~4@VXX3F9ZnFEeu%@@J3PT*v%@xr-3~8yc$pA+?{@f6ho5ly zpLX~om;SiJ-wDyn((_6C=ardYC1d(uire#rxSnr{FLe2fT-=^p{CU)KSmnCf`RZI1 z6b=UR*)yxDscEqK1{3uH=CQ6eamLYO9Gz(0jRda#?xsh#?16ukJ>a`d=K#MuG-qVI z=7u=;|8;r>*S1K{KwSCat%O&>{cb5G8}FAa412ycIY}P#dJ0X*FujUJ8;3oCUcv09jo3Dy zPPzBjtBoAv0mr!g%g@WKrkm=UXeasydnZjB>+uP*zi;19*p^O)`bGO!JO4jqu0sc7 zT^;?C+-N!!kI-iYSMJMf`#RED;L_V)b!+e!r1oliKlWF{?<m&5kS_tkiyJERo!6zjpS1Yik z0CKg0ngDYUXrjz3XvpQBgK|l32FuMrZLbODG$*qTO-AKHdiYU@mkE) z3O+4CxmtnRvSVwcNMS{5q>NI{T&>_%#j4c`KCc}IwE}6l_P$2SBn}_N ziOkgsM9KHHM#@*zbGcfxTm%QRYseVZut*O_iTAo{5f0pV7wF2?L(HbdIU1E)t>})jEFIC~7R`5f0 zWKb(utK6Vgutd2*t>DetZ%`}vmUa}>3VyD_L9IaFMXZsM?RQcAIz@w8L8}S}wF2Fl z@fs;_mFP&Vpj!tKsTCY0X^~pNfr@XhRv=xec#RY(5ZM|j_5cWK1r6GLP%Du4o&MHH z8BgnMjg-wQ7}N?@OH5EJD5%l>s1;12xK}IC8Yyy%!x||KNSA7fKFp#uQuG}et&w7j zE(Ns$eWkKSO4i%+>c1gTL9IZ#`q3IGCrffrD_~Ha6oXoU+(txeq;yDBq*idWWJPKP zdnrFsD|nw;5~&qDAaRje!A9jrY6TmVAE_1Gpm=|31-DXQuxbTbBju}Va8N7wq4vL{ zY6V=XuhzZl*GRcm2mKPM6%?N50Mp^6ZrWX#riFP97{{>Z4tALykm?L8=#vB9emPwI ztCgLej;_M5YnYc=pxBRTY6(!8V7#tbI8} z=xUifu|+E5P^!@R`=<-qryf3aS+REh)V8Tty>?pT$Zu!GjZC!qrDh1=KeK~3Nxd=oerT=&{kU=P zJhN<(dwOmd8ntNG7}TPD^usM?R?w z7YaM>TPoff|Mh%jReGPVmDLZ7c9nv{236U(YPSJaY8j zQhk+Un6n*sUz@$4$jO4rDpYg#eU;Pvvah3hDtBd+;5X+~m6Num-iki>a@E}ZPdScB zG+xJ{(Um`r#ccaJlJO^o%T zJ}J-5t{>g!KB&C-Y9AEW{q2L|^L+$V{H&_DCz$ZkmAyA6nkR(i{w3na$-(bI_v)4l zaXN!LuH_fEtdggu?v6F`0TsUjw|^_L-^2N79h*9iZ5-VFTu{CamI}F`Rtfh-eOySn zhe2^_j|jQ$ek9~#G>(i}d)=1>ctjnS(sk~H`WBE4uyOq0co%PSXdFN3b6osnhsN=f zzS6}vIy8=-^bfiCZ4U2pc(23nJABNcCZp93WT--Q*;+o6SevIP>jpGN6;|Go72aV$gjpGN6;|Go7 z2aV$gjpGN6;|Go72aV$g_vf9W{Tas(8pjVB#}6)b`Nr`RH;x}Pjvq9RA2g01G>#uM zjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9R zA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01 zG>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uMjvq9RA2g01G>#uM zjvq9RA2g01G>#uMjvqXM7rw3!~Ip(wIusxC7QSz-69hIPn*L^UjQI;FW_+qnQK~hGG8o> z$W6r?sb8!d&;N*zkkf~$cqyw@xz(A%ZI29GqYG-d7<)-%wl88_6n8XI{Ie6 zvWV=kmc)Oi#KKwpP7o^qrBWy{B+d|rs5*`3W3wTNqZc?RD5qFn5nq+Y|iQ0 z8}00@d8M-0*I+8Hw(OXx_?aB0OvTL_HRp6cr^ZKXNnA~-;zSAWltQSPihq$Zy_<@= zwq>T`S)``CNg{JjcQ486!&Kaq9X^-U+plbf#yO{Zz3Szh?oV}&a#QhFYY#c6Yc2?S zaJv1Qif8*fru->M$xX#yn-c58RJ=(gAI$14EdQh0lCLFEuXg69;$~!@bGoJTRMeS@ zt9oQAt|)AWjGjw!^VO5n4Ta5A+!Y>-skkc|OvQ6iJ7Ow+HO(?p@%QWS!depIFmq$@ zQoShbJX%wKl&*Ep_}11RrNUt?iC3jWgQ>Wvs6tpv;;kwiI9>G)rs8URVZyBXJ5)Gu zx(BIn;B=R(R9H*meB}mC_y1_WfzutYXjn_)k2-|F=}Pq`G8NaI8Jmg^SLuk;eNcOj zI9*$5CE|1|%HN*TJz0B+OvQgiF*6mn2SDI-=crs*OTs<{`Y{!MfnG9Gap{#rrs7Xa zOyG2Xs7Ce8>6XlUS!61HxTKv`(7QvN?np@srsDQJ7EHx8WfYl;k5k>Smc&Z+XW(@I zq{6{eoUg$oG8KPJbpxk+g6alS@q<-3;&i{Jc*N;8tC`VS66+)_;&c}&KjL)l`z+#g z%_~C0>B><`f2QIkdG8o3rz=zOq8bo5-HnP4!0GA~Y-cL2d)1qYOO0ZPrs56A?$=bj z^d4H64nLrQu}&&NI-QqVCF)i9c?;|lMZBhq#;sEE6ZQOp*F9jqYDq&RU1GIVL!%^? zhOmN*t>B{Mzz3+7TWBZd6DAp>v|Wb3-T4fxePO%^gY17!(gh2quDJqjjg+qHmoHVv z!Fb*BRfH5v9x5th;nAKB=3XpYtIwnz;{gxbi_+N^>E%4AMwCT=TDNbLs6FNVft) zfA-Pt7S}2W&OCZ&nKpY9|J|m|c;|0vO{R3O6wR!yuJ%<^)@gN!DRzTQY3BShKt{j<4##8$^`9yi1RQC}HjTRy`dMsr_U^T3!m*@xAh+@k_zKDysR> z&ojTT_mAf8_5M;hUOwCLqpL`ZgUTu##!uxLURda>oaXv`9Til$zl{?7=A5c>S|m?z zL?3)P4R)jCA;|EXr&h^(hK|y4sb7S?Us~Drb=XWU;YHqCKVLvz z+`i|KS0PRE#DRHv-E7D5K94;0sSiG{lZ05_evATq`>2x3tL8`lmCTA426}lL*pB5@ zkf(W9wU4RYTwb+p^B<8Xk7qteo_@DD^yy!MKZ^Us@Aoql;9AkdoQ2;~?m!;_eL0fz zYf9O*%-0TvADsn%H5(z&S#~^Xs*X#?>aS5YlS{Z>j?{(=e!o8MF;0Iu`O$3uX|g99 zGkjz6-pLYP3O-bQrBLA~{u3HG56YX!ufk8y4CTkys?~Lq_TD%-ywUMD!t?S%#6i8rKLK*9aQd2pZQ2+5`i5t*d8T zBXOH31&wP2jcWvrYXpsJ1dVG1jcWvrYXpsJ1dVG1jcWvrYXpsJ1dVG1jcWvrYXpsJ z1dVG1jcWvrYXpsJ1dVG1jcWvrYXp~a)2SbfYXpsJ1dVG1jcWvrYXpsJ1dVG1jcWvr zYXog(7BsFAG_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@ z5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@5j3t5 zG_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Daet`Rh@5j3t5G_Dae zt`Rh@5j3t5G_Daet`Rh@5j3t5G<#z3d0u9P0yhs2YT+0m>1Ia^PIKuq9UklQrLL}W z4Z3esPxl`$SUsN@$2XCFY)}WoQ*K90cIwJhw>x5Tooy${ ziD3GF$??SGvurzJ@;I(yh{<151Y+`iJUcxxspU{3V)9(-IAT&$%zY7)S*?;D))6r& zVlfbtA6IPr5_XA=U{ai;sQIuiu43?%6O(%o$$VIsbiX)a@+<6I#H3Bp#>S?ed@PmU zi9jE#Dc?>7AFD0fThNh~gC`~*LxzaS$JOR(4c79c{4d&1PE49h*cn+~P5C2gd`?Wt z+&2)DMq%c}bt(vz61(3EJAdvTQ_dudWkO#V?~0x@Z0fB}ff z8<1qgr1fl0OshM@IXwiQsF>Men=e|h)Eks24d0{4hqEN3hg%# zllSO?3dH0mBq|V-|Et1*n0$+(ftXyX!ok>7cVr3hY3|#HW^CF(^ZO?z|Azt)lT#S$r25oOPfe{7n+p{^f2>wAP3Idi zdDd7~F(qPrmtJQ%=3Q@#F;yCilf%>Kn=joeq3KJG0J>#W5~J>3YV% zYhFk1M?9uHJ2@UxEoRFPG2g%jtZ*Wnkd0<&Z#OV-zj<%`ryk|^OwhP9Q)CD9f$hBA4j!) z=ewC(IK~U1oZqbGFPB98ppMVWYmMr#nLJR-yIUJBsGLGIe|aAADx|A@{qdKz%*Cot zeemt8<}WXc+D8-e_EqzjMX#;UImBHOZ%cE+w|>Leyi)m1vz_F=uJ(`I&P%O7KC?;B10I_*-1EWnm>%`a(sQG$opoK7?FgSat*K&R z;B}H`^}=VuU2d&|(-ddv`AqrFUF!Vk)Tt^%ky*%s?!~Fxzx5ZU6XVjIi9)vwTg^r(7*IkU@k8NU@oQo;h9Tm zkVMR7Bc&a4c@{Z+F_&4b($N%&m`iEp1m^M-#l|n;-XCY28=D>tdUfKj85)s}6#eutUMHzHBYrTK2mnM-52a^`X>Z4V}uGENQ5 zr4b~#N#$(i<;-OZT_2dsKPfL~ExN{+o6cm`klg zxdY7Qhb1y+E+3GrL77zkK@H29%aaw$nadk>#pcXqo%WD3ms$*QD9q)pl9Dr*+q8#1 zOe)PRH)k$w9GWwi-_!Bs%;n9B1?KWR2_2ZZ%#;n{)pr}HnAu-y4u7{Oq5Zn9KgQLc~H)KAu#@X^|OW4r=$`2$2oCY2Yda9}PklH|Z#>VPBW z@?$C-m`kk*-M2~Q87vzlzoG1ix!fpW z5p(%%NsE}vit@K-E=v*bvvR$d`(_Jc$;j!;ACinBke5T&WtS(j!Sv zATOH|@C4@U%(BuP=FYZ)OL&Bd-a6oPRXaq|PDwS3u#_Lw)vX<#Rr|mc{0-62$}2>m8SVXc+PW_73?*aa{hnMg#hQMPcC@Q$)scvtIW)#A5L3b ze@pYNm)~CV6>4hfdUUs;WyVMLvLr26;9w0chjxE@@5nZ_(Dn*n(sq0Pa1b_{;U?ep z%rrBf#ml-on^)oudleJWYmdm8`QU?AB)#14`s24Xt|@G8$G3BI?VLnso~JXli{@_I z)9z(x7oRevW!<{2j@I?-F!3CG=#A@)UkD6IEL3xy703Yb0eUBCgrai1c(&s@Zz3%Y zDyvYZ#nSD8X;esVb+poZf~$_;MOWN6E=74x&QibsYV1olD_5ukb=B z>o=>p&T}FzQT^fjr8TO$-**B{r}iM+e~K~h%o^t;6&VBt0JQX1R%;P+e2 zbzVTZ1AQUTm#enbyo_>R>7|^?bBW~Pwn5rzJ_*-3Gp`l)8ztGMZ;v8>F0S*uyisv$ z7=^xsT&KpSy>XorNLQZDt@2+B`k?D446`Si)7j|dwp^|P7|QxVS8S@8bD9egA#PL0 zyxUfDx2>klFY(OTZL7)sKtKGY*=m|!SdPnVHNhe;C2@@-98MRK{yG;w&f#L0{$?JD zxo!h5R*hv8KU_#$;||3=m+4W@Dy4Vfc_%QMmC8VCu^zbtYq4I=JB!f6MpJxdGTYf^ zvNmX`>84?6(+P#7a?>!@BE?wf2fST3k4`EZhk1UpR~yUS>wFHp&gUR(EX@%X*MZKH zysey3b@y7fDsSEXTvPXq9ie^WGmvVmCU>y`C8Po=P1zjL#s zG}w^7MuV@b`I+;#Vp7QVQ20;n()oI2{mv^87}oE+TCwpvz^EmapIW7D?&3e&^5G z&A{t-{=38kVzO38JpeKJHCkoscUsTp#H36a!}^_nFF`pmskZFc`kk`J()yhbs%B11 z+NyTd>vxI@8szdt>1Z=`mqNwS-kzD9B*MlU3tBllCR(Sv|>3i`Lxbd zPE5X8v7DH^LG8&-FWNRX42PDaDLv{m%Qv!_4mK6ITCdackTfg%G6%52=v%~~q@;{Z^H!)c-&n%9ZWMRm9>2^fx zcm7P(12HL6#%TS{%Tzd+R7(3MTE9~lV6=W`jp_zsQmQL`uitrt`Z5rcCrMO9Oiq@p zh?tb)+hVkS=UlZUA|^LTTtrMxSAJwtd7SbiV)7Kl`ynO^7f@iZ#H7~m{G1vbh{^l4 z{{e`}26kbu`*F#BH`OG`Gg`k>_bR99hupTWwna^cMohW~$M+DsSLts4Yo6dw%XHcv z3n+%Lch>K0r`>M-&I1`gr{81$=|p1~DPa14j%6Hg`JRtVOrIxt6UVvh_-)R0yPkHhf!VpftF683(#r9RPpM36YC7UA z(~tS7-iP z|Em1B#!r5RV-~jK2H{8;NEj!?t3T(Mq*$gnqX!Es9ePlnLNzzoS2@km`8ukna_2`0 zesfM$IgPvYrt`s<)A%n+P9||2YWx^L^M5*C9oJ%hz7CtoQ_L6k=0CQY8=OQ(slMb1 zy}VYoV|goiaZe)62j9;cZpQ6vLZ0R$C66ZL@-$f#%ex+V2a@K4&#ShBoE^1KV+Y^9 zYHsijGAmvf=;djA9k*{@)V}_>!S5k&lRro&Pcm)0~+~9pA z42Bzg1_Q`C8U!SJ@l#XP?>bh0Ewc&PklDuBHh;cfeB5K4{&H}Gy4FI7_pbKq$_Zg- z*gZm(ThOyYT%VqvKB(Wa$#b(})WXXeXodxt$yR&EQc(9?VOXXg*QY%q*N)jEg5y;l zY;t(CL*4&MKiT2=4p%zd=#~f~R_#2139V~xehZ7x| zuQlqKr#aC4t%9b530~{UnW{AL+gw~<)Y{*D4u9Zqn?ucSDBtW6LG!l?+E+bj{#HTr zw+foSRnYvcg66#pG=Hn0`CA2L_aeDw5&@dORZv>>N;iK`;7k`cf2+hbv7`K@4%av| zFIl9Uzg6&Fmu~)6i9hY)=5Lj_ad@C{c;Io|c#`{wL-V&v{7Dx#f2+jJ9uYKutDyN? z1%pQ59bm~ zYl1)$B0t(uHdj5#+Bt2xg zHW!UxI^&QAZJy3G1r{=`jGeV|Pglp96}&^TlWkKcG}L;ecxbwyu`pap)m%<}&V8uG ze(jrATl@G+?%=0R$^ zImdX*T4tK)9)6CK7A_Vu30`3<>`Eqwbo~K5E;yO)w?J+nD44PM-1+}>OM}YW}$uX z{o>;u~N@K8q8R)yS3}Wt}xUa zSpRD3%o!C61N)TNybq1wHl1NGDcP4V*e3L^X3fU0ebc6`<|}`Z{Nr!hk~D4H=6&LG zI3qOp5?9tgx7+VMnr94Shw(l4Qu)2#etqs};CxWe;q@_GycOqe zf}!>6Yn70k&7+mmNXQ1)^K6?>ND|X!MEu}d7Q@cn#D8mZn0cM(-`#}n9p`T1?~ylv zyNS1Imth6(U#jxB1~mbv?q@1Ceu>3!lrMD>=WfCrS$KC7d{uZy`H{N``A;9f-Guqo zeo5R-*kZxc{Bd;CcfnEqS`N7{cN4GXtr;BU&*l(}~FD;wk0z;cmhv zRC0F{<}Ez9n~)|(z|z+a;bca8kB2w?YO%M&0Y=C-NaZO z!cKBGF+#F>Xmu5Gt*&ErndOf1d%ByrO7(KBu3xBRuGLl6InA}Yc8YLyw|03NOeY%@q=$1t8CO)OYL95H0pa-q4FQ{;Elwaj;;se@m(CRu=(LUWx z{EKpfR+sL~*irtUlpSexJ)%8FT3yxdCMGF=d#x^cM~vM~{FY+9xtp++zJt4o%T%o& zt*-x|m(1P7uhm^atLq8X3tC+^|J=7$S7`uu6MIWq(CT_v(cmcmBpq?k>e^c^>C@fB zFx3rOUHWj1+)X^Jy20IqdEW_IU6WNf((1ZT@kpy{xn%d_ZsKg^M_OIas(z%^Rqbx# zF}0>2t*+9?xEThk)uk1@N2&oqt4mgbyR^HB;%VFr!#>bJKb5YbvG~kCg<%g{{2iG- zEF@^?<6Tb7Fqac&j+2^jIzw7w=@|!h!P}&>jzn0x=%DoTl5~{SPDiT*!>jA)$#j41 zC`}W4Fejrawv%+hG9%%k&1O084m;V?M3Q}#*qo%-;i3zgZJlF0L9mU5^M%?$Yoh<9hM&Gw#(iI!Q?)9tIHD8##LfuHbDE|?5zOp&ye4-iu z_bpv3Ftl&!Zd=#ELIRqvFJuU<~*EF|Z(y^}D`lFZ0@#eOR)>-egb#`9ZL50?qZvNX= zbpqKE=_^`RuWmt;Zp9k55`62f?{3GZ3JwjDe06~}TCbUv)9G`0=D)PPrOTI0a80qU zIqU8$clENCOF0LvT`bg&1au&S>w`98D>}Q#@6+`I4=se##P*go>(@%qF1$E5YppEn zSiW4xzuWagSaEw7TBf^K9wL4t@MgDA%|m?rRbhTyqXw1J3%{C&xXfyYKb2Le<{|nj zr#VMoNA*-regJ*&n{!C;+sZqDm!RH&KKQ(99^y`pV=#X1FG8W^2rmSoezTf~c$kh- zKWGk9==-HLs>5b-J2Op(Yr_TK&(%D{kC0bK8OiI9hxjS-dYhN8<{_Sl+DDbVebqd~ z@5!u??}IfFxF8y2@l z$J3Lw*ctj>(uq^hvqQWD-INFQW6Y5$o)43qs|P>u6eigl-$twQ=b+;#a2~}I4yX&p zb*6pE?)y-OGaMf6P|phG>)sV=HchzF;YNq13r6~fT>LhNcR9S*q3MEA&c4M#Cj3p_ zZycH~80n@922SL3Xn&>)2AVDyxYnhcE*Nps1p`eN3^ZLZ&~(8-o4N!|7YsCAFwk_t zK+^>SO&1I_T`+L>+S^(G?_PU5>xW%s?d@lHVd}o{{v4`x!4Bdfr+oA00G{gN72P+y z@AZz1*V?w{1%Dp(+)=siww5)^cZ4^bG5EE$FBjdy>qE~RX&Q((+$&*iZS=$@%Fldq zqv?y4>aO2bQ~AiY+NSqB9{ZQCgF8I%g~lzaJ<8Q9QO?TyvaF$9>&o@3XSQ!r9F=K} z(W0PqHq50DGmW!+&1ptBBle7H)TC)TT1EC~KsT+C?2$QXN2DCe&f2>3ByJ-s9=f9 z7w+&M*oHf7r_k`$^c3ZMMmZyLj}Qk_r&KwfoDp{^r+1GKu9nUGdhQU95c1Jb%DF>X zj|Ptr#eEdb7TLa>kx$8UhvSH39wAEKwYHc?h%4EYM~LUCRpk+)fyUuuqI{OJa_;bA zD)?A!c~TS`yhn&nP)i;m^b#)S+~IGupXq+DKT+O{ELKzg2Q@xlWLsAK#hF=NT^Xk- z7`SJ#G3G6!I4g_oSN>n+<=o*1B&8>J_)B&(ut$i!R55sj&_ikS80Id^!BVmWsxW%A$= z;_Etu9qt9mW>U>+fUszVRlVY_SYL(=hoIw zQ{CXI{(clr{Fcl8mq3+DsBgC;19dUV8A0p15$Xp)<31z^uryFr<{3&_`T!@?r^5+1@2Ju9{qTPDE$X}^{(pW z5kmU!c!bca3H_7$f}(*ttdsD-9ezx?fjg8Vdpts9M=-Bm-bf;k5Wi4v;0_N~vwJSG zT@2izKF1=D5UV6A;toq{N5mZ-to(>OltyXn5#kz&i@3u#C_my3Pf~v55yI4N`r{6l zQ(>^&p*%u}A&Wdhd|3M*z$1iC!FC=Ybgz1k5PzqG9-2pp24wRB=-VR%*D)8sVZURv zURx@CgVOk|KLRLpi1Rz(M8-hrDvlz3ja{*lrzst|hgc0=Sg~~q-di&+V-F9}4q*>l za8N(#IRqpJ+$0I_V=w7!lc3rfNqH*rD5D}5W#W#?#Fd=5<0El%Ok8D8+EUCHJP;x$!ZO2ElmGhDGea=T7oEAsUFJ3gi zIC9FB#XUbtMMzW_??8enE*N!r@HQVOfAx+l4&oKS zE8gb*^g7UdT>N@qd}IOost2ES$$rdjkfymr)mJ%q(1)$|@YjPvv=;TIj1> z6S=;Q3aZ@SMG1a$PF1;scsc6L=z}j;&1+uIK}@3YI*#G|{BbO1+t-nddzpQcW}**% zvzpiZ^4RRSBu~fZ<+ZZy>qv&y+g_p#7gSE6n%BGsc@@$nj~TsOUN_sZyrsxHlr$fF zUNx_|Ici^jyym-+SMkC?FK+|eQMV>fBCn1#wXZ*3^V7)twm(QGPcmn=i)VI_{MPdbR3~yO7f$ z4AA^zfaV_qH2)Z&`NshN)0O`phkNkAQ~fbQuEG5rE^z5*x%jyb-{;Z~*L^^Fz0V4~ z^LgA`T+b%Ok8yE(p77^U&#;U$ZCe#lrUTkqPMbBO$xJOP1KV2u2o8^sbEfq?Ddp=v zy$Acs%Fmv-AX&T>ETx+_6_d@IMkjTfwx*l!`Bhr?j>lg}PT%^+7hd2ovv@0h97d*_ z*F0WO-t3<}F*#YX6}^=Gle(X6Dw1GS6jIF#O_D}D*_VKiG z#p7wRcuTVR-d`c_E582kUU*?7eeoSeHCySzk)_I}Ex*K$Gffsg?tSc^Pad|N`)j@M z|54uFY2EOB_&<2m=yH*hRe*c#&-X{n)8YXng-y(eTXCU&nd}igeSp*iB2t|99wQxd zD~pcg*Zery1d)qLa<~2nHd*&7HardaH*Dh{qy@k~h#vCz2XXKp#PARD-YoG2AomZl z2U5wpRcRyWM{18KYDkt2A2y1-!g+Iv41ZE7=j!j^RND$_3a&!rHZL77{~+Wi6M4g(c zyvb9iOr5c|tKCI4yVvHY@yx7%w>`Iw&BI0d|M|??#B|EE#;KF1H8oCNSuD?=+SFJa zJ-_i^r?M<$v2{vg@raKWPn%zyIi+~g{Nl9v%(thh#)KW(J3d>J zi?(TnU|nF*_00w^zq6Bd(kq{`tYuwGGNrYp~J@ zc?n|#-##{Tc^laFbtL1x$g60>1)ukJ;<3CMg!uOH37yNkfo;`k;-?_1_IfXbxHk3s zh(o}FzQHw?@xfQoO92sUefpm$H<<71v7A)BXngSUgxQ-l%NeVKB2nY2z4)o0bzDkj zzj+wT`QY;{4_;oL;5Op)fxoZgmS}(R9u-$>LMYmm8plW2ISncC-c>(7V~Xp{hfqv( z=0Yf155#fxLm6R^@LGo-5Ypv;@9^JT`c@bJqC*>F({+A~ZO6l(NA-%0so`tZUMi+18(9zJt8RMJ z%t4Q-&(Y4f95r8{Cx*t&0!OAx z_)q6sDYop+NY5`{lB6f9;_yW`mQKI1RKC>57vESq~e059P%8oVde9VU%(8lOFDb7v4d>Nzp)$ryVe?DM;FiD#h{?rEIB57hm-Ce}1$Mt=c zJDjqM?k_q5@H&#NBSPa{KjpAUYsdR%`u?+ndNYuwCRDj%1g%C@f~8K2~a{#R|d z;Pd7ak4H`SG2rpz=KjX@8|ffDMt$)8S3RzO7i0ZJJJcPW8HeB%X-cCH0_e9jb{>Jt4YSQe5AVZt_eZ(PPVLm5eFys0wC^wjK z{U*u{W?a8X2StN4mg{d^zlrN*|E#I@A01MZ8v0*}FUPokRG)j-y%?V{#dYRG7|OU_ z+@gY>0ok}dez!8Z&)+!Nh^xSP(ED>RKHU#hISNbmj*Rbh@2Gr>!<7#84XpHw9R97t zjSjDI_|Fb)U`P4QE^Zta@#hrhIq9PAwYNZJ$5-ku9HZ`rei=JoLzx zFWmFJEq4;XllbTFd34L?AG(LMN6EWq%kpD4Z@shb(JlKlo$z?W;hVR9>F9g5jIPXi zyo|rZVfSp>dglT6Z29tG_iVYF^si8U6!YaJY?-{hQ?2Zy?zwTBzDYEfj$PDKYEHl3 zA@Rq@ZX2ilGYcwoX#1iOnAnKznZ^-~K9^+e6h#km(O}?o36BmgZ9?`Hb(L+ybCa0< zL>IP3e0)CrK}9kHr+*?D11G(HF>pGcC;u>K;G~5Xy@6A4{D`Be zzHTPIj9L>5Q_IFQ=LSy4k`tUGzLmBI=ZNyfTgVNZ4p$pyHXv1ttS(UAky&g^`OT7& z8#rkV&O&bBbcgbK8aVxc-PELo6UtX8FL#dEs(QgWqKq#h=ZH6Ij{`VI+!qPv9MO6< zH*k_Os>0b>V@qWX3xab*wWV;bI;c3|s+11Y%9Azk=kJ63tOE~9_D=UIDQVAt=C4IP zTxc&B)u7zK>Fe4@wSm)XC>}XSypJ;H6+Sttd2Leoltl3*J_>!~!fmc?GH@zifmvhA9byji%r$0(^Zs2r-V!46S%_^B2I31`)=gtxL&;j)@a4LLFW^IKD zO{1D|22=QY*5+BnX!JL-b{ewNOJkJi@D zSK(mb^mFw}FmQT@3I_wHYg9NGI57_37ITI%v+6&m!ok34q6!BCr!Ex^22N{~8w{NE zREeA;{<{hX1E>GeAp`@b52$c3aMGO_J4d`%*^z@tg(Cx}jfzJGPMTtjog;QjTD0WttCSxZINhoGk%804w7bZ_={Kt1 zpMjIUeFtmcB|slHnGDyPYoyggHme2EO4N_Qcg)lZhu(2_1S z#SS=*kq;J4{EbPqt+19KMoC=^Q8SaIabKruy0?`*{Xm&=rS*3+!z{nHguO}+6FFeD zL`_x6Lrs*#XdsoIpVdFa>Mu$TGB=sI<%+X{^3KPzgNj-~1B`Vh}R z!g($0Sk|$oLoVXZT-eE~Hn?<)T*H}>&#IX-S~53&a)O5+KW|+`PqeHGPW~`AF~4`X z1;poHP-A#SI!VlWl+*`96>$*SPu8B&+Sj2Cw;p}?9S{*bcOAxqr{<1VEbFJF~90*nrRBr#&kK_X0~C*WBL5NO@VWLwBXNhS9P@L?kydTT>>wszs2Bc(QyWsWLL<` z?sqZP3eU}+V6^ZRDPNQqx5YMv%ep(8SK^~`70xAhdtMBRQoD{~ltzGh&oCUYpn13W zCE;Hk;#u5a!^&OG%Si7d%^9k`%JDMV&OYgG(&C`93WxDi`D{Frsbl&!C_j5~ImTEC zE=Znq?|tx_b4c*p%A1D(y&-+@dE#TDVwbI9CIwM zW?a_qlBY3l_V;WmfAaahBJrv2>eaH2!AUn0HL z#dU3~oY^mddWI@)_Di76Sb$%0>GwJOfkU%jBLBB8ZuU#W&3*|q`z6rqmq4>$0?mF2 zH2WpcW|cv+Ujog32{ij9(Cn8$vtI&hxi!>IvtI(uehHlG(#?K}_)-@)`z7LLzXY27 z5@_~IpxG~hPrLGFzeL>Zmq4>$0*~Vw(SFT-2{ij9(Cn8$vtI(uehD=DCD81bK(k*0 z=fE#Yj@d7POI_UTmx!DF5@_~IpxG~hX1@fQ{Ss*QOQ6{=fo8u1n*9=J_Di7IFM(#i z1e*O4X!c8>*)M@+zXY275@_~IpxG~hX1@fQ{Ss*QOQ6{=fo8u1n*9=J_Di7IFM(#i z1e*O4X!c8>*)M@+zXWa=k@b(+FA=}h#m#<+__ti#?3ajdb#b#_B5w9epxG~hX1@fQ z{Ss*QOQ5aq3;q``Wu1=~9FF7xFOGDS!-|mn$qtVaaxKhv@iT>#f1|^tE`5!|@wz|A z*E>Y^QF?wUez=P_xwt)V`17b|n#y&z%M<+acE6t7fZS@+j9G)_RzJ?Wkgy%M%GJ5G z&;$qi$SIE(Dw~Q)Wz*=`7i6D0n7CIwj&V^jm=%>`8g#dR#~vnBUV*fK<}*1`S5kJO zxR$u1Y&%J=Br*M+F0bqPLlrb5I7?5EK752q6`tp>G_3Gx0D|*M9&r$y4a9QSjptCf zRGCN8h>u80@2(r&9tzKEmyX%Qb>p=NERC~0vFzJTij7}_C|rRhB{^5iTsM}^<9;a} z+(-_7nY030=DM-)MQgV)n-{Vv*Nx`REoL^0hh_3h<%?9&#cImuQ^Ch-%VVP0;9WOf zLoK;(+(gTY)BJHfsQpa$d)524I3tVIls~|c6pzSawdJqV9mSbhtgiewiXEB7#+0=h zO>tHh+pny*Rq?1SHnuEQw)na%R!Qm(rJ|^rfn7IBIVp18SgWHRfY}uDX098pXLDxr zY)LvhYeK1PuE%oMjcUt|xo#9cA=ix$s%Fk?E>`naxP36id^NeH+qL7)*Ri>$sGVbp z_U^jT)yrHrW|5lmFp12W&B^M=K3q3SSHAeUtloa*rxnYY&EM-x<;>%nXmdoY{D9?WL(8`=JjDSu1*%b87cO4x_%#(T8C2eWz$%ZF)y-^pT&%HL5e zXErrr3a%RqqAb1ZMpekXF&;^mj8>HXK9=pmS1Hz$*$jo3MTOtY_88UJt0dNNA317E zzsoK&xwhrxu2=pil%I>D*851Pk^4NI<~=s>S4e6eisO7hiHvv~Ei%`Q8j9h%Q9|Ie z>&5Zr&KXPf)8lAOeVh6sFq<0Y;kq%aTUY;DWJInTN2%`dF1M-vJQWVi=J(Z+b6xJN z`c=ve%;qBH24>Toh0b?{=hnYXI||I^V=5e6H-1))Jk1qeR6jw{z-(Ti!hzY;of*4s z)K_Hex^b}%B4Re5Rer>5N;#w#*Nunia3W^&XvCQ7MtcARX7dp>ZVx+!a@{ym)%syJ z$Fnzc-S`6)49uno=*V^Bv&!w8*)05wy?SO-t{W>l$g>>FoYZSH9=UEjLBa#G`8E{} zt{b~`1n0Wmo>za1awBF_xq;a{QIh*~-FSogGBBH(04hez=8Xz%%*Nr9ua-JZY=0C7Xy?|+Fh77g{Q;;GZ^-yS|2Yx zjn-$w9(ih9o1_aYZ_!whN$CPT^3v1C{e)8K0_`b1gMIy)Lr5+qt&l9$|IRS;Fjk~* zmx_b4zwV2Z99-?4z9?M&d11t+xist7CnF`YmEq`h(K%IX#CR4F-rDZS z;+z)LH_ng=&5lm^O#e9zK_v^vmQ@*n-D6R@Z0$byNn^FEm#91GLi8N7| zwy@d|_)zD2(U{}EHkXTz)Xiw#oHxu#^o-2R2-WU&cqzTGc~y%Xpyo7m%QDzSubR+< ziEmrq)z!}Gc5V5pbv;(cTizk|(Noabf_!@J;iNI>GjM4%FJCVfGbgRr*ou6asO-FF z%M@z$!bsU6zrwOI*|K_Cmye|mahve+dutHO_{#U#&>JrqzXNz3S*YeE=b=f>3&rN& zcqJK=qWHo56lZ{A;XH>Pl&2sLP2~qFr+GYIhfVY8DD7q+{N@}I{I>GGO+;@!AAFvM zh*5H~NXNlJY93K@ggRceYcW4xhs`8q{!MP~eej#&A7Xju&{4i$gkD}N+rExuT+T~; zk~UoM{j3pbEN?0DG-s*yi7WE*s(H!VkXIq!2fwdsUUF^JK8+*1ymztf>qy1}eaO=g zJZ|45QTv#N&E-||l20PZg&_ZX+Y9K2*t9x~p$ z+OI1ogq`6RQGKJJYgoMD{uayrEH8gvPiYfhm`AmBkskTkoc&k|>%JS16Xg0aP7qZ8 z%bu#q;n5ED3{d*X4viBezS6}vIy6p@^bfiCZ4ULZr26+d)EuSak2y3>khpPzpmBnr zae|<6f}nANpmBnrae|<6f}nANpmBnrae|<6f}nANpmBnrae|<6f}nANpmBnrae|<6 zf}nANpmBnrae|<6f}nANpmBnrae|<6f}nANU@aHEj^8*z&^STRI6=@jL2#)nXPh8$ z;{-wD1VQ5jLE{9$r(JpD1c@6b2)>G&PWv-X5HwB@G)@pSP7wTqD`%V_apMF*;{-wD z1VQ5jLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5j zLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5jLE{8L z;{-wD1VQ5jLE{8L;{-wD1VQ5jLE{8L;{-wD1VQ5j!4qn-^JbhNapMF*;{-wD1i|NB zIeGaP2j|y&J4A8vSM%7)IX%)mr)SRx{yggW5;(lU+egkkYSy4Ryi5Aw@M8WhJ$lpD z-5eh8mz}#tTOS-=@>*RgoPI7sd&f<(ZH5dars9vQNV|`c-YaSMdY(bmq@A9pgD362 zq+JHmPDX%%v^!O?K-xVm$+q5F=}j~;C+)sSvA#*W8`48+mR6Gs>PHc#Ok2ab;Fy9v5A&Fzn7Qz@6BaZtKJkPz7oTzRStm9xNiw^`{J=7j%IrEL+f`%! zWW$NAtWiVF88H}H;5B#qq{wnM*v5IH$_ONJiEXReTh`z(qj`19B^NK_S~5f9ZUp!x~iWFk4b@nYk-cYcHO&<=MAW_&MvZ-K-o0Xjd{tZcCv`lPN>? zw>VT@Zp@#Nmy^FUAN=MV68yIE?joW$oew^*nwJ~PafpN&h?m>O)YDtN5UTjiYF=(^ z#CtIfne$YwQ5`murM$TPq>|z^!9q1JH!_;n3xd+}4cl(oVRm+#Qc_zqpf znqf;>)4l^4fC?BU|Bfq2K@|^EcD;xVK?bi<} zws_7gZ?`QTDguM@LmGJ+9oN%esptE=KhofU^lU~oOnm9o+1qoaZ8NCSY}g@0yaUp2 zkx&{@dM%|gKcvN9X>(XnUb!&SlLs*vKfM?;Gd&!Tt|n5<%=F}htq%vJ#Y}YZGVL-r zApN;2k84m9Fw>J#NpL_~`jRFKGsf>UsujJNo;_R50clYVG@S#|Z?Y)|q?%&v!vU$x z=e*0&n(|Uw>tnU$o9jfx}4q$4oJIbdvHM7qW$C!NX=R0%&d!=wD!)fN&CT@GmK}3IdLyS^4oJ;kXKtqVSv7uz+XpkU zS5vAqO2Px<_YaiW0SBZXmB`#o?|;zhL4Nqq!T3VEN5z$)XNEWEEB;DB_wPEBC^ z{+|j5Gd;AIlgI(-qpEvB;Y&)Lu(tknsvFGoOwTf6{H$2S_`Ol>YBl3RGt;|J(jqgx z`O1&X^q$skA~QYNz{U6gKp>B#|UK@A9upXP@KazLtK!5$m<^JaQ- zK&pGyJ0Lwp2RSq|y#~bci0Io)?*QZQq|lNcl3Hmh9K#Qeuam~76ZEV~&m4QN(z3`| zW3Q%H(g`Y#W!|`jjFZx(N}86cs>VsadXrUOlpOd4gcWlCqB9ix%l9w3P9G;P!oTQi z(#DfFY$)z=MPqv-pM~46$*M<@59<24qiU~9-&we_c+RLgKmVfi!!570NW9-`*ydyr z-o%M}qK28nb~QB7r2s>cMU+35UsjT9zy+OLA7YoH{kRexGE;!ZSebWao#;%rcCJHG z=fyPG2AK_#Hw1I!OlD97353zo#ckcpvtxz?lQUx$PC>B%TAnz|L;PB3-`pKJ6t!Y`!Zu@mc8mOZ_+>l1DvYLAs$W@!f znWW4dDmXLcxM4+`VA{;$%GQew_FK-4D4bVkcl*xpCYoQ2)|l>g_#*X1FK$J<+TA(p z;a)U0GYkEZlYp{3>=EI5&dzmbO#k+>{;y81omS5bx3+M^8L7CUW%cS7BTd;#ntK?k z!SlcDZbjYw98;04b_I)noYS#Fy^yn$t6O!6`>T+PovV@y-zQ`?d@_C0wI9)?&Yy5b zU*@)!oGUG%*PI&z2BNfYC!(^@Y~Afkbk|&Dxi@Ywek1tz1QbvYPN<0&RfROYlX&&# z98ZX?#d{^Z_cSI*T8E|Z$lq^xoU235yzn~ zpnxRZs3@PIxY9KKOpF<_51qUWG!E*B>|d z9P(c4g@Jxw)!g81QTwQpx38KT91rdLCWz|0Y zZgB`$_~RhC!Rgpk9Ox^7lBGcP{F+kybjp228!q^A!fYgzWn2d5C)+C7?8#h1P1SMf zSp7B1X7V&#vaU5BygVQG7^nX^xIuAuvwUOd9bG%eL~-RWi{kkv8!rWyXnY~E)dq2i zqU3#0UW1Q-icjXJvKr^A{7ldXla&u6F$k19(QJ^5D^ZOu<@r4t7=>Yn-=aXq&5wl> zP(Ky8fR}({xenAXikpoPz8`g;^tsj?2A=kf3m&R+V3Wh69qM{f`pFK@cev8wMu(dA zRXLlF0&jEiyByx@@cRzUmXLC0O9=kPrJF4w@qM`nCC?_!K(i$T&6W_<^{#xgB?Qfu z5Hwpt&}<38FS&B}IW${B(#@6-G+RROd6#dtgv8C35Il|>P5UuhLeOjp!8Vs}wuHoQ zb#b#LByP5ZpxF|FW=jZ4M_uyFmJpoj;$}-o+-wQKr7qoU35lC6A!xRQpxF|FW=jY@ z?aG@iA#s~u2hElcG+RQ@YzaZLB?O=3VWIYzEg@*OgrM0Hf@Vtynk^w{wuGSB5`tz+ z2%0S+Xtso)*%E?gO9+}RA!xRQpxF|FW=jZ~Eg@*OgrM0Hf@Vtynk^w{wuGSB5`tz+ z2%0S+Xtso)*%E@rU4mvy2%0S+Xtso)*%E?gO9+}RA!xRQpxF|FW=jZ~Eg@*OgrM0H zf@Vtynk^w{wuGSB5`tz+2%0S+Xtso)*%E?gO9+}RA!xRQpxF|FW=jY@#S2;I>%WCu zb6Sx@sE57M_jI_wL-Q+2x?CEm+$@K$cloC{9Ixx2e7y_B`7*SyxIGVu&v0>Xd+1Tm zGu89YF3)}rru%u>12^|0`s!rg`hxPwBgB_TX~$0RM~Q} zXiI6)M~>k6{kpX2$4|VlsQ5T%d~4ct-xL4)!VCNR`Xi9@+}<~Dvwb4#Z0Zjqtro8J znbR_^)t7yaH60&mfU9k~fk)mMTUn=XQ+cQ-!4JIZzM*j%W4M~{7~Pllx%e>Io=OrlK*`$&_YJdxDhu&vbe5o9ge zT0H)}zv8mtwS3<;9v|$3eD(M2jgRvf8kscRN4tJx=im?Q^H|!bzU!|q@2+HhQ>w5J z`lFD(_gA;q-Mp<>$?QtC-%lY+ef*9uSwtUH-nT8;q~l$@mAsLqrhnX)Zn~Ot zcE(oD7wy}$RsF1UQB(Ks#}oR>pEL31I+kOcJaOjSz1#MvWY^8ad_NnuZ9zai9peeE$e8lw&mOhQKFYeb-+5m)*n{ydR?02yv2(d&6S zvy!O%{K4Ss-S1Ztoq?!mCDE@Fbt{P;ug%{5?Uu4yrRfNYh`>H*{Nf#4h?GU;Gd4xN|zkW&U>85#0eI|Np3IIg$T%^f@aR%sauk$<-Km;2kjOYQ7~$RDP>oXG!%>g7a! zxAvYB`Hw30=r`?%SV{B^YUqGOK8~+-%kEVg2kv8ZRs$0LoJ9UV(r_d4<#{_=N%Thb zL?H67jH5O6rnKR6YwO>wx`D{IQD<05bgAkFB3}wag+SyFS2V07daI&=$d`M9XeH6l z>5K#--zeSSZ+CCi4Me^)mLekmF4YZ0{=>=*M859KcqP%*I|uUh{%`AQX}&10T77%OSStzrgy$p4AN1S0<=HM(yi zzjV2ZM?}877(^?H9;#?C-8Ei65c&2k8i@QoBr6d4|E{`$$T#h*K;+x^a8J|Sh{!h$ zj6mdnNTMPl|3>X8BJ$5renjMN)~Shz{QGq(BO?F%%8!Wrir|1Cwc28j!du-q@Ch~Q!dLsX8I_Q^($S)mF52eEoxSpYPDy@ZdX4*ho z6h5rz`D10kn@*j?$SFN%>>8y_wa3}nWA~?!i<~v~aLZBM^vrSptU5<3GK>RZ67_^6 zon@xJOU6krFtt~5`lfL+IkqfPcyCEGL2_Ul%u;%W2|D+{MM=8E+IFTC5+tFbuYmMb zs&`GQCTdvbn|YNrb4k|BtE`!4O2)M&V{x{-_eeIoOB!T0pH?g{9rsmI(}Q0?de-K> zO3FyOIg~>3D*f*?*TK8snx@%==8MrfI3itsVbg-f1(O@^K5gU83yV{ipVC-7VR>=% z@{P|P-c;P@imxvGNzDa?iKBmdO3kswbLJQKtT_h-1q_g0qU3yL7>f*agR}FjD@OO^5vS#BR^F}p68CX!6 zwQS8DRX2CkewmuXMy?*_4BY5`IOBYM@`Y*L_jBT*VEt5y$&oxn5vc5f{~}QIPJVit zsn8`^K_w@B`y_T+1k2ZC=E9yI4axvR@Fbg4?H9Kh2kR-=YEHHfUOOz@szn*sHZ#lJ z(IqZ+b!)6>uoF}>n!C8xsuqP5Gc3A3G)^qDob$FXs~AmgX0Xj`u~=+gZ%n!|=z-pc zibt)Y2M@oK%&=_{*LFP3Zl};e*F;9W-SSoJ{3Scu-m~RZ6o0-jtPap<@x<#RRH+wa z)OMyH;T1%zk9wAqW=W>(k!e_Dsv^DVA!v`i`a90Ac())g&64Ni{4&^1-NWm=aOTYU zvDa)d3U**OE+W?e0#dENgFFzoNONwY97LqF6biW6ko;IPMl+?bNL^ zg)=dA%8WRBd6%@Pri6uB*RF5Xy~Z9wS__Zx6-vr>+B3G3%&e2%bSdKZkbgT>>rzaF z$i9d7k*4VNno>Dldd4RzZsRm?HXB|B(R}-0wlyB|;R)oazT~N{m)FR)(!D(KWxdH0 zPoe$#pmH*%@WF4MM1tQ|-ft16H?|KxZw?7@`<|wKQioOhM)33PJBw{!ht1?!6bdem z68z?3@?v@GCWPZvx|i3=w(3mdr?3j5MaS=h$|--nL!Z8ma_9I6sB#K#;TP}sGWJ^` zO~;{GNx$EBvhCZ-X7VudnzZ49&%1(nEbqh7am2b5;)8u1iFh7)6>YfS^Yld&%lkO; zC~EB!`u2UAZC{7YWGqS(;;MY`d3TYZZQu48lzY~9hRaj_y>1(@Flpad_aN-+A##h^ zkk863r5u++9{hf*bvWKexqr<|1$io8h|=eBW6dT($D(thrs}xWC+s&58zJmJn#Y2? zD9JW`dlcDm9gbl=#1&1OAS4y-%8%oF*fpdSwL7K79Cj3niTwM7P%XclaJr+ATK%i? z4oWRwW9}?u`89dR#7C?C(iI&-(X@NwxOz5(qG`>`$Fl37qbk0xD*m>rxb9;gB=1@u0TsW2pZ|tYdjo;n z77fr*PH`jDY_;2b#1=+$8q8~nf(!8*r4g&tan~$UBBN=`T))O=x2?wa3`()9NKp1_ zzeUwG%3SwW4NqFzI@hAJ91Uf%`(i8?k-o1qLoi#&J)>ux;+G5gn9^~M>E%#Q&tcWS&7q!;ir?$-`wky-xXq#Iu;>PTNrk4YnUJht_IUr=S?Z?Ol;-;4anqCfQdO4u!<$$J_1DakA z*hU|!ou-!q-s<9}mqXn2azN9|0gWvHHP%r*)5`%(F9$Te9MJS~z@@I7>E#f&c}URo zazJr&l4E)~;L|Q{dO5^RF9+02lggQ14rp_spy}m+rk4Z$!Id+;9O9;z1DakAXnHx| z9Ih$JGrb(p^m0Jc%K=R<2QE(c?mjjw!4rqEgpy}m+rk4YnUJht_IiTs~fTouNnqCfQdO4u!<$$J_1DakAXnHxI z>E(c?mjjw!4rqEgpy}m+rk4YnUJht_IiTs~fTouNnqCfQdO4u!<$$J_1DakAXnHxI z`S=F^gF%|kgZcR8+S3bM_xA`P>0=x=IFt_{rE852;TwdUb2IlQzRaa}33)Aj*u`%Z zBKK1c?{Mi~b@)Svk30OG!#@hSChh*EKD$T?JcR7IL;M&QpDiSA&nx~s`sWqT={K)l z>$QC7F`s+xZ+^4cvZ~H;IYy7U zyYTNhmHZ!=)z(dw)f?&>YRW2`0rTj(SfL8Rud^`*`I+PTgGy6=yw)FFT9$$$lI#AL zWP{!c`lpRAwEiu8S$W`xNxU5^x)aq{bzvDRqzp?fSSFr6GnJZs(X8n+rlSDU8yXwb zu8`B~=FFQjy{URSrmd}8r>}2lWdS399lHz?s>`h8<@1`8RwQSZ&X`kr>7t6SZ1^v2*|uqOWfdsaEQD?_woWGuW$h?t&6o9@ z8^;o<3A37$cQ<1)IBqM0UywO~U%TD() zq|1Ja>2gYM(#@Wm5k|Wl{>GSeNmV;lJ_jfOj-1!>B1`#9)7)EFodc+}N?Nor@(gdN z?cVd;%+3kZ^BvZ6WL)PAFwBoKuK2TGH$43(8#bfnDUWw1GJZx)(qA6kFn}+m4_WvR zmNTO0!ZbOTI9J>GPLa9A0QPSajmA8>J6X{ug<)F>-&eTl`Q$NfXT8u}-gBUQWv;d-z3+p)Cu92t0_5upC$Ih-hV$GHNH!+j1;Stn=w zijAhLR}(9e}<=Za>lV_)jm4a=zqeK zGx#`me{u$Q6zJyUjLYeD2u{v;iRpB6a>gyp{A^X?{P;7dyy)bNE#&4ZzY*~-P)c}m zMlreY{$I~A(mHIWO|@2HG5&?jfqGoKmicYe5!&Uctz zHz#KlF=wIrU7FnYpOB|*6_#cY(Wu|C(RFij2B-I#>UU9K>V*`M?d3i?I%u?yPAIA` z`{-PW9LdQUa{fSc-2JJnC8J;$$krwy+v((tb6IWO9(SLhsOaR3Y6gzf?|#gRj84vI zp>L#qw~W5gK02f18PglRbUN;SF9S#FcLzW2{yYYb)bIFY9_-|db6E&W{qA?Dwq6`} zKa<6=)bAERjGUYy9YCahH;Tze$K6wr&_9U!-2|jA$K8vTb)44o5O1xQ&!`a>jl}kJRr@r0_`njvATWpPa!xwz@w#V;Lo9s^9t1J~~`nwvM|$ zgQ6_;yIIVKrGCdXG5@`Ma)xNtN9uPw*@$~kzbi%+WT@ZqxO+aU=Hv`H@2P+4ce>-~ zejgok-2Fy24|UxAIE;DSuY-3NxDp@vn}`c4ZangSzW7(5eZ|7Z)&R3J2%-qc#Z*%_#V?W4?wTOR#mD2Dw59K><> z3=O^N%*V;r;_8p87Z$(Ytur+2S3scO1zgwWnx-*4<2we1YiAe=gzKo2G>_4Y7-I0Y zVOW}}xEQ~ua4Cc_abOippP!x?W2_6{VC?k!7chM58DsoTfP>}iOhY-Cd6t9ge=INa zwH%j;1FQ2Y)(y8?4#s*q{4(UBqD;Mz8hKT)n>esKtML+_Op7+Ap4Wi4U7CW3X~07KJi~yRJlzXB+Deo0`W(VRbt5z;T=qKt({Oks3>C>^c#L>M zb0C3wh9k&9&$g!m*2FMYB+qgZtH}?Up4aisQ=p`DUPsSfXJ<=|jE_6Yx{r*VI_r%s zCo+B4fnu#jhB{Hkg>}Jod=4dzVS6R;8I2mSG9U4@%IWrO(}&N}(0VU;K1A;YRP4sJ%@MDRHL8OnZz;dK8IDwy<$%gyWkSsK4%r-UxMT*zeTnie?+J~;gs z*WHD^Ire;FKi=H3FO0hb=V`3PzA{bN6Xc`VX9ch4d8s@04{}!QT>$&%PlUg7b_e#I zxyh~AwTpYiI8J*J`bpWtgL`#6ntFNf4yULisMx)KB(7rk?MgibS!Z`VntFOK#!~3G zS9Qz~dUnT9_&do@><_T_O5u*(`;W(7B@XC_rrrA~D+XD3lMMDj^HOat_J1jgrLac~ zbYl*DQ0+P6LiU^3FNEPK+fD6~w4BuX;W5M+iSYYn?~+gKFD$%8_CjG;=81V@zJ8+P zFD%@>&qI7-m4mP^$%rKL@$}vp%2HT}baAyqmN`4*VUc@IhkI$8&;4=2eO6GH%(v8s z&d-ww>&Bz~UAT{r^U-$3?f4zi|Eb85o7BbrCibQ#L`BUhBoRP*cz=_F>~CUWqGL0+ zJIUVPWU$`uguCk}^>!xFxg^{8fXh8ncq*EtmGw{UOB>es^ z$nm~{Ah~(mI|3{0@W}D+haDT7+=gg?Rv9JtL--4V33(+593)qO%e$X}i|OISZouEI zxCYSz#TrAF0H~iU( z%a4B;MfB$=t}uQIxw(oP5f=z?p5jKv_tWoK#f^!7m{N{YT+%7zwlU~wpit*8jE`n| zi|E8U1>^W9lk-bC3jJqnBF7zi{G>Ye8%ed-%=^0z%@DkV=B+{z#-F* ztMrbKKgaZ*d{E-ek6#MvKlN?l78c;MT{L|qWl{Y5Oz*oY-m>@!Oz%0xRmA^;+zYet z68B10#!H#&?>{ePSmpTt&VuF)CvxU8LJ><>M7D@5>RYhN=OLfa>STBfZ_Er#)&wSA zI)X8V24~@aIBURt1!*X`V$*VW(4Tb@rHfc?aEP&tVZVVE`D2^MG?8Vw5jhfQ^%)j@ zuBS@tB+fxtV5y?gToNP}+iWaxG3&zk<|nEd_XHicFoE~HqJI4|yk}3jLDyoJ2eM?cRTi{~I~D1+49y|7CpN?EpDq z2g05SM}bzQ1BkhF!_%4QVCDwNEyPY#i61fAU{}?C48oYs(BN47AMqXhO+jh`t-j96 zEOF^ZG150p)NF2IFf%>L{WtN=cVe{gl3v4e{NEr|K&yX+dfZEdR=K4FpjEz;DD8I? zevYoOAW^_ft@0S!D~TmUvE^KkT{#}r#8oW8dAhbwP5cW*o$nP$^;RTaq3>$%I?2hZ z#MzX5f%k+Yv>}nt%3Gt^ro_j|rZu}Yv4*17dI_o89d3d{XF#iygulj3@G}FyN>Y|1 zO3q(aVFp6yJSR5W=8traya4#`g`Y9@L)D5_ymn+>xDa< z;qnu4{|^3Rzri2dmT4D{A%L6f9fwSLGwE^E28@8*&mc{AgEUf#;3!B#tJUJaatt>X zaI2*kTs8JpWY?``YVO%%f62hr#bnMI*NhLK+&b|&cYFih6z&}(;EzlZ+)Ij*(s-Zw zcU|WR_;}75{vXC^r;CF7tkUw*@-po0U*Eb8jnT{_2L`15IX0%L-j%|>B6m&ohm@Xn zYFSw-H7zyEFJ9sgT7o@F%I2)UvdrJGauFknC_sYE8F-#J9=V>ly z^TTCU+~|fGs2P-#6+=nJ^bGoP!wH_r(0Tiie>m*d+H5;rTVJ`p1^aKeq^q}9Vk41t zU=*l{5q@~khS^4;51V!zLL4{~zU9UtecG(!&|tXltsOnyA#~1_ZtgpiaqLiZyhwFx zb8}6@WXk zZ)s@M2fdh6O*S>6*HgP^)ZtrPbw&!$1%ln$2;{xL1BmI)-g7&Fh;l@~b^!^$NP3T9 z!S zYK*ZifP=Bqk25E}35_v+C&0mSc2=VtlaYCrgJVEbj%+L#3!2U|MhL*-nYc8^o_ zKzXbWBd^Me1FLgCz`Jr?RMeIzNLv1PzVx%f^E5 zu=2-ohLM+z1#|ECWGF34YZu(?{M~Kk4_OH1Wn;k;Aa9Q;B*HO&yzbHzM9jXT-eJL` zQ6XKGml&mKdlWbi;T{pm>W^vCkgD;Lu+BOF5L}rf7R>r)R!Lb_Ti(l~9EbPZ7$eW{ zhT86j0t=P}HK`FxD81W8%8yShV_^XIaRNdv-ngNKR1hCn8lmn zEnc$#n$@8x0x;Ls*0;7m*^JwN$(9o>bq#f!9ksPY#z`vXwTn=Wvl18gj`=g`aE!50 z4xXp7iWF_=GEG^h9vaCVq}bGieMXP_H{ioV(aQv#!0@2cHGRLPr)YYbrpyn+ZP1j@ zJNX+msGwX4q?`kq%09o~^YHM|{RmAbX}Va`<(jV5v_Vtu!@+o8*7QM5 zpVssznsVO_hLi6&KquiLCV!HqXJ~qXrgBy*{I_YIYxWHPxTY^?`U_3}psDQdjBrKh zFc^MaqOw%_tWt*Y@Fin%1mT7u|rl)DTTGNf1UZUxTHN9Qa&ujXirq5{l zvZfuHzNx8?2F!dEXnqH*oO`3i}(=TZHkfyI_`nsln&@`7TV@Nll z=|oLuX}UnuGc{eSX``ke()0#RKc(rHHGNFe7d8E&;Mj;a94`hgt{tK298$P1)U;Z=H)@_h1;e8&ad=8Vk9c=2M*U6OxP_u%-aX;n zGy8yd--CM(6XM+o^w{2vJssXKcc1I*+RMEZy8Px;e`xAk=&Fsn<{SxpF&@WJ2uL7z zh&nR?$RM6}9ZZ;5se59+I#1!~{OFK{K|mcX5OQ#IssgkI;>gc%RAGK}d;&^vBr8>w z1vd3!5f*#FhPcsIvKf1& zM#)A2viF)5A3CmUY^}m-KwS;SEw%NHm7CKo8!DTy=(eqiGx%17nKctjaB4r_jC4Bh z(%QuePk-*5x$R|{_X}LBv!$_log*2IzEP0fb5+_blH^O5OT3&9E?jtAaxyA-N>UbP zlasNpWev`!osyiq5K9#+8e5yIYnrzuv7JZKY)Uf4If=t3y@Lz76DJ4Wb5|}pZLyQ< zVJE7->=V-6z8~G})cIbRqjT=fc8^!5m~#Bv?bWp6Vz@ILh9+VbX=(`lXpY8(*IAF@ zrXh@p1FJ)MpQS|`<97mhW2e_IaPi4A##oPo173%r$;W$;<59VzpezUT#rc(q11k=b zP#O@l(-^-cu-o$f40()Cd3eo-^47p^;=t;(Ltc^=ZA|^02i}$!pl@Y8Qy$$-{y3+$ z<*_1@a5KjEZG?j@Zv^C-{IT0M@^-;);!sAi8+qH|XUiL7txu#=`iSju(Ktz*q{{h1FX70^>QXVvsK#e?7>D09!$5`~_*a*u6 zQV!NT%ZhYEa{vzPyNxmO3~#9I-t*ks&I!}AQzXy36q(NZpX5oNqY!rLjBnpD^1Snr z@nu&Un`aF~#?N@t8Gjf?Ys#>WWIvV6-Wl`Z=*7c6qsRFvUZ65R1)ak1plmy&oQIS0 z87Dni(`A~j(3H;({VO%ypedgfx^wJA%ApVGZcRU;>7AN>QPYPseMZxlNO7xP)-(sz zOn#821*DMsy!MxIHmbfC<816tS+}`HYnJvn&Ym-4PEt(I`=(GV&Kdk9|PyjB!U0G3>o-@ufb8@4g=>& zjCWiy7~WDijdjV;@L6{+$igm2tJ45C9MmS= z>1DfQSc|6H?Ux*Dh2tqTJ~G}R4{ws#&KW{E|!BmW%f9g-wM6}cVmpaC2+9i z#n1&aKII*3oXWjYk_cmrslW5!V9P6nyh6B99^Fm;vd5|Qkk{3?jh(zLFKOj3ZpqsP zyD1Z_&b3+jGk)3Q)X7%<4mM7`7xK9NYz(cuvd5|1Bc(Uv)M2QIuF5+MGELiKT4e~= zn{jGNUXMMGQ&Xr+jysI8ie#LG+U|#9oXWb7jGa2`!)^iOdFLb3pK&VNBn|rjGfoYA zaEwyTTj}p*jQUR~2gjJ7CPiEQoTiUy+LtkBbIsOpx7?n_oU_VPy*?YeoE-|ffN~+~ zTPE)btnJRgcQnb%_BqM6S!(RLdas+@`4rDchFeD=&M3yWLwlWeoKZXH{+Bjytm*4J;OtyD03}xQ;{+;dHC%)M6q13{C-lQix9DGM~V);&lZQEO@&m(?! z*OA?#-mD~Ne$Eol91G{iv1qLpmxn})%N!*am__HIkvlrtp;(RPn)a~Bbqqoef1g8F z=W;w(Xd5tUXnmR3)t}4n9?a0XfkATo#UL13f0kUHA#Z@gDEe#4@&AEfXkCcNaD19v zxF)>?90t?>#gKu|B*C2n4nyk%Q@CGl*`kca+&4ny|kYvE7DHhhsd1o zwt>WIn5g`X50|J}B(+36T8+yGSJP#*1X~&3fI)ilTDq)>bHJ|btMkhtim&Pvt|70{ zznFP(S2+1+z>9C~m7&+s+N+=*PEELm{u}<>>2$_T2#WDPYyBQHf{^x)32;mnOQ z1+3@14ch=s3pQ15-Y`Jx-u)Z@G6Q9$rDh49i|0VM(SLNBScEI*cwECtMzNdv(J`~8 zPCJ8#;LVs;HUngOO6@@1X)T?7m@&N18wz4KxVt^U^F8sn0`>bMY?6gqaTmd2U0)vEKMSW%Z{@b&#&3y-E7@1Rv!O~KrcL%zh$lc_pw$NhJ> z%--dhS9UWtjhpivd$jZlhDsb7^4Y<|5stqnX8-}Hsii`1k3dfGq#DP`h z{SPhL7{3MJjh$Y1f#FkYjIo{o2fG~YD91c_vK$iely-&Rn0-jc0 zcWDYDrWiM&t9j17@Wm}?(!rc_5pJAeK#l0^dCnGu&O_^6JLik>^s7FkA7ie+LKNTl9{f>CTQVX^i+f$13@g!-@|%6+cf7wY>T9v zKa)PC>C2k_Cn*|Nho-;R?&EM<=srQyqe&6}Sj~Sx(*@eSLh~y%Jy*N)IbuA12Ss`8 z8@Qi)kL&(CmMU8I@A15nna9p4Pm1Yz-9KM7$#4!v{hDC@^!+lg!W_$UpYHJ79sAte z9sAmbVy@)qeHwimOYjkqJ}$$=TBJq>UG zSqXyK&zH#M8M2>&V?MhoIKByj*$;spI6hA<&;I}jfQ1`K0-ucxv!A~xt_lRRA3=oF z?B@=+=-JP+4C5!<-1-)Lo?Rp}9(-t+yNT=w%?3{1FD2X&ZtU~0VCu#EvM+ZKw~cfV zXI}mhE(H#jcouTOV!Ic_iCi#ZZpF>PnKuXdoEZsxF@&8OTCG#S{@oqV)N)tc9IU*V z9`fuskHR)UGnfI^-7$|&_tOu#_gZmhjGJ1z%L|~o!vfoSJA77+VU1xA)7^|o-C@;; zP6qqG;MB7Ui|Sl;3lpAyjBHF(W%K41Ie=zipHxiNZ-7oq1Z!l#7LhYsuYFRq_|Q?* zc9g1%t+%6%?6$mhdM-tIT*_pz9fyn4vvn2hr1Zsc(; zV9Q$zd0ovJHtKjFVlK1t2Wu#A7won??#+;t80ydXZ3k=TZ?}~{Odmpd**ZL*guJyz z2*T0I>yw&-i1`Z&$ajh{Cd%jF01@GwVK#17Z{`du5RPLzV~jjf)eS43l`Iq-*{2_D z&ae{g

o;{*64#sgrxpa|SynEGJ58nV#nmc|FV->^nyJyz`Oi4>n@v3=<(n%@Lw5 z7ITE~h4=S1ANT>v!}0h}HT{*Q>?7#zx=^Ljg;Z&#g5#&~{vIre{>y=$N6?g8E*dOY})rp%-i| z*r&f2y6LQkXl(loxLa|F_*z)H9@{dKF^6CsJsi;Lk!$~kje=NMRhKcE)&-W7GCaCa zTJQI8_wX>a@59u8RQ;X#czy4|Gt|=I3y= zj7t5T-i%R4TKPNJ81=)DmsCZRe^cJ2Dv-@(SH+!>A^M;Svauk11E%NU;ZW{jGT z_ik^-sK+2&Z^o#TdDD=gp2nz?(OwRZQHOcdP7BL4(e)ggqK-UP3O<*F=vs ziLk*jbFBGs$_U4r9KH5ttjUqBJH{;rp^3(tM_OaevDd=u?_;dVcGdk@bNo9UYeM{c zW~^D)BDu*Pa%PMPdo@aYr-M{g=ZD9dt?ScGtyK+`o1ph?9iVQGMAs+T49F=ohsTzX|GA_YBg zo<;9K2i&dD=QSkT_KKc3xQHz0w*a*l&`&nax%OLt7`u!}P6IJ-Wj^}i+D{I2C- z2(IKf6&(lOep~DlQf<&9-?9G9x85}NtA_Fi=Q{g(Xt3P)p zs2R?FfkATo8$qC{@Hn|VL;ea*D1T8t&Eo^s@xdPa{P;>(<2ZB zoJ@>!1D8sC?x;||nptr#$YBoM5i*KhnTsX>hNE2fEbLMQ>N%_VKY&Z7TFxGMfmhZ1E!a2=mlV1m zgWC6@@9UlKY$Rw3FN4m`BhSdWTQvZ^YTDmDI&|IiaU^=^*E;_(RDQ>!HR3@OmS!q0hVLmH(=c&hb@t%8 zfEI0x-vaQ)POq_G__P^g{7!&_T@J1j?tvT2!S|{u$8y+B99W%K!CX#@HpcIC@V2~H zAdlsuJW?aC3U(6*R%aDDglV*BW9oSgcw1gOO_Y0KhgXyFN+O|ghOxqB>-(O7aF28mj&hNu&}_iXnh(bWTsRJ6Iau#3t7)UK zI`_cg1GH#k@@IHMZTFtBdpiZD$J8V9_n_}>dN{mtl^~7YP)AGlY3WAhMhXZ6{N$Jt`FUtwEJbG04?~e zzn9l*S&v+&mGxRQ)PE)q`f2T6r+M}Zz0?iBHrSzRK#%LSvu5}H?6}LQq=ZMNT*zb` z6*@x3(0ktBw)gFnzi&IfjXc6x(II2%cKvOobHy`WvGXKu&2w*$!1t8!_grV6mpEx( zL6T$b-T#8F<&iUIVN6}|BF5F@_7-4V&2hF@T(Hk+-%Z`h!4A$`Gvja%{`R=Lw`1r2 z?cetfzq^F)Yotv~yo+5Mn<;wAC$_Q7fF9L^wJhfObtUm<=+&OTB z0`fVGrxcKHV5Eb5e)$^w!_O}{V=$jzeujyDobsX_0$C(`hrl)J^UF~Zc4fRSrFRC* zztGs+75R0Jo4l0~R}A6DmPuIIUC0NTv*}SVQ9G#*E$2N67Twi41g250lf<=f8yq?4 zSB@!hEZ}Tp9WD`hjEJPuT3i|5ZaTw)R=5ps#Ch0m(ZdiGIL?j}i|8oZfq9MqG6OTQ z8DQ1t+O+f}ofhcB4=<&tYh%)<@D(@=lI)7=bSQa+Uzoa z@RF|2`>^LzyxEvftu*r~`lhYkpo(B*fVcDpxEL-ssw6~-7bwDSZmKDP`T%m_NL#LwVWrxQ{}>7%hv$ zAAYv}S&6;NzP!omi1GlQlc-@L{W{yEO6At6YjQQEu5$;(N$qL8t>b;;m zxesL$j?{7CeL;4+obQ#Ra*I_I`8VlWPMzEj#e9!CO_9mW)w}V1XOtG}yGYJfFm9|r z_A4~IaTz@sJxs8tb1kh^(aX9XVaFgcpVuDeVrZXZ84h%crYTM5YRW!={wHg?Ow$#b z^1BH7S8BRJQ$AaCzgSbQ^N?p*NI#+}*EGoAtLcN9KBei)n*Jv#8e4~^zt`?u|DZed z!$^9xZ6Ul0Y;qi=&?dK71k=U{(sItD>4TyxIF zpZ^N}qM1@XILwXy0D_qkx26eaO1bWD;pz@@cYx3^SMCLQzaojP<$pyCpH2?m0juLQ z;~G%#L(dUR8^{DdhPX@6K3wFt6YgPG9_>d;#_;Dnjq6ri8no z{3>j=^Ef}lr3;nr)`r%Wnsusb`Z#hv^yB4!h<#1?eq#G&pGU)apxyXX_tg2@!}$zs z8OoqJ8W+cf7^8@puc;v>+%z~CJN@S4+DMBw#*gnVW2e^_aq$T<#`qlv2YcN1GBU9T zZdlSh=(mTB5Wx4FF-G1JIN0)T0mE`p9+&l4FXTC%HF02dUI&w;MH^Fpe8<}I?f}F0 z3+2(>$m2WLmKQ^hY{n4q3jJ7Dw!HhmnEb`zXXNd&;=t;ZKwgp-ZA@C(x;773`NJzS zl=m^%8HZyGnuU<}J|hG?t-L;|DTtUlG>ERov!8=6yqa_{=Poe48PD?U9gZ`MFX*?zMQ}B)xw~?&^+QxaGiYb@Il2`Oe2) z$D<+pHk!RhjQpUTdpJJbF}ta~V|(yo$F$?FZXcSvrz1D1aE7-}T)6M;Njo|`?(O)# zozTg-X1_Nd`9gl$p_?NGkiUwB{lXdsWZ#mmafs}lOEL$<+~v_aX9#$MfgY@V9tlbm zhL}U#CG;@djK7N@p#a;gU>it64I~G_`dM8^e3V@IzEvy8vyB6KSP24+ zqWj6^8S*9r$NX<8M-DqNwkDtt$A5)mwD-yF;4p;#HA4peFa!Zt1rE@I?5d-nhdUWb zK@ZGOpY}ev7ZJML`{W9G=)F%q&&+WW;I5TjQs5=CFSY;4`3+!m&$>A{8~dNo?w&6Z zRt@21D3#aJWz7(76RGU0ht!Amih^c{<%&=e*U;A)w(6Jo*ZZkB&@loBGnB6#cZ2xp zZB&Mhr2A!bZxDBEz_Og%s|*i{;aIefKC7O90QGb_6$?i&f6i<;dCp&98%W)%{*1P( z&9UX-xk>$zvI()X_K)n-_K`nx+*7B{nzC%h$urCR_)h=gon=>)l`URcRyG6Yo1co~ z&Zni&|rP_jH@3e z;rT}y#_)Zy85eKx4qV3E0?Qq^_*60cJ-F_})rRYCT*e&QZDM41%5VbK!mVZwzG2J& z>=c8|FlU!LHCvF@!KYcO(j|8qfRVGBBADVGv^s1Yqc=V~^mDhrxsuwUz&hCR+0R8x zH}Gt%!|Zj)HF!L1GAd=*NtzEwt@N~vVW+~4;d=_l@t=t!V!-5C4#v75D;&=QWiMci zv2y&#alA3yW07b(%fS~bI&{g`a!?ZoR_8@z^jOQmSWkzaEpKgsicfhgpOIGuyNLrU zUewWih&;p5tiff=+W>imaHG7zxQsl$^KE(aAkXd}jb9_e+48np`D6cTnoaqh?#_e zDBG$rCdxx_z^!UB?iV23IKzONaM@VLr3m+I7vUHlO(`_5VWOOZ;}LM74Avj-59=gs z%dqF8T}=cv#-wX_Lv8n-=Z1C)OpmEYrt@5oEjlvX%aZf_$f$Fj_k<31ZYZBEE;0kL zw`C-a@{6PnjT`IH+$-J-HJ1!~{E2cdv(aW-7w&c`dIr=>V`+PwW1^AD920a3!-KNz zk;)tslzjyGlQmtY=?YC{jtT!t&2P|@&l=-htm);N?$-1pn)2CTxF2ZxQ%!%R>7O-a zKgT(!tcZikC>-%b5eWSG+J7x6+_#XT-SKQ`@;7S!7R`TIQzMVFMovsPvSm6_fA}+$ z_k-@hGL)8JFVD1^HLv$)T1h8~$EX}>nYk>_0&twwa)!WtQ`^Eb1kg1M<{a0YH-M+% z6AtF5)LAp<1MqwS*mz+dFoGo`L!2lc2t{Qsj>WY2u8+XM%#``7aq(O3L`(JUM0pvZ$?^U*!zxb3l`>CgP#&c-09pBbbk=ljxw^m}VjIhYltGSRjXvegs|HU~j+$TGCijG~fP|=s*4!Iqp zk~{Z7b_Zndoi#$`{k!mc?zf9C>eqbO-mCMVXXkc3=k5OVT(%gTpKB($)V$M^SJAwS zSUK^46J2W_%=vAhp5H#h<|wya&2PCyurcmyu$eDr>R^vl>)OcW`I>NFS4?HUq#T!0 zWRA~6#^Lxl93#M}860M`$G{Ks+e(lSFbX&?)T(tiGE$am-6!B?PBxf?prL9Vznd|t zb-Uo<^3~uT6MlKaA}Q6nNv#Nq!*?4TcTzE}D+h0M+^N^nx?IlTRrWQ5Igg!oE8SPe zSvo$2d{XoOjc%n+@_&UBr-BAM9!^}8*IeVp_vh_!z8lvNb~5e>^invpayVHWoT1h9 z9e*<-@Kv&`khvUs7FaiF9A^#X9^P)T@NAAlSCgM0{MrSdMu!95lP?4YXofrBN_M*Y z>YbWhshfgMUHP@IOAuQ)dd>|MuhHH}M&4_uC^|Zh% ze0Zk9&hR~jOIdMXbtsP=vN1;d0yr2u{f@%p%qQI#W91mro=2@kIeMdW_cLTvy)KnR zBk%Mqc@JUy$8xb=NKL&|!EWNf>hMg_$+T!=>Uj-#JAZp1k8dK%!#g~bmpu5#|qt}#a5-Eg3t_nD>^ z;W&;qhE`r*(bTx_LxW}eGsZ-D2oAVaO~!q6FXy52dN~ih9TT|cJFtc`QHCxZv^7NIlyN9;vGMCF?Su0 zZ^r)g_S>)iH|CtD1wgglLAnjN-Z5_mSsBeGy;_+MCg5A%&OU{3<%nfGFO z2Oh~V&!`I@-L&M@gPr+h8GP7TZ@tO8$tUuc^E&Pu^4o#?_sjg$o%@|VH}7Yi=d1Gk z5>3?!+NbXyNxydZrEouxcYf>VBV5q_$)7=<3db;EF$oX!$HM3>adJ86@vI+;!)UnD0V*4a?EELgb5KZ z$CMUJFGL5D&~$C$4a$#iv)AHSZ_bjZSj^j624cCyGA;S3Ghkyear zAk43n2+gh?{1*{xqBkRc4)W*CROvWzdE?AdTo7MNzjDRJ;`cM1*^0}L*D?=t6jvDk z82#odZbV$(NAnanGJXm}9;>)9aqgF(R;Rp@q*FKrNxY0J=6Va`chPSVomi)LFy6`J z{E{7R+^6#grP@n&c=1=6;u6JTkAv8;@P6KualBKw13b(9QP(?5)$G}HqTmlx@Hr|& zL3}$CJ@+c{i^Z82?>ttJUviC$3Z&fFZTPz#msH?*XP7%Qpwp1=;IElA?A652WQJ<# z!Zf&jkhfl^0WoY)em*@LXTdt;2>AaM*J|%`1?eWo`@D`=kZyLodvv^l^cKhaf?{Iv zUs2?}jOdl*$NzvVdS6srK|#8z*75H9lq6ml{~%KEzNF%fj4x)!9$?*gC1c`OGR%XE zL`pLL7+t^7DBQ&OD$<8<6mD|-9L9U(v%*a)NaF(y?^`N`6gcGhF_q_e;E?IZReHzA zf6Ew8eo^Ahk0+VWr@krN!h&=?qDktDlrI#~&F5CZZeL?IRr!HcnsVZVVE`8}J*K%8ay5!{@>dm-@& z-iEmzrJ}hc9)r7gymzS-H%Od8U&F={+j%Dpo1fUtz$fUqg^3|9*b}{5@J9AZMkJnP z;FGj(D)9^hFYs7gucRFB2GB*?cV6Om419`rzr;O0v4)`*d#VeXpV-B~OLX8xiF@d~ zRQsNqXl1&~yay%jvcyQTXXwBciIXU~!s9)`4NN>v-)65_0L?DmnWlZ{*+>u(op~ zBj2jBCt0|ZlPBaBxGDY*j2S3gD|EuG$_UY5s%`J zdxaEu6Wqi+DUC}vig}r0CTcb}@h~$r$$egY^PLziyrkFgoS>9dl6T~r81lX3ZSWG! z&i6Pf^GYfb zzhmIl-W8IQRS6Ecy$d{ zT&|foUX`Tmm$bQwN0^gpiSC!&?IuoPzSn8~J~z?9@HLu$z)ify-<*n(8P%tGG=+L?w>8gN3}vW13FvZv2Ni8R?AX)8iKL z@kXPe=g@!+aWq@6Yx{xJNG5i3Y9M!@&s5r;{kW104;r=N7bev06oH00>%W*G}SZ9r+ za-e$&gS%&s=X}xKE=+}U)Pt1w37V&jk#5atH34;-QGOFGEk*WzqAE`u0L4GK)klj@b_!_hOA5we< znr{VsRRXS1C4N=JFUJ?2$1z5Sh-T;tiE-5J6t^tcT4nt^JXpJBTT6Em>Ka-$SJu~;Rn;}{@a+1!sHg52sVSuu{w1Zerj^%~ zrONzm@bZV$&X~HSd^(+$;dJgZ0beam`CDtJ`xn=)pT5x_@!J_wOHZ3shcmoW@|&qb zG}Z3%k6g0zOekb7onEn|VyB$6hgSkJVB=eANrKr@PY?E#P#g3uD=0L6e5%&sg3}G| zRo<08-onO@PYAEB;<4#pqx?=a`&2M}F{ld4z}kQqHr>gv;jBMCPvLh+Y@l4nGx69e z8E+>pSYbYocKaJV%xRw6nN}5!ktDm5h+{{QZmz6rseu=t@-+Q6H&WeE!7(`Q^wG-wx#Y81Vt;WtlwO>sYVA?dtF$$f|Wwl_jS}O zPdC@JwAOFNlq%g=Tia3t7hOk^80_iV)`sdd`&jx2=cHw=b4xQ$LXGMzovv~aP?VPD&5c{CTTF49%jY@ihMKLLQ5J0Eu(@$#y1udn(P}o;G_S8|sNUwJt1sS+ z3P3Q)#IiFME=?~#dEr^hS1dmJq@Poi#usrH(Ed?7OpcN54}s6G`1?MQbIYboeTyo zOYVERu_4X+PfNx12h}xwyzc5ttM$Xz#YdrRDAGi#8yh#)p-!tRTkv09-w2|Ly1sJL zrb=nkusLb<87ZFi29z1~B~Kn(qk~4ETf?@RO59ET!RZ#1ly!@$RQ0)uZG~;ldPJ*R zo14+?r>k*`*Ecr9zpf=+y|q%+Tvk0**Vj}wV3x>7gHJf6FQ{8D?QK)#R>{VuDn2u& zMdRr~3rBF{&{Bg>VWkj!n0S}BNv_goEo*F8kAl_Ipe3qDTj#ow55lIV*5(@ZELYWU zRDDJrT0QPQDA|{P>Esg07s3tbmrrD?(_6sUed3>e%_;{JZOXq{Y@&=?d$+Hnx zTVII>33FxkVJhWxi#)&o2a)vw*}$eNEZu&)n0HP#mc9tUZ4=%;e7Evl%5Zo=I-EI@ z$GAky9qQGkIps%YDlUfaDO?I+D9;$m`?zlFRcE!r5r zUEuBfjetCkotQsVQ7G>=*cpfSk7hXWN34PyLqA@3X=>a@9@#ZUelG%`tu&c%6$po0 z7aGcP_Yt^QFDw_!igZKs5EO#13%SfXvz(=D zhCdV-xz*H>tm|+gimUj_xYBkw{xv-PkGFWnpKtN>=NV$ksQ4Tg8=n5_EZ+E#z8e@k z?*$F#3B=UdZy7_sDY)pj78m`w3d}hJFY?EO8pH6X7zUI)pJOwZVEFUtkMeOIK)#Z^ zHVnTBmzht{e=~U2AN|N*0cz$E{o9folX=7cz zcrlb2d#PE4{a)rv7SmgMIEELvi6Z-EjlpwqH}W_JjeS0{M@n7IF;F^eBE|FYx^^!_ zxyFuC?a9MKH;+6jhV6&^spJu#?S=eW@?%u{AkTiaN4PQP2aES0!?|Z z=zoEx8#LXm=|?pEgr@gs`VCE=)bw99eO1%_n*LhT7|PFdxMM!)L`~1rv`SOf7yV^l zAkgbH{|Qa+(ey!0xtPT8KhTtj8hKfz1^u(;GnqH;pjhcQ+(=TcIf~NnW=^L836jI_cVP&yT7gJV7$bbeu1WwNs<06 z&Ck_zsdhh4(;Dqwr)jHp-=X>4ntoinm-6{UIvn$O=@{7X^kJa80v(_>?BAgFigul*4phrvTj$70DcvCG+a#!O zBf_DVLOIlDVOZ*-^te~qVf~T;)h~(mcUxRURgv**4gd;U~C1FZ&OU9Kyo}H z^`t=ZJ>*IhNTg;%1(NeADO4bNkXa8ENSK$tDUcB4q5_HFmZ1U(hPj;;NFHOtkpc-Z z_C6?(%x2a?1(FZ49=lN>`79F;6-dS~UZ_Cw|5)5mf#kE~LIsj9Gk>81$@dwr9||OI zGWAe_WIOZOjRMKPGrdrOq?+l43M8T+6Dp8g!F)yvBqJEHX9bcUBiMUOfn+CgBnl+| z$`V8hB3M7k}Zlpl+WhN9Uko=T^BL$LI7&uZOIiGB#Kr)AcBLxyZnYIE+4MkfD zB=szWr9dK6BTIo~5T$okASq*UECrIYAVw5OqyvZ)NJKj+QXnZ{w1X&+d>H83R$E;g4eCBK=LHnNP(n^qAUfHBbg6NfuxB3mIBFTOv_Rr`8vf}3M3op zZz+&8(BD!ZkuTE^ra*E7BJ@Rpmd;$fw61!opR8S$!j#H&`3!ca!@xUZ z>mqO-NJDoHlc8U*h@bFE$4?LEleo9PiUF(F>vwEQ(W)LpV7bf;q{)im-8Uv}BWany zp2ER2$ZP@NegDum0++LJw`}ZC;Ar{Fge5~A0>S#SAoWaSka#2EO8QtR^|{aS@3UBj?j7DE71xudKr`Cm=Hym8X_95bO|yPTiA1Gl^FxjXDI#{WWbao z(jv&vR!~|aM#n=bTYzJtk#-OomDW@VwL+8q!;lFg8DM z-?`iG1dJcV0IJErWb5$~;(LhiCA|DYOm>pyF>Vrbho*)wEKMhDUO9*VCR_?G#!gSl z<7Yv}80!K!7(4ySFi7DW(HP@*0vs%7XEzGL*%HgaHBOcnFHt8On|~f3cX7GF7-J<) zWXrn`FImQ?JW?aC3U(6*Rwo85*Ohxd=>cF23w z6cRlBc-^Hbh?teY@aGu@lwoM@#f3K2BnGp)ujIvH5!u?vXH5B#+_IL_+g2 zu*J1-BsNbO%qq*pvYNIGt5c5lGM5%@OuB|Q)OJ4<*gTr2Wz;@u%R(1d_F1d2_|OW= zyMd*%4r!Psv1vfNp<%sdW9#fU7?yns!6!{& z40raSjK5n`!HdBQUJQDVb{D)D{F9m&ycoRT#i0AO`>!<>ycq6+7lX>82&mx2pn?~J z3SJB)cW#N+$TLnkZ!0{E2Xr9S{~ z@KHlef5N#Frft2(N#`8fhkY2(ufb&Cq%r*+eVe1sUSfd5-^}AV@AEhFU4Gs^rqk!` z#cU|7WsOd?`Hbdp0oFGMH*NWT!B{1p8%(Mf*0D(K`^`i1D^87yV=dAopR5juGl zrS|Z7yAKJ1PD;&&=;ZMf9HNtFG0_m6WM2A)PFCWc5}o`DV}|IYeBGV>dHbtODncg- zDf9uI{1metqLa^1RyXM6No-~zI{ABMEJP=-BNw8RcQRy%P6~J)qLV&rxF6^wKmLx; z$^T&r-Jp}D3>l)6moa3BPJWN&3(?7sk&DpD4Gh{dIyo36cyFPT*Pz6LPJWEHAwnlF zVoezQF-XYx&akn>RNe{0<|pPdaD-0&l$8;olbabhLMOK}aD+~BR%)S>Z44Ztld_9O zgibayaD+|@gc_lfOLJR#${h-p+UtIw`Y{ zgP@bIvJe(JDQX)LI{AH;DMBZAPS*3EYdF#@9D z$j7~4Xiy9~W&*Poeq243CHy~t5^|*f4p72;cfA(?7(@lK7qqcK^2V^DvFxUYos&@g zf5a?DlXW6Mtb-oT-PaW*|uqOWfdsC^cT9p*#73{EDgv!{9*7shS!>Kbony7`~@)TvIb~V3oaRFR&bpbwO6R&%%Rm zL1Rp~Y^?8fl%o)tXPH?CrX0&*H*qNAIRI^CmV>dL4nHdy=dICEy|8>nUKQ*n4y?|f zv2K{8MH_~r$;SG4NG{h6nLlJ9l$VY5jlp0b34dcuTG?1%A>=V%l*jRd$=}tmn>esK z)V)vAqK)y}1>P?2NGpF>LJj3*V|}Y3?_pC&grhuOcWDYDCIOIWo?$>uy7$74w$fz0 zPD8lfV0{}A?hzBol1I51p@-&n;6F(?66<4qGpnR5t7)UKIuD_}98HThCVz%E)OP<{ zVSUWMGInlQ9=4>&48)m9sAe&2SH$YrUl=3#FpJ(HRu>IjteqVc<_2N1X5JGP2mDyD zIM69b%mXdg^!=K$U!XgmQ&Pd=KsRW9x2A%{!ChvTTz`v?_!Q#OG zTJwU%ffpP{HCr1&ad}EDlt#I8edjKn05f-H%(!@(30O zDp(w-U~!;=#eoVI2P#+`s93(+1D_B3qC@xt!~7AXbNWQ>088^^HQnaev8O^3lm~&!=UAIP&{p7xb1Xce=e9~ zHkZydn@i_$YqVk zd3o$K<)bZcNURQ!D*4zt#~b<(EKUypLs72d|A^i}9#?{8DB=|{)(CddG3B7TRsod5^bkoorG zR|Gu4sFpicY^!zFW$-}AY;QCK8asSCUCWI0V^6aFta+HbQD${K+{4V|-_keFSg(lI zG_uvu#fOf1vfnvchD%pV9O-pZ17`K9Ua?^`(E_%WnN4O-}<_S8u&G;Xi=D^)~bfeO*NsEftf|KWN3{Ub7-)kp&v~#F51m}f@4+Nm~fn5 z;C0wzxM>Ju;!qCdT}q2K#*fdHvD51-xcGz_W30!)0k7N8yana}xS_Z(6c6WiOJFx~ zV0F0H{M)o>WBm9Up*&ELgZZO7 z=WOH&05VPr7tJG($B#&jp_SL=ni}`9C}dZ2&#MpsBAQINvk;DJ>Bbn*Y}N=Dnu`#Q z^I&64I8sw5^y5au!~hFnH*;v(SteWF9yrW~n=wY7;SIIjd!BpRIbnKsisV_Vk?DMX zFO;z?!}EJthRB$^tX%wzJ4pHQC@5^5=b}Tx^LJS%!ytbgDD9L?ehMhZgUl)U%oox` zYz`Q9!|2%}#5=`S_q$cX8W)$~|RWvgyfP>trBN%4@}q!Kf?!m9OgXw1Rc(JcyKj-3uo6ki-XPq4LTlggtKv}mPEd2DefJ&7i|h@u9ad`Jxd_^g_T8NjX!Px3 z@rw|_aQX4c7T0_2yE_q!+IROb&ohf9=T7{$OlOwjg80ADHPpU)oY@Pt?|#n854GGjb?hG_8l0<(!LwPVcyYDf*aBmPf zx}qEHyI(N9?-nzB$+Gx~Oz%0xRm6WvF4Vp|hV3iTz7vJhp0)3|)6IKJ`|k6|k!auj z2a6tQ-|={xP`@rnthU)$Vhigc(!RTtaU<=!V_1KY_MPbFMcQ{)GH|4Q_ZBNM+8g9n z`bOG!vJXV0eK(!yM%s5*F`-ENPP8*4?YqYrIMTkGOE%KJo5XY@?K?i1w)WizDB9A# zlVgW0?YlqI-_pL@OTM%A-AWe6(!S%7I--3i9YCag_cLZL(!LYjyo2lwG6AWH_T8T- zKhnPA=2DjS-B{kWgJ|FVim6)KcZ(T5(!R?h8)@GSrtnDnPIhLBwC}E_tVsLryNnxY z-~EKXk@lS|+;_V-h`=O~_MIq#TH1Gir7TPP?ieOzY2U4)zomWm5#Ab0`|gAEx3uq0 zp}(blcNY1BY2Vc%Kwq@)s7Y^W-`&Ra`=fowXVqxm-NHh@OWJq-wa9SpRGtly9|Vu1 zv~I4?y>#+s@(3EA)5P4mpTYa6Ef@~D%i!fUxy5j%S&Pf;?@==u5!{L~Tnlk)*b}&G z#?)@Yjv+OC6#ScBcgBvB9Yii-bhl!BWs~DJ`w%;>)^S_jLL%NxNa%-5=t0K6NfKfr z9DDJQ70SLwWUo}RuTiq!FtR^p$-ddhzQxE+%3)Zc>fpn?JO&>nu{xM%v?N=yBMQh(c$GjXWPR2<8aDo<^|F)x0>62Ezg@++MU|7oe&2r*3s zz~G&Vj9l!u^%#?stIb+aY+|ygpzzd!rWu!k|91H(dqtu86W6E`zgAajtdPmIEz*^?nU{o~@w zv^t(cDN^CQjDL_VO)QWe+I(^xLO0u+7{$6?Z)?KCUu44$>Il5|cQ`SdkVHG3*n5h@Of$`Wc3-byg7K9f~ zXzs@*2VBD9GAQFS90p9C^dz|eWgEjzg(JgbTq&lza4GnjI1I>eH(CzHx*#ju&3Iw* zZE1`N$2Dxr*?AV_NFnnq2gZwGIkNR6Tk&%LmJxz*#(H{|ytlB3&T>&6si~JL*i9T* zopP*GucAd8Q_tC05J7cUK#w2F=;iz!7gtS@=X3XUNQN*8g>(h zGQJ6UNm{fqe!IZi@+L!GA>5chLDQl2R^=J{|;fMt1@RZ^DKv{6`{ zCbXCNv}j|}HN2s=d(T*vodVOdDhdKSV^eIYks&t4dl?y=1P$i-(810P<*_A2rZYCh zI~f^YYQpAO%aQS+897|DYeA_eY2O>xBcFHr@dnbr9Ml;4heOzC(-YI<^PG;0Yoh_L zanCq9Yd%DbLALJGlx620D6A)?z1xsB(-cg)sco-|vnnM0LZpw2=`YGkI}c%)c9TwfGqLM~q}^s=;Y{~1J`Fwc zKJWD+nz+Zs-yc6Ze{s<;cepzr&3a4@RC(#RxQMMB8bbz&COfXQ8&Equ#lk|di)|Ep zLMIeE33+%znIJ%c(;A2qiC*hEnR}8O!AtMxe;5=54Uvdow#=)_W5xWh4x8sru9PbQshX!;S@*Vy` zS}af~c94N$2iYh#F~cB2vEK)Fb?~`@bdwW&o}$o_3NU^R?orhm6r{H}!50)0ixb5T zLKK^jS&)HZ2lstSWE93PXFY~{$o!66h+@BtFhPi7FC-VD*hD;o3=})aK(T{wsT5KL zX&inVJf`wI4;(W6xXS18@$WIc5XI&p13?Cg9ei6!SrosY>1CkUK?aH)gedk*=JWec zK(be|$_f6+g7%DJe-ZNETPXH=v8OX| zgktl_3|hS%Ab!cSUg86+77N8*zzWDhv9XKSaTq}PCG9zhy$s(O#U8=pSSa>Xh{+G~ z+=O(knJ9J;q1bXfQcoy$Fu_gmd#xZsvFEWA(H=5Xnh1J{Vh0<%1i!cqA{6^YM$bgC zg9ycLVBky?JBU#1AJI1x#SS7AyOfeMQS2bvLxz*jAVRU{QB)R+9atzfH`EETQ0yQJ z#SXGi>>vxp4zf_}V4zU!;36-GN zopJX;f=iVW_roHB(RYi8u>wzTCnD`GA1lzeF#b(%IOCH7eP1h5DvAkxe}wRK66suL z;OTJ*4A$KLrtGhXY|7<;&Ani36QS?V2*!SnO6W6^(3vVBVf>p8n1t@P68fr1=xZjS z3BZmC~bdiBz!{@_x7OX>8~bbnAOupS9{_sc6 zm{K}>TG`UFE_^Xz02t2oHX92kZwy;#QZuw)hRfjIS8Ck*RN&qw3|rk+2?P9m#0~z{ zfeOViQ{aw*z)VD2<+ljMu0Sr1*K3eE{-d zWW2Q=H6qBkXQ3ztG%6Nh3L?q4hiV_lFHZa?0Kd~+IO!kqvIyg)?RJZ&hvmGH_)PuspmD|ZF!3zk99zK zERK=K1wdO~Ie^jWa5KjEW#i1S;Zci#NmvZMW9gT5GLswRNrQ zqs3>fRjXZh*S4-ph_qJi)?MAITmSX{`+ev8&Y6433j}H{12^A%^Z4d*=FFLy-^@4b zVR!R)KI9Q2VE#~~NM1fpei7ttvO*#p4$ur)l>%J>+ z^0X$*HkUvtS%%p7IL8-`M?<&Je?t@?^nb_UBP%RB16Rj(19?91AC<>X z%H#RIGyiMwV|*JPSHz!+k#fg~4QnuGS_f5#}?2 zN?b>ZhI1R;;r}uz{8@K&XCKlhE{_5VE)P1I;X$jE3N8Ov3#^X$n=yc>5?FsZ{hJ!M$Gj7Nr*`6+KAs7d=Rz zx2gL*N*`7FOQl4;!(Srp38_J6wB=DjK z2~_kTfeJ1UDteGWMGq3F=s^M%JxHLU2MM$mFFVtf;}oEx2MJX4Ac2Y=Bv8?V1S)!v zKt&G{sOUig-8UJ^5j{xYMGq3F=s^M%JxHK$YdFz^1YYzYfr=g^P|E)ObtkU&Kb5~%1w0u?<-peZz9rXzZgKt&G{ zsOUigou&Sw2MN6BK>`&$NT8wz2~_kTfr=g^P|?!YDzAuo6u10Wwe5QmSsr)GAXDL5ddFhAn$0$TeJg7TqgXRr8I^HLaKVchi z{B=wWRl>fEJ$M;<<}5IDFH^hOCpM2W-CpM6&cwLKy1stY`pyfh7H=LnY5iur)tduv zU1!HY;_J1Wv)+TR5c}^H2ak_t=jv#3apOYO$5e3qped+N(bkks0}jT^L|siphT(^= zyq@|NWOVUJboVHc98DDl_}_gqQC+E5aw<#znnfWQ}Of9Os|3FaYihxzAkyv zb;;u8aM=3_`YqUVrP)g;maTW-FbWyOlnWPLmpu78^qk%SEQR+M*mlT@>Z(dnz_Wc* zR$ItiRkwIK_1SEXlrRI86&0o|in=l6g_RZ2XuT7SXz3ChAzBqKiQ>sgv%-@YKW6UO z%E~$G6QL6F{PjxqBWCy*aCYYse?ubN4NAxMo`FTHD*U zl>vL;pH6e)OG+6vW8uEwWWn^PRA4o9+{H}$Lj-emTA^5Qu>MPtBgt0iV%4GGIw5TyZu0fccUem$wtutfR!{LD8KxAIT zcZTx}d7hvw2lK@_g2jQ=;~9a290#+`hMz0%c}yA^pYkwFisW$(!s5UxW8YDd0&8?akBW)3_->hnGo=_@^_N8Zj(Po>0G4?l=7XSf1T3hO8Jh^{T!vAQMy6t z=aha)Df<rBt90kr zt*NeQ8|Dv_sxo3~2V8i}++(3a6_P^ZV~!AWp4ZOA(44D;g!6~ww6R-c{=m6IR_71? zqg`JgxUTcUWbNjGh3htR-cb5?GiP9nqhV!XOpV9FVGb7CW3XtjwP?v|d5KYMC>LJ)SfC3w_#N z#oxjO*CjD+fQ?#dKl*b9zNGz|GrZy1q@gmLG@x6^+2i1TL--hGmLxZz4!fN*AX)f? z-}mrK5q}S?<8(P<9pwl%oKAW9*_JpzHMteu^o-^dk8Qk`2t(e^r+rEu@mas89 zhJG~pbB3P6jX_w8!*~qWpE<)MMC#9+;aQ9UIVRwk9K)Mv%$q-FxC}3A#>t3TXCsa~ zB6|YEvHr{%ZbJq2XU^~}VZZO%}PjQ3~GupAFziX{qa>D~%Eir8Xa9SGN-Im3?;u0L~z2UxjCjD2}; zbA|`dUfllP@@M%n>bifF=M3xvqB%p@$&Tclf!{e98>9aDz1%%#i02AYFZjdvI-E1C zT+**z#Q2k;!9w~_vfx(YKLo#uyka)8-ea88f71jCwaiKlYM$d#<{r5R4jZA;Bj_$FEg4|K?xCM%oeT;9Uo(?g5WoybA$KMSU1+WEVDp$2 z|IC85B*)0WK3v-`M1z4#Io(h3Jo+cRPx9}M*g381{Fu##EmH={(IWcKuvK_j>hy;3 z7cNVT#HQc;@i6DeW|)5{zq;DLG;s;EUpZsqhv9Ptev*O&=l4q=gYf+0K8kJMQW?sQ z7tEstW{2TFN&kB9fTj>fA-Hb9EZ5= zkK-;HuAjSOz6{0$S-5dr!1y*sJ6L)2kz!s^YDD@PFo)qs*?om$8WsmukMh`Um@&WU za4xuv;8hy&}A%Tz@lTejGEq@=A5ANqH=v z$*YIm;=t+wUh_E4H^Xo=XW{3{8=_-P%0pHod2O(}^6rGZ?#99#GrRIeIr(EBX8F4; zPu^3Imw}rZOKUwGTzOe1e-a9HcC(wNY5Tm*K!QV>6bn z@kU+uzQ@9D3QUiw$7bvGa(i3DFw}{I$KV)W*0*nqT-@AHK3h_3c7#qG*1H+jTSl2X zK{;0bnDQj_ADhQl^+~h6DWzCYst6Cb))-R~sE7ag&>)y(G?&Ayh%TxZ) zy~DOQ6wD&>7y>R=_sdD)emyB(EY@b9`|~i-<5CFqY>ZZ#RVwTJaA)5_|6`QSRk}c_ ztnLtGjlAAJ0VKFt2Ph9xZ9t`J0HB?2X`V&2klqA60C#0h3os?lN_7lIo$Vt)uyh2 zlV)sQFtwvI$RszFWWLae=QSX>^U+SPqoXUG?dTkkVf@d&Qdo+yycdrD@$6rn02#nK ze_c2Y?g*FIE4i7vMrsjuF!X@Dabh^eADo%H*~@O~nlPSe4BLc9w0{(5ToUsKE&eZVAX>*#qPw0e8#i5ai=U z`1f}{;9gfzutWAf`Gfki`zd$A;p~25qs0Cvf6&RO?!5g^rF0K>M(q{vj6$bj`=th@ zeMTER&`V>>6nf}*SJhC+-6yLPmRHmb)^W}k~p{%O(tiA4`#kp(h)!nUYWu$4-N3=1T}>3cS2J^%D8 znBRqaHjXp8a(C;(icj|S?)8JQ1W#_lS?_T`&T0z;(OtJJ2u+p86XW$h4 z@z0ic3fSyTcg6{2wz~Q8N~jqHeS!)+mjb=gqu}@=EHC31N?hwoEd3<>>Gu}>r4;AU zpIWg??|>iO2P0QuE|*9yxv7Hg?=g<#a;YnGZ@M#1C~sLPFNKBIS&Sfw)JTN+*CkOh z1WxjSl{I6hm_P47AsvBf-Z*L>dg%3o9M9~aDesQBeh~ZP!p&{?X3K}AXNU=P5zVOo z9T3w6;}31zFy@8I6PB$C23=ekv|K!IPBo9z`HkFQ7W?H-_8WPkUA*bDV|UJN-;6$Nh`4!CTTnOq@3sd^lZVXP!osb8%Nv(1 z|0_UYfA!UZov@(}tvY}0pbBno!?xEcf9>D_OcdF%mEp(thT+KPuN|CEPsbR07~B}% zW=%bX<2S(KPz=NIo;5ROoel@H(~lQPu$M4ne)($$kD?sxIam%3Gpro>YX>}s@xBQI zHF+n%9uAj7&qqt+dSUrYUcD2CA=e=>c1UKdp7YlZo`O95m;4O?HF+`+u*jhILLQ%y z8OvY(+QExX{xBwwIcO~|V?2Gr!;qV}x% zEx;h2XOYa%%HQ{un)@TDT(|x#3OjDJsTK>z`>gx3#;_j>^@K$NHF=~?GxE;IgdqdR zec+CwOL<9IC)So>^}dSA;JanU9_h3~WQOaZ_jhbA5NjnnIiwUNv^M|&=_ki@5N?%g?n$q`_7NPu{ z@7un;;p7poo)jQI$;V)D7uW7h%D1V>&|5)iG>MrN?5dYuQ{Wt0^=l0XR+G+^$HdluDW2VpblJOJAjqfj3d4AY= zN9!d#A4QY$uEAQtwSp~*gZz2t!v3xS*lf8VoE{enMktyq-SbODxl{I3Jheu08}UQw zVZs?TtI3RiJZv_jz72NFsILaWjGDbDX4FdF28S8-W1(XKTSh^^6FRu4KDiXG1)PWn z|BgSHT#pCAg=?6Ut4EA~;?IFn?VXoljaRW3aLFov1! zKm(hbmStq5pEE!BfP-|t4~u)5Uqn-j?Y{SXb<^s$h9%p2MrPLofgc4BkYhi*W76-j zrA@)lZFLw1i7CflhO@Csb?6-Zr60{9_%Tjj;l?10#evnMycM*lF+YyG%}%fT@#C9g z#{3S41IJQkUO^`A1%pMyUiZ0O2mz}t5~#_W4ZAC^0}RVWc^GO&<5iBkEe@>STVOJ@ zs0q7x&*S>PEAKWi{Kilo-5HMZIqr7l@%w3G9e724tSeXEyZd3{)hUe$mw#-DAB|DkbnLwW8KB+r%*o9#I(Gf<E;Ev!2Y3-NJj;y=n6|Q{TM5apvZWp?f~LvBRexd+M7v-Sc)Ix_cM8>9dE@aqKa> zu?+aqAl$cJW_O?`fp2mDn%(D4*}Tu)n|9J>%B_YTeWuCuc)vSvxh>ErvBmCq$H~G_ zr#`SP>eTNkz5M&#S;Ah&vMz|V`_A?K%Yc#{f|u)np48J*tG%O{o?7i4CHKSFuAMvA ziO6N#(SEsNZ_svdRPj{4#Q}ogMSuy1|6I~GRXmDdNui`GGiUct^pdb)x=jFmhBf=qdRFe3dl*!T+ee+PELWco)CXk0425fO|l zPKzcERczn?E7&<-<`wK*mx`}oAHXb3C=bh#eu=ayANXKaLL4oj8{4u5&wW>`o4mF3?s(M>zjSBeJHR03xvxR z>{7Fl^7QzGq`Y2MOmdXhCvue6 zCvue6Cw>xE=+v~V6h+GGZ)HAnl-DOB<@Itg_Rqq2bJJI|d{2g4b^37TEK*+oIdacE z#FC7F^7@llh`yEAzlUHSF6H$#5Z`5i74RBpWNQ|1Q~BdA%%Z#mei6RXA6$U&VxC<@LOwBM~dF zKY))YR$hN8e=P4#uUO$n(y(q7r%izux>~#zu zE3ZF@Y^=O~1w+Tm>wiMuSb4oHf5yt|U!ZTSynZ6%#>(q2W%+WI*C%4-^*6IFW99Xq zr6@;veGO$f%Il}o-%(!wEj}7Yc|9j)?iK7`qQ9fOejfcD<@Jlm_olpl6#{I_73@@> z?p(pXh3Rjr^7;gn*YjPqE7>$xkUrAYhb*2u79J0Lm`XK11A4mQ1+=Oz#J4|&iRE$4gQe}!9liAhm$4Nrf z2TDT6xd|N?CiIFWw7^Mdp(S*(B~-qMPc709 zw)X05*!i%%RqaSV6M&~Z)09QsrR=gqEyF9!HNp4nFWWro7d3|kP+Z9^UX)rk$k zdLOs7dl~hlU%UA89(TLMogu=#yC?@t5#|U)KWm~ofcAO59uY6Wm}nRQEnW?qu9?1d z(YH082YpUn%}4&S_U&1i*LSKis&reM=L9WBo#}`C()XwUXhk)PS2nldQhD4&PaUmW zLl`x!Ra0<_L0vnr-loRp`ZgSA!Y%aOY#f5}_hn6WD{FYMNKIYa;`YW>4I#5V*T8Q( z22<1R)$hG2xsNKstAUF1hLw$Nc#v~XoH3_n{xLI7p1>4lZjh`s!OySKORR!6_2VTY-s?{1Ho`{}R` z3Nb8vcVYv;glk@0*X4JR;V|~vYL6Ll0oNFN7#tZM-)J#Ch2#3Q#bH2(<9-S=W}OZP zv(xW;_#X1>X~z7x{_U1y2+A=FnP)k;7H#F254**I)%zzb**)MmnDqqsx$kL&WTyeA-!vt={pN36@0ce#^4 zu0oo;%V4)Sl<_X)WoS`je(S-z@~(wEuH7?#h!V-;-WtZ?^P|}hAV-%K5O)&ya)D!zGAqUv2=|$>bm!hVYw+VJ*T1|aBIwpEj2bgpSEYr!sbifxoj62 zH#d~$ych_uBleQvv58rZzr?UIAuE4bk7MzpUps#ECmv;n{_%(wgR2nt${F^hnC_w<9(1wtq8}c-teAs-N8Lp~Josmn-+ga;Sbw|kZ4c`~^uwclh<; z_7`9!w!J5PyT`V9#k8T>sq_X!Fs?ZL35V-Hw*3RdBDT#vdNH=mTb*NU`&Ify*fuX_ zkFo7HS^1O7rNpJ_o5@WMxxwjwr<4fWK9O96ZQn&Hx!Cr*5F*(2$0#l5V)jIQF?)s) zV{Cf@OWg;y{T^~9*tXPcgl%8R44oQgHksz8!Wi3TUbYR}J{{7CZNJQz5w2s8)CAiuVzy#z`x=%a#IH+x{BG zITy2^L4OC^KArv!w!NHuZ`k%)1lSgAn;MK9Z2Q|xe|xZPzN?09f18EgS=e?33aHpN zXS5Nv%}qkUw!a8B#kOa`#l^O<=D1DR_FqsJ9~|4Bfy(Fu+m?hr2)3Q!Q;V=|4#5(h zw6xvWHm-Qa7 zan7Yp*Z~lNmwy)scXT%FZwZ;+1z_|CL;iK;W-&qGw)g_~zxj*X{}yg*-+4&3^%K|z zvAVUjp{c!Qab0`EvgX#cUQKvHQg+0k6KPzDy%N|>)Vvxy1(vN`9dZQHS5B&`3wJwU z8$`|0)lFz4P|~`11$&z&*%P6MEd{u4Y+J(31_)5MGTtb$`-b%$2WfY!H>E$A_FMaX zG%)SrZNRj7M8J$$Pk;lKyd$#^Kr1GIvhGcaais9|pcV&KuLS@w*V4=|9L-tyx$+i4 zUIuQ1@govx^71il>VK((zZpv_AJabH$zN}n_M4EGF=3!4Z$0d8{x(1!*X)@;M2Yg3 zk7*AAroG7uiExz1-_1%v#Jt&0O#3h-h@>N9`OC+&k4L!vVA}2d#I)~5yFV&QHLe%O zNvxJ1GP?rP=Ch2AFLx;HN=$oiO`KC*V%F}nVf#1~Kl-(+{{&Do^p61_2hxtlyFj!f zd;A@0T-CC=wV{Uk!*=7@XmG^eu2d?EC*W^Wem9;S){oqGj(U;%&Ov{LK8f`v_nm{v zednOKqCni`zH{&+m6!X@!B1CS?mGuxtGwKI4qom%2bKHILFK-4P`U3MbT^(I*6-g6 zp1p?e5hmpP&bfMxtCa5(&(=wiY3}J0&z{`>v)WHEQ~1mYJXEl zC(lf;#Mx*&FU>R3-o{N`7oP|n$D43=d)m{`dwkWF=-hPn#w|Fb-GwvSTk_9Lm*C!X zo&{foGuht8>$dPbxCdRq#UAtpBTb$Mw=>`u|FNUXJqKPo4QXvcTAPcOw=->)R-0d??FH{~yzt5OT@1 zXsC)nYk^Io1KEFM zW6(OoQuhH`zk^%}Xe~7xf!3EZdl6`T5d}pDvYD4{1FcVnG=kR8F=hl>f0|PBL2Ehi z9D~->4YLiP^?no?f!2#y9X){7pJ7%a(E2TM5omn~3m<{j)qHLdX#F((BGCG2rneoS z_0O4J1X^FueD(lZ|2NZ%K#G zDU;*cF=#!8)f|J?)b#Fv)|WC;3|gltDh92eXW$sLK8kD%TFd$R7_{b_>4Me*ygQ)v zMJ$8^TEEAnodemOrXIRFQD~sq$Z$sz-+~! z^)W0(3|b#d-(Em#e#u7X#G{jjX~?j=^G!&mR-X! zXnhXL*CS~C71m`8TAxc%4ro1y`EWq%@$`2<>ssc-0j)nraSmvGBK;lE`dIoqp!Lb* zdjqYPBEYtQ)~_(b&58L~7E6rq%D%(&w+FQ5yK0~{x1Q}Z(E3-%aN%J*W{p$WKS61M zRL_B%BGue7QP{}C%?Dh7;gEk4^5W0){c^a|)Z%Byu&4X(Iqd1aoR2AfCQH(dS|4VK{zW?Z3mS`#jRy#PlYk0{x~iJ*LGmm>s}w2vgA0 z-3^+;>z=02?55BXrEqqXLS|1sod}!`4_<$YZo9$h?!oB@^g<==&|}w6CFI<7MNopn z)w6l7`moBemD#H7@?hY_LCNf(b#~}iF%kYeoqb-#m@t4Iyw1m`GiWGgYGIjK!gJL) zPi;r5;g-RVrWU^z{BSUPX35~IlN$=w`xhrJ3g(uq3GW_)pXdD%?U9G~Yuch^I=&Lh zNs#UkYMV7MK;P%CKl%r*w*!v0D(2Z_!OxnPE^TW7Xtt`pt+l=R+{JA`;(*i9p%sUh zjmtso!sD(>o7(UIaXeYTJ6vDo)l6?(CI@$y)va1pCw{O2sasXI5}+LPTDPx?&-{i* ze9v9Hynee5Ov^Fh=m4<@`zxQ7{y->r)E{j7iR<0xtkHhk+R=Ph)U2!{0=%@TeQiqv znrGb--oAG7Txb#owA=uV73~d#yt@OXc1w$`o6acEgx-vp;NH&ES9xy+-xbJp&s0^=+(`RA;O&2cG<%c1xRM_A;+%46Ip zh6_=yF_wF-Fv8+gOiWMVvhcMy49IZTI1Xl=o)?bmV*FB?v2aJi!EyGULOHT1B+F5V zAIr;p<)5>@7$5fjoU?upicT4y@<>fyJ?xeTSiNZga8IK}jn(s6;NAQs0q$ksMtQwq z(lHk7FBpn$mZ$2hnjEwaMlb(XcJPks4T#e;nR!R9Rtc}9ztwDR4N{bpx*Lb6@`>w#G z)0VK%@E*{oA~!cTEDu{!Y<9#sYt}nWEq=tLIRrJsdK`scEq*Qd(LW1nhW<8wt%xD% zXn320NQbUD2dt+dI?q?%p_Jv`eZG1(9-YEVOuTttrMvOyus)u~hmQ5~A4*?W`e&sB zpf{cV`zalzbh6T8m7c70iPAQu>y=)o^czZlsPqw~9~6)NAAHD|&v%vD`Rc*wwCSE9 z#W-N3(hcfk?WxoPZ{2~#_|O0w%WFCDw7tNf`=U3Y$BV<+ys?J9qzqjT@f^v#2C z*X{#w!~M2hcfYo=^Pa;tcHaB*jh#O@U}NWfa8GW!@nz8iuGq2%oSL}uUvTd%6Womj zqyP8-SaAA~VqS7P4b8`pVBBUaNN}E}?yYd&)7dQf3>5cWB6e);Lo@Z|4kS+8p@{o! z1}Q4%-@D)k+_x13xG#^&8t&T+Q4a3=34~VM_aylAg!_iEl9Ld`!F_LKi-tU-<+@ zxbLm>%f)?vjw}f7yN-U*VP!eX7avys1wCWj_Y$Vq2kyH!@+i2k)NF+N&SBOg-1lV4 zjc{M)W!rGyIy_V2zH!8u_^I3rs4;eK#V^HsHR3{6x5~Tujyj?t3(wS&aL# zND=NU7mh`^?@bID;lBGb(-H2QU=42v?klR+Bi#4DnL-b^?-5Kd!hO$Y$O!lS8S5%K ztSs9LpL>WQcvyKkEq&v@d!Pg#F5LGYP-4M-XY--NxbHgFgdw}hGEr)6Y^v-~J_%!s z%Z_E>825dNl@TlAZe!pW_q~jPW89bXT?hBQiGgF>H^aa&?u&h{F78Vd)xmw|@Cn7Z z@9!Bn#(m|;XpH-Qk%42}mv5$v``$-y2lu^}!W`W95muLj`;MXi*0?V<(7Cwp_Yh2Q zU+Dm1+;_dr&DjQc*vGR3&> zDPJSE0aU&p4btjWZl-vQMG4k=Bg^xcN?w&UnKcKCx7>$O|?tzccb1!ae z_fPT;IDz4bnEE4phFv1z!$9Q{sM;Ggjzx-4)+1Om-ah=h!%$Wnq3uaKbzAG=$`H#O zJFa3}RZDAwvN`8&cd&lzXhO2>hj=k=M9ahIZIGXxS9xgFp_P@{v4>Sw9yY#m{>6!8 z_d2Gz255$l0Xn9y=JP97N4jy%cr<<@-8&NxjPD| zMsPg6Zm_1NZAs&j#->KV7zSLds&|mMnl@+xjt|Dw06+s@zcd8p^3T4VQzz%?YT5|) zIR_HMla@6rycz=lUGOYEZ6^TAxvh;v1Zx&IuclV!@QB`4fT8F#ZfaQ5j{N1IF%7F4 zT9-96Eylq=)rhQT_qNsw94bSusX6xexyJ|uNl4N#$Q=AePWADOpePNFA;wteF!4zo z7OZ1MLXq&fOX}7}Pep1xhEMezbFPAAv~@X4h&oyoo=Sz3@Q7g?6L`{^#`dh8VhmL} zNAT0qmgY7bRoo7>%h4%EI~U0!v^9hnYR&TI)vYm*8mb`{h01!Ivxcpr-nry52Pe&8 zwi~qMfqPpmV7A)AX3^YK!y2gx4~BOG(i-r*xVd>nBU)8`ov6wdjoD#I^3da4=(&A~ zz;|qC9-b*MKGw|IhB{z+dKUCt%qe+56ds}PDn9x=Kzr*$sf}$li`Ue3r>z_Myc_D8 zR=0Tej-u@oBxfQDd50>WSJkbNEX7>`Qgxd!@O8kHh;D5XU=;NbIHIe@5#wI+6#wH-1=PqUWQ{s~!g=(E6vN?Tw3V*t8{p;|hNa2JFnbD@MOcf&cnrtA(Pqp#9S&xvA9o${3u(su zj)a5b?7f9@OhM*Z4z5XBIr1^g7Jx)Yn-GLE>j`=C#^9UFdZ0W~lUEPB#evnk8z1&5 zw5VY?nzQh8^H&9V8Msj%*1;lqZLquYUWdG~a5H0m`55LxCx0AUSpF`9-QrLNPHITH zw9}a1df46kErL922fbmKABVgrtdJ^?GH-Td!|M5a=hlm*dprCvZf#*0nvWw~e=y8b z5w1TN<_26aoke1OVVHNLy|7K1vHTft)OG)BVVJd+nds?-4m%UWKN1x?_Y3VwjIjBLZ(a(8MK!=o*74VRSt1}WcT z(leDVSGqyz=akA^9pP?M{zpn5R{9I2zgD_M=^vD)&@h;e%$`6;D$hwA-RqUMD7`@G z?(?!?{m4oR>S;GV8P>?Qt2dh zKV0e2>TY_WNAP_@e11=fB(Z-YKSp`>?c}9@!5^dSv*?ZiG?cv5HyKdb7fx9v#r*@kBB;-%pIDIqrsNHwrksVzFftv>2qE6Jy0P;l}uiQi|m2Mf&!&=&+ zE~wJ@^@Ss!=^FU4hr0@q7I4(g;@KB>CXt5#dEhc?n^dzeyXf z+`LsDYmvulx8N^f%vm_@Jh5`d?k`T|V{Y$rps~*G}yf{~d{= zs-bG@q^sJxz{N`oaa@-76XS5}6tvYM_b6@3JxaTWijY&V1A4mdIGualaj~AHRZMly zG!E(#Z^fFm;;HI0kUl5lO(;$KBzwi)Ly@h$Kjs}zgk7{#O4-8=i9C!!!&k_E8Gr1o z?P}Noy?zoTRS^7uT#*s3y85Yrr&!=v4K7g-tOy-tp}Q#HS+7)4z%Ows8BB&>G8xo> zfNO-KUzn7yr+|gYo8gl9#3cMJc!Dv4GQV(T+qqnw`y#zYc!jIT4puhl6}>9q_VH79 zz!H@DP2}nTiRgMcC^+ zddze@uARCU7lQp`#Le3NUL45y$BLW17v6gikdXZBkOkvam5ZBKaXDi9){wAVv2yj2 zhRRiSiv@QL~oDIJ|<~PTWt-L=mto!v|Oq(KeFRBcOR!%D!aBZ>ei- zZ`+R5!ez^AR`;~nr`gS2@Z?%=!;*|Fw?%82ZIsg3(9lp5E_2niEw5|A8W(obM+;vy ztFg8=VLTST!iD9Wr9_dGHAcH7fdtf5s#U;V{i`?<{%tGtGDk>_xcclqjN4S8## z@p^ZAW7FEOhI9!pTxrB=Sy&oKTLp1{hYMJk?JeUb{hfI48T&=|wa^~T%U{b{R1&T^ zaPH5yf-e=rVyq)P)*ZyW;k+_*FgAZJtEX@rTUs2(XShGoqQ?BDgEu?9c*`z(0W;=z zBpkvaW9V}|%25qZmV+N%E604;Ee=DzOAp7vtS7+PmG?3RaI6Q)BQ<&Tuv;8hz4r=o z*F+eO<}CbNd9Onr$I+BG06&wLzm_!yna5Fp$XHskrvjjk3%n%#Z&+FpmmbLt-ijGF^<9`cch9Va7J6QHA&W|dA>%D#yH$0(hvbb-<{l-4O-u9WXI z1#@5hzb89l#BE9v{IIr{Ao(hBt^J(Qmh-SRsLG_ zzh3E=)%^}qgyZH=#(PZZOG^JoX(7^}|Ie5o*irR4>kCrP_+ymMo8j8T^stm><_%-nR-QfzB?b-A)~0y`EUf1BeT3|c5$AC$OJGp-y!dEHa&$UPUsr=yQg>@7(_e=`<5KCf z88_O=J<8!^CwFqpF>p$Z7>w(VHZi;0to#ftQX4PNgtooFZb zzavgE+R04-FFCOsZix}a>2IPsl9NKNG(DGGw3GW8N|_S+4M`tM?&BdhG<_?jPLn^5`*GqmoWK!w&tn zslm3C|VZrk0vfr`j@lNh`){^bjPL?fo z*;LuNtPArkF1vtn za<;1bnpt)!6N)u>J;cEAPVS#DaJ-XSR%YX!+?5O*@8ss2nOvP%2NH~UB2jh(MLRpW zFJU2^o!spAlg>`=PV!stP7$S;$wHQvenGV>bmc8SmsigucD(tY37 z5XLRun~+=oeE%tO)dzBy95_+nb<%;@$4ibm@#lNP?tv8lawOn?ArwOq8$`^3*g^|G z(ZuD?KTtG(gqWSB(P*Qa{HGf?%dbu)4?u(ILu3;a;u+86>Dcl>TK75j&7jnVp->~%l*-h`hD82im^oCOpSTfq7{vf!7*T}y+ zY=?Sdb5D3fV-t2|u3TAJ-`G@HQNdm5mCF_{uB>ZaHMXg_sbMUq@RbuPsw%1~6?^DO zQvbHPf3VoHQQqdAf_PvTCU(sN<-p_Oj?89Q(Uwd*7+PC|iNKB!OB$Ajp|N3e1#ED| z5Err0Rxb+tilDUOvN>~t0Tscy6=SnwgFPys>#Hg_XX&`Zve~L}!QS_sIJ#oun94bo z-S}bx;rp_$$Gxk{UF%_E%`h<-+Rw+&^nP7Z5bFJ!1-)MxxYMxdt-(+9hYh|uxGWil zVwgkVE*bYGqQ&y<3TNaVUy+*7jsY3X&?u;sSKQd5&Ft0;)(}D+JX-7S-NMy5b-1ky zd)Q^8bGUmtJ_ukNv+Y2@RvY|tHG=)kDFKTbQM{d6&Q9d-^AFD+*qI00T)ypl__YD= zDt%tt1FS8slzyf%%xcAA_k>8i7d<>Y5+BNl_P*DI+rF{K-8r8U??TVtP9ANeud#jd z;Rf?)zrLO?snJ6#;of)VL(Xp0=xGW&IDm5iP0d~ivWFY%ZF~C%)eV+& z24N>(Sk=&sGc0vnbY@xPG(fyn|L+i?m>`$0zK{n+dFub!x`^ zh+nw!);Rg&n8oDfW0K8~moZ_WCT~6LuDo@SN34MPLy;nR#6uW|d8fGs^8UjL37&rZ z-K-Qu%t{FA4r{y}zGy2g8qB)|;f5IlN?A0-39U_$e;DEJqeYE{BMrw@p~vf3`CSJ` zLJ~wFm{pdGWp(APM0+_NZe~oL@kU+uU4b=PQ)in?pf&)pImVZAaU2?&(0_xm2+wlA zNqv7(bpc*k@v-Ae1`TKwrrz zCQjp>vs4f*jG1$WfYBfb@35X=v(jgjav_=Witz%Ae5I3=&Qv;IX{}P;Tfy+>E4^Fk z!%AOL%Ig;xPWJqR%AS8v(Mbk+WHR)BR;k>P1@~8!e_N^Ckp*|TBMVgS$O4r+vOuQ; z7h^hdM;55ukp(JuWP!>ZS)g)97O32j1uA!Bfyy0Opg&VNFDQLQ={rhOXuwQoh|)@> zM=719^i-uwm0qg!8l|%5A97^RKd9{a2Nj)UprVruRCJPoicT_6(Mbj>I>|sqCmE>d zBm)(lWT2vx3{-TIfr?HtP|-;SDmuwPMJE}k=p+Lbon)Y0MPWIUsgPDFouTx6rI#z+ zqEvK}A-?D&0~MWQpo8#{V7(ngiZ(Yw>7nX=hSH_#{wbvosQVMjKc(~#bmo+I4&M*R zLsughKl@DbBb6Ve{4C{VPXqk%7`oSChO@b?b}%5*A1r^uBm{%09dO|>bC30XWJryV zUNYv;5Ay?pDq&y79+X&q78tsp?dY63?WQd}3qYJc0bHDW>#?sNX8<+`j_!Lcgf0hg zzkOEs+k4sTw|L$Hgt?^b9o^5~>wa~2lX^1Vyk6k$JTHtksHcIb>IQXeBFC$XvJIkT zk8*4luY~u2XrnurbR3o&-HQi$X}IpmAPQZBEz#ZZ5Xe9S8HgfFHCO=We5E<$n9HW88L9(VSiACe^jxc z>~NTh+-KMp%j13a3Wh%j!FZA|NogF_Vh>NV`9EfN$F&#itsj7{Q`MTu>U%-*w+ITg zX4INuYR%q-3^S=Yxyj{H{=w-&N|_RJL()r_ z_XrFhODVZv_-G^}YRxi?p96*`Vley+3XQ?=I_9kpF#I>jm8dn7nvKBle`1DC4YQX_ ze~W@5Fr0bWHnnE_xKpiJ31dcJI7anbt2HZS5n?d>3y8T5YRzQy6oKJirK}tMlRMvxO_lwCHDhdX8I>kFYR$5&l^6{F3`NCY_!xI%>_H zq;Cv{Uqs&+3~yq(F&NH$K#p3oKQnL)h7TqigW+o!HwME6@QcB4zL~CCvsD!BfZ@e# zH4Yd~aM4w3CNqky!SHn~jsu3@j=B)FX3_z~VE8m9AA{lZ7_ApDoZ})W!0>qtUbOF<7%e^veOYDPC*`O$n@2VV!&fqN42Dl(jl^L1!>o`P3~!-t z42D-QZVZNhgW1jn!yUC|PqOY~Fq{)kSFKqsWjSDY3$y8f;a_G>95DQTigUp5%jxfc z;pfob0mCmL-y0atm7o5C;ZQwR#(i;)TC?9U{cQ!qp@DBdzN@Cz>|j>PP6ES|Z=ry= z!RjsKJGE*8nBdb$E_K;c79bm@p+WM zOYKrWr|X_aVhq&@x2c66Pu~gWq62)+3!sd30ZLdj^iQ0Pj7X$8{4P3htoS9`Uj;Rd9SLpnv7;ldTCPaszw$}CCW!H~m?#ji9ygz1fbO;Q+~9!{Bu zvH*z@L(*q5-eIBN(DbWJeN5<=Nq>bQ$A*3*)7A8=2>nK-SJSUDIEVi<#wXH3Mh20MlDy>6(KWfNn_PJCn7l;bI&}swL^{85@@&z zl~{!;$QV}?tF=gMtf4}YU5+|4D8LJKmZ`F{_~>LiZZfNDZI}Q(a61xXrwY4ejZ1Lc zk}A4-xnc_is^=yUp!?BfTXG%+9+I>10w>1jBV}(us3i`tY_q6fJExs%$6KG`tP#zA zqS_APRyP8g4E6NEimY{W$WyNVs#{qjD#Gg87PmL9Y6uxtE!U(Yjb`0K@YsR?!6CrQ z5;UHNXO)l0OM^#NLXCq0mQppEX-}Tz3LFTYxI8uQ%7XF<2wu==jKKsFzOQTh+eEXS6~UrkR36)`#ekQ!E`~q_(K8 z?gN49AppLO&^l7DV?BAQN3aKQUFw64a#z9Y$QK@>yad4Zx9=+>9W(Yjgx$KMK@;yu z&C=CP(47}4U2KwutLg;hL56xCYjV|VB3pPn`RH4jJ$5O4AJDmkmDnACk4AzpyJ7t8 zgYgAF!>3Z#e)%QiI;{I;!`MhnK8`;XAIwtt491V~84kn0t#JGeaB~gA(j0~#!(#*{ zrl)XO_*xtWWVo+84rZO67w%&io$*U<#=_;}_;XPX;wmf$*S}$veC6Z#zr$eSIun90 zX3fX(s~nu15Nm4%g1d@#i}E zUB|Ltci0)mU2V!DI9rnT1aN5G9hw*&O5W`O*9qo)=*zV1|DD-K^Bym*GK7 zF~;$`9d@*p7W29Z;kqktK92t&!rf<)9C=I|O(Zg}U~tGiB7`H@u30anEUUFqSiK== zFC%DCLpj|U*L_#u`0g`d&GOmKjWXuuhUIZy420PccYR@-hL~#nC9V#AO_5Gui{x=mSeYWJiOz0j6Aa|I60``|pn{Ww3Qi6xI60``} zP{GMTYt>(Ha`1wag9=U#DmXc);N+l!lY{=B#!KO)q|pn{Ww3Qi6xI60``|pn{Ww3Qi6xI60``qFwbtIHCfliHdPo+bY z3Qi993gthpbe7U;rDrK!sq{Rhmn;2}(p!}NK8ncLQCf&@l=&O1bhy&2 z(uGQENb#{*tn^%U-=Op+rFScpeKH8oF$s?ybKQdRIX>z3jxjmg&|C??T}+>6?I(PE zd>FECeEx-Q@cB~U^HX^@*e0Brp9X9mSbYhwc|QaFcBRjY4nB+`q1W#EZ$6NH{w^=O zzQaHKksnrPH-LZiu2RG5Q6B05d|>0VoqqAquG3m>+LEZH{=9jcA+w9JePI7yrlV_W z%S{ES_Wk`QpX&0wf7rrws85f&@E+LssHExY-Lo(}Z~wr?=R4ofy#UPnv_A6AeFez3 zkKbO%cid?FaMt;_(UT_Jb)pUYfy&_DlS+?FW0~OH?Rl@q>2}Az8xdL~9G|cEPovMF3{+Hj0qx1*Mc*Ww;c%vCGOgwG@KRUf&lmCAgO?w4jVBXCZL^}~!8NunF z7r#`Rc?r%CxA0g#<)&`N9}d4%IFIGiX-{s)m^4Xw* z|760=Y@~Y9?K7ID@PDLmLGgOWK!ubGJ)F#!iHJ|o;VJ^6LKXb zHT6rq;Er!2JA4}d#KfYV2rZ0vH|r)bVrY6K^Kj3Jh@BXbNk4!X!H>=pZe;ow^!w+p z2sbLtacOWLv8%+0F*tf(?*$KrDTK%JgCB=^4v*yrKMC_WHGLe@d-xuSH%-(q1dlu} z+>8<|c6-6&p_G|vjwFLdIF>J6Ys#k^dVsP| zF`alP0uk9@fFIU=3c{EUG;-kYK0n2uQOI3MfMfZ^%+?5>ZWKcu2f;{X3(F?b_hA3u z#kbf?(ZZkf8VMfjMzo@R|H7RJ0d^wPG5jeBewrwasBLhn)>yLaS_(fc!O*~h%YH)N z(-Z8<6C*~J71B4}iSPn_Kba_z>a8xTq3@!^m6DUw%6R8qaAx8mNoaXlF)RBlWn0Sj zVO`cJyQb{36jhrjld8qB{0)>@I0e0mgvEVTl}&|D1C|YcYvpV zgYtL#W&FqnOO=1XFT0BTGUXrjy%Y<F`3qVStAt$xtREJ3Tq6EJFU2OwN1*%=zDIAMsqV*j6_4p9RN{Vj zu+V2Gn5LKdKK@2I!LfY4J^moR-e@%R9GK)Av_D&~Z+*55pPMWFgQcH=WLb6rV*We2mb1U}7lxC4f4JQ)M~(d43|`LIVv^YJA0Xg*vcO>r@A&M*VC}^dCj~7_gMIHCf9whCE5{v%f0g4_j9WZzP9lXz#xBa;E5Nz8 z88%m(vA^0!&oopW>DD6dgJb2!3rmJrJT}H^@ekvfJDbuNaZgrL-lbl)(;?n8k-y2I`^^p8vaKQKaC8|eN8z3(pE{k4so4Qw;b_MPK5EfvvSi*i$?-I$qk zRix=5Sd20+Yi`9=fV=WI|L$Y_J5aTFxA?#N?XWLOKK_3L9A@F$!tWYBX%X&wu=4VK zhJ7VH9b;@h{@+tL8Q(ea8ID_#&6ssM9L!EXZtdh3)r|RZErbI$Gn-J3%TY*{gX3wI z7eiJrAOAlE>-;}3A@Dcr39!5JmS@8Flt(!xuO4=b1FM$;V7i7DHCE4Ofp_J#WIS&g z+$fL5F?sp;|2oK<34b$|RzCiJXC}@c$2=x4AOC+8@(?sKCT~4l-2B~}32}1f4=dV{ zynOthI@i0bkO)V4{N1b+M9fbii0cbxEZy7TfJe$9mzehvZkREk7A_zEKd`KS`2Vc^ zFbRVY1Q)&G%xWoqEUUF;SiLD|FSWF&v2=|$>bn26@PEFaq4A|09J3nFXMeA;s6CdG zW7g1w`v+1{AwqwSU0wewhc_S6ow>h&W$12y0k)w;hR==t3&XO(FnkrL8TwN#qZ#tY z;%8%ahUa_D@{R!|e=4XMhL0vNx_`k2?Hs!2>j;QOEHZGR?@A8jX|a)ZG=7s&J$y1q zV(7kMADbBBdDoN28t)yXXoGxqbbnEKJ}dGgL5JeS;IkpmK8;5`ib=7u!@NglgE479 z5FAxh-2$Mam1lj?{V1iZAM*2*p00Gc(l({nDCPUl@ZVJWL!}QZeOl?Sm2Oe`hSGPG z4q`bVr(9{J(gvlglzv(%=ivUcOzWellS7{OIhWtKCiC&OD zUg>O&s55#dxl%9lt)j=6BQzT zS}D)Ll7Cw%^?H&Yq;$B_B~yrRLVBPczY?$D6Ld_q|$jx7b#t#^gN}XReFQc zZz;V;>0?TtSK6iYO{D=Eu;gFq2&IQBovn0%(t4$5EB(CEuPFVt(tDM@p!5}`Z!0b2 zDk#cdrgWsz2}-9cJxOV;(q^R>D7{+g*OY!w>5r8@qx2=E|D|*w1`kaCD5WPTy-ewK zO5ac_dnORR2pu`&?M;d{wvW;S)xAM!i@LWf{j|E@uk>+se^Tjl>i&|_*OZoFP{Q;w zq)2b1(!36`helv38pEl2|w#)Rllev+>HkY0qRX-W#idoqp*>o6)TI_o|=W@_x2pv$t^p!miu=U+=%a zKjV9)U)u71rT}{%p8MVVUMRPq2DX zE{>kEEAsY;F?0+>!~62m3Zw&MS0KHJPdThC*y2mNR=_R}2Bg=+0mu0lg5avWhshNg zxsicW!S6!H*&w(oZ?iZilS@Gh`0)vTL64%~J0Pi|!v6>2zso;azZ`_-a{T-=i`vF{ z{@7aDtBcykoBgEJLvW(mqoxM8(~Xl@segmRsC>uQ;J^kMh7{D<8_<&H;H8r&V&afm zxck2M7)ZkVHvjIZCE(V^re)i?S>N=tV%QSBC$jjum`ADdPEu9+pGy6-a$f2PY&Jqk zdOb(QI-XfldbNLP;*wxPGSpE7xA3NtwV-i|;@sV0C54#bK&2GFk@)dJFnk6-b{y<9 z%rFey7$%Ef20zAO7{)QfCRU5zO8of9*r6=P&rB^Wbfe!I{OHH9X0~^!kq--}Bb?ff zkFw;hF-E7JwtbN`cfBeW8@Y4wDu?N2X-?LVnq~OMRDqhWKzJ0Lr81{*IK&cUir8x{g#_uZ}Unz?NtIUnA zrbUhUO$TpwdJ%_AI}T>eUw4^>a%@C+mV=*HmY4a;Uw7f&WDTTaJgkkU#o}KDdDj{PYVvMTJD)Snfe=t?p5STa z@B2zY#89ux6k|Xw%Du27sTT8UK)C*_&#XtdCoGa9k8<(oBl9u}pM~Q-aN!yc%gg7( zIzhUT8H{$tHg3l9XS`9@eOIi{@EOI%mojXK9NgTnJZy2X*%9Y6Vri5=NIso(yBt5R zZ{)9^IG=5xwBaI0{58w{BCs6&KA(Y#;8_sfDK=Uu+aUSLO4(PCKSt?Xr3;jvp>(BE zzLN}pq0%cz(Ri*_dKW3yZy#6s8>O!+{R=7L-$ROc99Hyi-!;DO?XhCCzUCa`Cw+X9 zOgZ|Y7cGhR0w$VsP%m2Gm3DFevWI=qD9-*~=GrX?^J+44=a%=YF5c`pjdrxKBFib#&U^=AAvS zh^G^*={?d&4|5!EKs=?OyWH~}b^{z-$0M_H*!_p_$0igU_EA3=2qqL9$YDaEgzW|s z3eGFwh`*RnB$G9u!43H1r;3(b>Rf~Q;|HGv@NxVd4xQ0Rc8;!bw|Q|aK$AaK?!e%HV?p-kd=(gu{K3lG zxS<2QYvi?o1IG~z-&Z((zbp={UI%_0*O@WD>2NSR{SE>1q6KpN`2FL!#>{PC?gYbf z^fp!w@TT)yY{t?$0S>Ob)6h#=y^vbH)WdFZD1#U2jG{%2)$>{4U3s;T$F7d~V+U;V z^2f^DQ_XL`8A~gFtlZ+{kNuO$%O5LqM`6ZW>N_qWg>rWoV+-3~jvTFi?F2!$Wmn5@vt~X=bU69 zeykVPJIiWq6jpBo9QZDnp`7lF>%J?-z-$|_aZ_jhbA5Njm=|LtG3+Zi#%237!+MK9 zlo;RY=ZvIfEsjaRdnf|&eIpjacGx3+22UB&f{tc5(5zA!(}L$aP4{Dz&Q&U7TDaFL zj|CP9hb#!aMCrApXbjgY{jt)AmHw0zavGIqS$TePi1Jbn{4vV%Qy$B^+)?h^=NNW! zRlnEGFGsz>L}S=8JcS@ziZgLzx8O`)=ldJ|%?Du|8*GAZU!3>zvkNwtynJOR#-nE> zFcwAjUd4()7v_BXC$UcMm0r80BvZbr+p+G*N4nmxx+rH1?B|bxM?Ea#;0wn*+{JP4 zg_(!De#`N2hU@W(&2&SS2NZh?pljG0;Ah^5+~36*x!9ZEiQavXo$1@fW8}P{@t^qw z!wQyH=_#>$-ZD^eu%R)#YYdI6K`=D_CAlIaUuNJ`@OJ2UEJ!po{vYvjhsOU&@1o#- z5Dbm~K>xe>XIeBgW*&5Ce8f`P=NC14{t@N0%E}aepCe-b ztkkE>x?qoQ(PhCq{9BD7^P8{~Fp7?zFNJldjh^vF0NZba^ z*ge>)or|M4EN6i^hw1;i^s2hH6@P`HbUV~yc@?6xtD?TG4c3PG)yrz?>g!vfs;Hv1 zVWqk>HZ5&-dFZ-oaQUUJbx;W9L}*!E-vlR!jD^(gj5TMD3D^$#4WOyQ&uwBHPteHg z3L1?m7|Ail9s)OxANvY724O6YhyinfSi(Q%$8V(B>BDpId{fMr-{Ek;r!6vE8@vtN zApH2rVL6yDj(aT*tlnqPU0y+p8uObC-j#RdfG|Gg72#*{*pXTsSaArm`|&Z?r(Aj0 zLmt1klt*`y$8oPKFAI6yjgQgXbL8FP9R0(=kvRrvX?P5d zaZ_h__lc3`laEc{*=RR(3#0~If40Eb1XzK#80-T$KDNQ2toMck!w>EF_X*^ghd;rbfO;!*KV_)-x6R< zi8<;1-HvIyS-)jmuJ8>5m3hWcUG~wFrEqHV^<@ovRQ)~dsIZPjGyIl-oYrD~^E{CAu zW|2!ME?U)n44nVJ{4>pGYBWsUhOV`=FOtn7M~MBTR2?>v%$9i7sXA;TnIra-cFAZI z?KF2Z`ZPwPt+RuYieS%*3sQ?NotXMUHfX8{N26Qs*T8EM85T1hhw{zmOp`DBs<2-k z3Ra&AY@x9yLvE*!AV0`1h7UYQma6W4F9hr7xEV7J&y2!8jnNso_c${OL$(I&I~$!D zH3Qlz7c{SKUEI*RHiKIgGvl+_iDyq3J8rahG{5R~ye=8Xb73uj_vD2$=N<1ACa`h0 zqHXP}_PTn|_STRtH`_;G)ETZt;p>t!?sS_}5`HxD;)B|k^96B@|4;@^{+qQISB956($VS6x+e z=8rpvI{E8u-1+|??>!R+N_qU{k2~K*!5evznEH4D~hc zq+YV!eg~n@LB_zB%jccpapC)*|qknAs$98ssm#cg$ZyeP|A%t^pAg)y@XIwtri@`+o#!7~OKWvey;)E4ymmMx z!h11yJmk*DoI6e%>(8m|VGpg_4=~R&OOm2u00VO!e%%I}jm;n$T=$EFR@e0ZP!GFWabrQ z;s!7*2kXGfF&}n|1FJV5%o<^}U3u%kuw0Z!YVzt~w>YqRPk|XliyEtEmd%w% zeWe`7Q67d&kvx8@TzPMS>26%Z@t!O11}A^`#6|Kh%ae!0CSC?^W-P7saB$^yIQhd` zMkMb`urm&yAI*5k`%7q*zx3npW~JhYKU@c$VvOU*=LxSC^I8t3yYl9*A6|-Z_gN%I z9@9paB6BAO-TlGWH{zjoH(rhesfF^*^u2zFOgg6T^+J1F!$<*ITJDOVn>y=_EhjcR z0$=B|reR;faoj$_g@4#yWmzHYqIF=$UOHZD;JdLaG4`IudY?uij(`lrZ~3%nZT=6C1e!#fb5MI<)Uy+G1JkBaRb&AKi}_tpjr$qvAD{w`VjD4=08lzRlqn z^jfJY^g5t^BRzQ-2J48UVFw`^20Z+Eaz#csRs|kjfR_i3>>MLJ{4Mcv@$gQ17X=T3 z01y8?{r5#gEGnK3I}P)I(dZJABj||nDBlu4M8{7`Eop1_{Nu%EehTV~u*kTS{wJYJ z1(_p47wz#bnYn)yA1pcYqmfK<0kc599~Z;6)39)~=-g55Ggy5*Z+2C%M@6tUb=t(# z_s3s~x5nQZ2WRz}VNL9ZU-*Rn3>#-y>nD9~@|x3X8z)_;l6Qx?BD@PPIJ1>b(qk-Ho$Wz|WP({hgM--qt03JirVEtFg55*Cp3E z`Ri?6vK;b;nGndNl|QavIL;m~>FjPidn>|0L<@+Ra}lmT*j>%xhaxoZesIc!o%4IMC+2$ zo9plupDOkhyJB6kmg(RF+NzWvN%EH{Wgay3#+7 z8*<5wAwr^2W4#fmppaZ33bj|yc8{x_e=6>9)b=k0xDXxsMM;15-n}1+9{*7 zRcog~n3h^vbvyTbqCrB8s-!x%<4fA`v4;FS%@xprR@rC18!h7-3G1Wr+q?M>fjYe3`Kl!t4nn7uD%`#)eYJS$%< z;91E*foHvqwqyh4uz_cN!gItwI;i^XI~aW78Dhjt$uAJnv7X}pM>@57m^s3u zJ9Dhj#{tBdg9fxSKAI!{)bIU^Pw zP+RqfFs+0pmxh#K>YLFu?N0vybBk*_<^Dr2vM_%>ck3HIIGgLUogbPvJ(M3kOmp>n zGOK@Fg4aO*l(e_CwbYfjw_#c6fEB-JIgAAP*RWXWq!0dZj=bR2+23Li87I z48oW=Fv?z~>uFGB{Ce}VXTpO|h*2ioxo`;bcbj18fE)S6Bxsg{`RdKjz6S!k;BJ(m zR|tn7z2X4Bm<&HdZz0Sk4r%bn@KH3VGWB;A>_K|mPn8b0{`gr|WMBMUZ+@2iG0R7K zN8)Ec26|D1G0NnMI&`@es&rvVj%o1*Mas`-rn=G4*_H_vOr6hIut(9}GxX7{?=p5VQr1!_WVq5-z zdDj@GU7`GWSnkUY-T`K%d-s?9^A0e*VrvoxpA&}J_Aoas5&U9$mGUAufgPT8zW{&EYQ2`2VpV%^*DHkq!W-q4`2}eoz z3NJ&U$mf{omA8stSgs{=u3`nb-fdo_8@>;J_d`nso@VhjFFGCfef-U14LenlcVTv_ z>B2NV$20=Bd9g#e>GW)x0ON5dz@O7V3mm!4%lV2%#C)VjRlJ()EB7bDOXTK!rdAE5v-|P7>)N7F#mRGWz2NdgKp-b}(=(OFi7Ikn^L=+gZHCZC>->?o4+6MT#5B zoI_t@4QHOtb}`n}%u^URahq2b>*joilZCv^OAeY%+~&1_fu}kwE^qTCyd2t%lxkPqzD;U3Iy^MiBl%xMglxXtTYT2pMV_IaBZ z(-{)V#s3M<;SUp5R+@v`y#9;X9&Xc(WL{;w5o#Tjc^5M^(%vDyxXp_OY8f?fo7YP$ zMDmHh$0y592e)};lG^1C-yNjJQ`ej;w8lc2owUw(7@D_v@!QL}(&11pw|Oyc;x;dK zTj$e`E7e<^d60n@I5$g9=4TG0^=gN&E@yac=5vg@P_50GBN?|utxGaTGE}LPB2|mq zyq3^j=A0~c+~!rv90YFjk^_z_B)Z(@HH-e0YR7F}Z!>#X|65lxo9mUSB}9;WjU3z<0)NUS|gFxXo)e?E4+u=Ea#fr^%t6)w-0{W~W@N zxXp_O4qQSWw|TKkvI*3l#ph^0y6Q=MR?$o^qY_U#pPBrO!!)h%2K@Uu!EIiAdhB6* zywPdsIV8j<=w$X@|2D4|#r-+_hxg!*eM|erDZC!pUXCo;gKa)9RAZoVTNUP=FoMa@ zRcxKQnMFCxWlEUN8bh0v$^T<9Vb{+LkRDK)*Lq#+;Uus}IpxPs0h#eLmrJ3h{L7_a z)(fRz@}~sRS{M!Bf>y|@%JXiBI`aGPsgaB|l()9DH7%}aHN|VmpM*<^u-O`AL$$RvEh?!mgUmm08C6Ne zwQZ;n1d|##^e&&qx~6hmgXG`NBPo~!dR%40Tb~;0K+22ZUxt*pF-R^{Vz9-${-@_0 zEN)vWYpFp>bq&q!Emd+pYDrmZMWX&2s}@U}pq?Ar>)E8BRM*Ny4E_Xe39ivuQiqiX zCDnEHXe-%c4$?fC7qqLJn_4jo{K2PrORCwmdH)eQc2m11jx(~oT-0K(QsQh_nF>a) zD62G`wZyweNIF<~py2-OF&8cLu%MTDjoQ>$!V;B8<@B+xfek24XRa(N#}+E9#JkbV z%SlaHLqnPLNtk+FFofbDZ(c94&@OCh-p^E321oBIBFn!!3Ab7WZVYNDZwWj~hhAh< z*IH7sq|7UAud-EOqgNvyVqERy-}W@Mu7=A!nH3uz8ug<=hwJGaOzhhpe$KgU z8Z-S%p&J7Z#yA!3#tftNA}oB%8D;#)Zw8#Lbd=+LWP;@&r(?_a}i6{vz#X@@@{+DFH+>W z=CoHR%2nO4e^KqczMTHgD88u3y|r{tMOP-Ctay&%bj8_|PQ`VKk1IZ_ z_yfgP72i~RUonhFnEA+3%u_sHafad*iq(p8H9O*cPVEmXeogU5ioa0Yr}!tu6wbRK z{z;0X6elWPs5notQn6KWh2p)6UsQZbajW9Xid~AKu$OMW;xxsjimMdgQhbkyKJ^F1 zGz`Sd_v!4%aOeAQfM;Rj`>w=4Nw7be+r)7L-}|tx51CuX6r6+IjC}|e^sXW*qjG!rRuk1i&glaMBw&b#U-Ga*y^Xk>AHt#ix9I=8@9jZ=Frd;3_= zog1h1+PN`_eGdH$Z*cTF%%kuR3XN;o+~j4XbO+$5QaX;ykkav5DM;xCBao5OHG@>& zQo7mjaStP<^J0Z2B1k|=_c#(ftdwpO5>+W3Pk87{N=NCTO6k50Bc*gAPU%}pw-rH* zBo6X2j-)EHOO3pP6pU@)Qo3|dq?B$1WBXD%-tX#6$U)gC8yrhNUrHyF%D$8?i+S*+ zbpOYY6TNsDkrGnzrF7)&9bZcK5dC^e>25(}kKKrej#B1?lHe1~97al)!;nAl z8lot2Gei1Px=xnQm(tx$+Xt4?QT+S2C8guKCy~-!!pcoZ=|qTTaF^i4?VirFR! zDV<1T5>mP^vj_<(oiNV{DIK58pp@?4Nh=_w`#e()Na=1Mwf?1aBC-fb>7D`^kzKuY%v;|HX4%b8q2O7|M$A4y7gC5rk%q;&HAmypt3#QYqMl#b7;kj<{oD@bKb)!wujtlxXQWB zy(JV7*-Zwg`dc&uX38nh!}JMNHZ-~~6dFYpX&7~EM0%X4r?4j>+4D0wa2ek}q;&2t zB#{&0iOBqpoow!(Lb*oDwyG+lB6owx&=bm4G+}SvMeqE^iRLU=ES*ErDB5F)Y~<9Q2+rh19f||3}me5Vd-M^1W>Xl<(~xpnNYCayuj68-koL zt9{A$CZoTM^Rg=c!8Qmu_h_4AA>U(LCREQ{{UzjitRt%F(3IzK?U+%lx2UlIX+N`< zUFCc7-hzZL!I*;ilQmKeW%XF?0Zz4{szJ|MAswE(6eXfvDXTjbbL@O>k7jQ><8%Mc zClxt{&@Qq*pvd}wwd%f7@w18|>x2JBwSP zA5dg{K#}zUMb-xtSszejeL#`*0Y%ma6j>ioWPL!9^#MiJ2NYQ!P-J~Tk@W#Z)&~?> zA5dg{K#}zUMb-xtSszejeL#`*0Y%ma6j>ioWPL!9^#MiJ2NYQ!P-J~Tk@W#Z)&~?> zA5dg{K#}zUMb-xtSszejeL#`*0Y%ma6j>ioWPL!9^#MiJ2NYQ!P-J~Tk@W#Z)&~?> zA5dg{K#}zUMb-xtSszejeL#`*0Y%ma6j>ioWPL!9^#MiJ2NYQ!P-J~Tk@W#Z)&~?> zA5dg{K#}zUMb-xtSszejeL#`*0Y%ma6j>ioWPL!9^#MiJ2NYQ!P-J~Tk@W#Z)&~?> zA5dg{z;3)a*{^@6cz}raI$uDy%KsUbQ^R%bS3lx=(*5E(9@wOL+3+}fgS;!4V?j<3LSzz0OspmXg*JS zpx=Og1-bxrcqF|8VYUq*TwgSv(|CNgpMc%~y$*UU^lIpp&`Y7)pzEOxjmm&|LBMSM ziF4sz1U(&kGIT!l80Znu+0Yr#sn8})C}1{jec=Jn<~AqJ({i@^4d_>(cR+80rYvGJ z^b^nTrK|klL$C=1??l$+fQ8xU<`1N>= z6nD8+hs`rUIuM3uf~*7Lj^wxQ2mTJY7WiA>8sKk$tAYOmTm{5AB5$n(?gcIbb_16J zyMRl8yMS%LUjdtezW~+){|i_Pd<|F${5h}`_*38l;LE`Iz?Xn?fjY8n_6!3RnkR39JDw z16Bc-0xN(^fMvioU0169%#yZ$un>~jG z0#FJlz!9Ya8z1s6I8TBbyxyT(vbzirPEPVp{F!X~=TtIP`)WzrKG)7cC>&I|f$%8_ zgCl@!ey!Q(d2#H)3j za4)Opj*IIK_2b?TiPhTP+}zZ{Sl}NU7d195Zj3g!G_^J1#B-)`X;o`$Sxr^6t*I%> z9VK*|Ue(%G*I3q8*VGv0J&XtvZK?W9dtHl=G3g(gIO0z8aw$uRurrZN$x zH5yC;d9H3-T-H(*tte}61xc+<$!9q#i1epuSxv!^afI!WpO&g>Mu%Hj;~8zy)~d$J zXjwI~6K(YxtF^Wrn`OLm6l*<8LzG=xR#z{@HTBojT-D-LGU~apsd21F0^_ZTx3~o@ z5|y^BZZb(E@>yNhP*;Cl&t{I6U+1@P)C*wEY>HwlMm00p%vuX%#k$PT1pAoZTcXI4 z$&NJ_eWRhQ@wzDP87gn8ud9gSPRd2C)`i$^6h*$8%i3zAyn-^&i>9NqV2=r|G9ulo zhUT{Gn2&}gGy%6Mao+4g>=2Vq#voWmTwm2tg{Ea!W&KLTB~=yCvS@29nywPbmba9F zWTg+UhI1f4egC}6<$a29Otw&a0^^igP`ADTh-E5*IK16m)EtlwU^aL zE9zP*+Uw+Tt7&SivSwGc%KcJ&Y+9-sn%dB}(I)5+s?%ks02c-0eas*YAxwQ|srM*#B_va!kQWY`*p95c`8d$6>#>%cy>rD;(W2AsO) zszkr_x+~(BRgP_H#3REVs6B!CsIRZ8L4C>gDcD&~c~I)Bs@wP^R90PES5f8lcNr+X z)aPQCp+~B`y%mi+Q_9T!XJr_tTTHY>KJdghYVY@-se~IluGc%6r$+3&ti#}vD4KO~ zE2`A%`*^TSdI<;SyS<{;Pj^~NQ)}y3FZ1$ffUZ2V*j(4z){3@ZvG@d=_QW`Wf=p!t zDHVA613&w&z7MS8s+NX2JQz|tjdk+SviwzzP3<+cUi~3CX-_`$c<1mzlII@zL`SQ~ zi=|PX2WgGQ_J;DR7V82&@EGhG$^!knr3Tr@dn53Y>RDEn!Q>2emv@=}Y+THDh4(C* zN529yn$pIsE6ta0m%M;lqE@|n#*mKOd1ilGq=oOYF+Hz* z+IL}MPcdodVPz7B8g_D?}A4Sg6s*w$DUPdZhdJxv8*;+jMzj-?-fT;LXi{z3ZL(++!H* zgdz4sDE4Jc_4#U2miMj1Jy~R284go~hsYq8>9+~IL@p*Q8ez$AafaIEI@{%;tI@Qd%TKt5meHJxYSQ~Im{-n zFj^ZC2tj>i{BDFxklvetavTRgQ;z#!HgQPg`=A%4L6z~l2lgPn{ek=$86WHCOVErH zgQnUGdR!=I6phrI6pgz()SJ&Rb`#|pIJkkmh@V8bkC{L~6AmIQhV#{x2=@cumI%l2 z-XQIHJ_lJP=SBc>)*|Z#S(dT}>80ZN2+G||x*nCpf6)C{$SM;lv-~OYE=#!Caz-Mu zuFAWgf%BoB^8DX5ozSmM&-a6$Kgd={C>PSqpu*k9z6-}B$~rj?8O3_{U#Y>}ir!nP zr046mXFi%0$vM!zL~*I&GR2jOs}xr&u2Ed8c)#L0#SX;{iW?Q5P~4=rS@CJb=M*~? zw<&H{+@ZKr@fF2a72i;dEACNzQ*oc-e#Lhc-&Z`K$nM8_;Vc+YWV*mqwWlj`PLuvw ziX2~Pk1873)hM-(QH&|(D{@|x@g^%4C{9*C?)4ykBvhVu#`e#f^$jC~i{RtoXFzbBdjc+Z4Ae?oiyR z_=@7Iif<^!756BJ*qfDk#pM&H%2k0 zn6JorZ~9MGEKr=TI76{Wu~>1g;(WygilvH`inWUMip`2`ic1tZ-_Cq2Q(URIN^!N~ z8pXAW_baYb>`>gGxKZ&5#Z8Kv6`xjoPO(#Qo8orG9f~^@Ur~Hj@eRee;vU5}756Fb zSA19TeZ>QcWEfcwAw^kB0DG$1(-kR$U^rQ00L)f;8M-Xod&I6elW@SEl;~ibaZZ6iXF3fy{86$R%E@xSWV*=vKu$ z)%{-;MO1Mbo8 z`)jTnu!}o(Iiq?h(e`;6X4`K1_LWX~6*Y2`9D&hs*|DvqxBV0uSKMdv%DuFu$|WW9&5`h48}`Hz{Kp`4{PVaVx&YLhZ#~L);gp_J84Tc@HlJ` z1sw+py`@BySHSCSgn*QYe0MlGi42{0MZ_Sxi*aMVyol-JUNih#_Lv<07bg!QjWJi! zGB1q%Dr4GcynOI42;;K?&x{kM)9g3#kA;&K@Q#IZ^X$T+ zq7~ldzNskTK`6+5mZqg1*W>O~*3|U0RM}2)t8|tk-Jb6eT=XCvj zPA1_R;mWG=b{x9b0x?W*I;pw6oRXQ=pd03=8*Av~#X)shxfPHza0Weh%Ir&XA&>Z= zmq&0O0S~Z@&+KOGa=~tAI%Ds-qdk}y;8>mk&G-z5*ViF)N40PZDu$)%J$H1ta5026 zaTt%`meZih_)Ue~nCbNvG@mr1j33{J!8wh0VR;&EEC=6FrW_cude9^P{4(5(GW2@S z9X*la)dT6VJ`BBbm`xngScSo03=OJGJuiekn7_@SXX+V7pC09KL3*1(FGpz+j9(MX zL3-N)`Q!Ly@^@Px4vf}MK`%;!DnoAt>_K`v0{KgWpP^^wnAm<)?}6TFh6wC5Qa_>y z5S0M}lZ*vuqC5sO=4P6W7uVKap73OIi2i8 zaEU##mp$;h^JaO1gT0Y@TJ;g2!?o(dKZ37g&K)oyY#Z{We9nl%Z^BdFv%t}G z2eSVWg&zhAKMWLp7+9qK!VkkyW-7?tBFW=jUpH3Fr5vGGQR@*R`r*B zqVGsP5l_m4KZB+`sDf&WW6cF@{qe=)#+@_XyTqdZHMN_)2gc`%PsS-?ynijDb4|Bv zWp`Qej$KwkM;GRvvD|1u*R>y8{p9?d_1&rIH$PdKUi9ca<2vJ8&hOaOIldz9j$7er zd)6-0xgUO1U*RVN!aK8ep*d5sVh?v`M<4E95d#lCenmWFt%&DfT_$D^Ux)(F!8Pv3 z0r9N8kOCYJyA4EpK4@7TUFM#*ARQZd57OFq@Zjs8{!~ZTpxBDtu2sAXz5Iniv1z*< zwd0Y0Y%1)hs~tl{%HD$qpS|i+1-r*H9M%|j9Xxo4jr4Y7EgorQYS=&EKIF{Uw4cCj z>#*30pPU$5fo1l^yME65<`Dj82%nDpz6^TD1JUHKXJhTM4Vo{4CRVp~ab4$WxBSnn z{g>fPqmGVUBk+CVSW|XqS$B5Zn@}&yaOd3`v`KSEm(}@dH``>SwO|-_r-Sc$)H2U*f8_+Mg zrukUuVx-5l=+B{}@%_tmpMbdy?~=)IkK_3c=4C$IgLax%BYZRCAndXvZ(fG77}|G2 z@56)DJC3n$g5MgXvkF+Mntq&{pgYZ#K$Dj^%sbSbYZ&RjK#^-7v(;RHdp3liN-o! zo*e7g>K5F$chxoPyRCxC-3)hMMrV9m3GSS+mc=`rsyN;1&t2brUvx|S-fhpvt@NAY zop@Ha;92E!9f~fGyD%4>yuLfxx+DJl$SOR)GbJATRucLQ`xn-Prr66??Jh^(G=1z+ z$9gbJ^E@%O!imLJ3`OyL|1;q~IM&gX68rvM(qjMnAH$@GehoTR3vy4GM3vSEcPj`kvT}d9oaF1BC zyGSnw&t@^|&(OaVVO~MrvN|6^JuKLTQ$8LHqihkh#}w2x!~UNBar!UZ^?UdawmNog z{`0~A$%@^+J6v$@n`}F~bK1~BogHpy^!o0!SbaPNWw>YBmbisy-9_DRMcq%ysfgRr zj;)xBeVt`_CCkez>xlV%lLx#)SUV_#8M85)-Q^x%5Pt!FG^6{zo`E{M_Plsk1mm7-&Bl8m{?wQ-*3Y9XYsNh<n6`TQjMKz!o*?wu#D@2*5YNJV-K z=cacY{|v%yKf~*nk@T84`jUT++t+OfxH$GT-xj|d;Wi}m8R+OTeG_#nebdcZvp1Cf zlf8DqN{pd%yHe7u!78QSL~UAAWk?QWs{UF)8`^kW*Rn_X6M z2k#tx%%qpnd0U+Q>Ncdy_*uQ1<(2Ga5MGxugGJ1Anj9-uQsGbH)q_My{u2R z`FH+&@b&q~m!b80ROiV7YXBssSzY%r70`J@d)tnddV(4&y#~wVVPO zKYoF@rvJ?k#4XUcZ{eLJw{3}UW1rn!9#0#0msj3h(=is$>$)9b zh;mmsWN_-gRwBB63<9R0o)5#IvE9YpXtmU zj`vV!HPXHuyx5)H8J!PxPe<5k4EV%M+!eDGYnf4j2d zcXl86f2fxjpT{}7{sr~2Z79NPy(~e!7+zp8{Px4oj15d91OD;T6VLWHSdUhs9?5&6 z|9%lX@KYTBZ$!E4ccbpopBFwr>Mp)w_iE5!{jI`2D5tX$yl{t2`po}I`W4^#Ci4#- z^{rWdKKK~his7$4Z{?Gb*or5sV$&amOusADYK&W*=3Bw@Kd@_kw+Zv`@GbGJY?Huy z!LjG;!a5XuD|q2|3OV%<3OgVZhY9XfV#+>*A*DT*&RKEWgWH`;*t&PE&FPcxpUZ1kni z!`%BFi2nHUpyG~~urKI!?g2W)zo6sgv+-?ZFkhRt4DbDA!q+|BxxRZ{d`tXz(7ZNnrSIO6j(t(l zt#P(T=McPa$Ct(@BTvD&OAFR_ukG9tPwVAg8C~CfPv_RS#M@mO=YFVQyy+V6cfHaa z6G#66KPlruk7uhOeg_b`#q{^_dJ_Gvk z#~wR#3=rRNqDt|f4?7i}JDD%zcXAYZ4D=EA=p62xRwIlV!bE`)m? zz&g0+$*Ub3!%tACla}O(ZFCpVke<7M(iuq)PwlaJ=y*iq zL9ZHZD53?d!;t*26Zm<*p*@SExS+h>Da7U8gfTBjI9K z!^sGWIM3kzbOHn7od zHqx_&!?FPEBdGoMO+M9=?L{X0fQa zI}OL10%xb)K zCAS?iucP z))X(TD~DW3Vi$QKuNYcq*)ufVVOx;uYS;T_9>RLE|KPBq?72hRuD9$zI+B^otqe{O zQw!dZ;-1mo=T-ABT`fbJ6e72o|5 zxP$4@G+x&{da?h@v(2)G)gTn72G&A*xw+jdS+SLI6a1F=6!tk%H*n{Lcx&kX5dQ2` zS8_kk%6J{_8{ssxv8u+hf8(WbxkvSF&o*z!zccs06`ON+hL@dpJkN#Ju>S=K&W>=l z#EbYNlby_+KIyM`;pck9Hk#OI_g{i~gs0-NRkcH%0QSRjmYl|pU`L7o)Z#hF8pO;G zd4`#C>WPeV=a?~Hht)P(&`19#TtRWLgadY1X4WJ4|maJ6!Ce zkUk%syf%1y8fVzOsbkqXDU-+;;wWgYtgNcet+h~ra<>$WtWdq_%)JjEfHPuFewKS` zczet(E5zQ)eD@UROxvw0bWaISCZzq$J*oQP8aE~PUoVMO#>UOO#r;p$*=*ZxYN31a z^4hvf#&?X#%X3C$xY688+&|q|SbK?kR<1jxu*UtIo$Ee#T%-`3y5W*L~iCVf~7+wPW4UxhvcY3v1oc)$YwVzH?1Y`1CQc*thfC*|Kb$(xaBN&QMHHPaN+aan+mT9 zpXa`D144Y(3Gbz`IqrMdfcn;r)$XR7s#jd>))lT8>;BLw z%qw!QDa>=sY)(>*c9jN|rvzq9 zKUyXX!{tLyhMoak49y{M0dysFJ#-uNGU!#%YoRgji6#xwA`Q9`JD@j0Z-RardK)xH zp;w`)C>tBuIx_dn%8|L_kpTbC^^DfYX(O*2JF;QyNV-cH%PPd(TG$$BU07A#A_m02 zw5+9~7C5E3rH=W#6c?}+wqqk4RAIYpAGD^l*Rw`_J918xrG=jp zx5pR&#c4jSiZsK7IA-JD^MRwDj7=rPbUppD|YcQZ8O;5*J&+}6)2{sjnI9|%v; zK_y<0%nS2Rnw`*Cl_Rtb0lq|8mRI4mUc1mZ#-J?&DqPDzfuy>*ENK9v#)m&th< zM60$}w1LeoX~5NSb+{Og*W%$C$7}eQm|OCCB!6gzG;|+ZxR_2|V|9~P5g_N?W!S(> zl*oBw2p|{nF$cJEjw$ky@h*Mj%Lr%G9^Ffhk+~$vyxb(23M_hQ$G9QYAUW{M=G9p( zHiye$p(Z9T-n+gLuC-QuRavto!A$*GdK)Hl&uq)3k5W38L~KCbp}1J?>NC}$)&6(8 z`lv;=vtg0ZN4c%-FR)Ch&pmFzfyxYDz1J!27>V~5JhSkmW2lt(B;R9j7CYaaR68+f z1Qo+lodwPC{e>f+YU02s^mv%MQN}nG4#rHsKS8*_k=ZEYcOD!9@KX7W?%0flYdl--}v?0Mi2*COukjP?SLU+jf%2s~EdU7q8SF>E@5MtSH== zF2{3Ij=NwEBx7Y@){$%7j52H_|&E+T`!wVK#AKwB~@`n>460e&2rV9JsEEKf`*;^AGtA;Q8}>x1j%Ie{Az3inl9Ij0wx~vd1Ts zD?K)7AC|DdPQ`7C+ZA^x?o@n5@m0k)6yu6}6yH?br?_A7UB&km z4=CcHlKSD_H-t0x>S&YOiMV`+{dsLBUHqy>B+=x8Kkr-3VSDd6cS+PKI zy5bDQBE@3Gxr*}@Imerg7s*;82EEP1C_V~_IqcBD(=n5&xJ|J+$#cISOiec4G5o+| z{0w~LWe>;4ClPdb4j$t#!^@aBmmhK?5Dp)6#5aj>=Z7J~uO{Lhvq5pYVqB3+Ug@8u zI34JK<_yKTit`m05RrB%@#FZ|RQFoNX2mul!Yxr;s<=%3S1PVjT&=i9ajoM0isbbi z)Denz_;s(~9Z+?a1LXUKn6LOr#i@!HD;6t?AOqpa&oSO2#Tyh?Dt=b+9>tA{-&EYD z_!Gsr;@gS`6jSgDVmeuha^Vo{&1#o3nqj|F?Xu4m_6=%(Qn6F zF$re6^QJ!Hctts@8Rn_9L(fz93Pm}q8R2hI`$I(NM-=4-EckzqcD(d|NQC`0#l4Du zRR4o&=fXLLKaq&=XR19{}GWdxg`$i#6n*FW-FEu(XVe*`)AeuCAB}P_8n@MGoulHuC_yr?T_b6`X!LO zDeaRL3lyg-&QL5;l>UnFbJadyae*RvD$-k~xKeSI;%db;ifa`!h+yi-pR-=Zs9o|4 zyF7pRGnlU7`1Yr!qQS4vjXIJc{Zmw@ZQ)10;5!Mr3kyFJ7g`7o3++l&%pJje}wG6PuYB0Byt`I zyCWrc>VC#Vp*nkR)LvH@*=6*>27F!T4BOlA6h$%*!joUMwzgIGrNws)AGaaj||TACN^{WvzhFnJuH39 z&dOBgq0_lXH{I%W08Y5d09RpE@-yY{c82qBaDQd6w_z+6)qCEu5@Q>OD!!jMpfDWm zBh`*EUeq>412Xu)auzhh_ZKdPFeVO+BG0>>235vyD(uEguS;R!(`A(LI}Z+njU%ug z<=6ydIrt7W<(Lh#i36jYMg40UR2jdSum|a75Txrbht5pe4QA2tuP1am4Y5VZ+vC^n&1+ommkPqD*Oz++h8_vNaRM)i_)OV_^p6F zNN;i=fA}Qu>2dCiaoB!T4}%`>K{1L(>PHlf`(|W_yq8fX%42WT1S`I{*@SerQ|c&~)!T|a#0`u%=HN0skK;OPtx9IY5roTzw# zVv*t;#j6y{6l)dv9Fg8K#d{SWCZdBps`xu~?^HXV#{u3!Qjaa81Lwmhj?a&Z>VLmv zJ^D73&xdECC2*Q;7w;j#nr`92(emK6XYWSP6g#$a4|!-i_TnD&7q~CjE&Md%aBZ*^ zdok05IUxJ<%Hp<#`%K~w?fKZjyj_^R5dQm}zb1cey^S(@Pp-#Mvn8n(LrcGRzD3g@ z=c|OUa}fXx^BUg z8EWRpFw|!WuM8fV4E0&UEzj~8>a&DJo=t{2CV>``p&lneipfxqmjL*H{4db^d*Gqb z%@5B*=iBb}xp{fxYgeA>4$jTHhRAc#;U0as=%-XuHShBY(ByNaSot_C>z8sPdtMy$o!Ls2uz=9C#K{>l6*p zkLnEQFm!+6#vqJ|1Ebulay<>IjNf^%8#BGgbMa|0%J`iNhaexf1D1_&8wSnS3d_NK z&4e~_U=(@JuV_$Z{0dUzRKI15B>(iaW32_lLeypHuZcq zv(ey4{)W<4)(h*MWktHa+6;#v&u8fQ0n`w5@1GA2=7i}5Q>2}_Nhnu(YS5l+9hnaf zwixO44BfxHnKhA6ls_9jxE9XjgFU`i-V~nfmE0fvI9~ic@VTALCz|1d@V8ZsK6~5$ zJo7md#}Aah&F_Q1b*=O+oLk`S(~GX@Mt0u{MK^UH%wN9So-}Q@JsDcg(Ac``ru?m4 zH%)?`3?19rMcx;C=P?hxQ{vgN{lGb0hSw#J+vmKoP8M_CSf`K^XX<&|xCRC1k&^=( zs(Ku**T>9p@HD*_SohF)>g2I06|;B7i(HLlHc3@6NRmt07*5ms32n&+I$*<*d87bG zSkUd<_r)<3ss<)qi9eSW0CxD>fN=643|@MqUh?;0wErLfK52W5m1ULEdUY6_j%9yB zEX9NQ60oO>W!B(-qvZmLT5N?vm%yqg>OBe5-}KBcI`83`*6)F5AD18Aygr6!!e*oN z=2dAosuYHkpuIMH5vG;U=BlTQtHHS;FTLC<5qHgDRsUQhJ@=|^=2 zG+BfG!u94;NpC5%QHEY`K9zHCd}53;;d=9_Yw!x+gh2iAsoYievLOaE^a^1PasdSx z`dF_1_*AaPi6Wd)rv7^KsWU*2Tta_*D%a=qHIKLmafA7rAIKlM6{gGlu7EaWg3Fh85#(mN`7`AeCiDdHxNE`DJubm?2k`fippdd zqfEURyTPFQvEWnD3;`8PozGaX2hjfE`Bb(wRVlR3r^?$w*;KruJ}8em8niff8dEfL zuza@Zet}|<;v7XjGxV=lY*oBo@eak$6Vb09Q2d&@Kdbm%b!YnybS`$We;ahPe_nOs zIg^f-SLK=rE1i7iEN?!xvtt)pHDwgeEU<94+`)8vw;O$FZxrhvY-=cZ+8vp8`T+_5 zznFVX%(?g9rlM|#*T9K z(d^?DCK6p&IMoVn_QD=nseE0bFxGajE6mHEfjy;p*9>Gm0&A*B=T%RVGULzs88qJ* zCHiuPn1z69N&+@H~fBBHo=YMU>%rp%!b*- zfzjgKB|o4+mGPSidyrlS2X(lS9?{S%huOq|QSP)KMT06+&m6FW^frQCI^0N)1G}Ne z_jZsT*O>Rk)AnA2@N^)5U;})5xAmg;2hfYc%_x)B3OEGw*BQtk-i|&!wh`m7{iset zLx&9!*lDDGL=hk=2LznmVWLZrgg;6#!52rzup=ay{gYNzFw80dZ9#c=KL+4t})9QtB(bL#B63Uj{ zJJWrKU~WjiXXuY&O#U<-}DA$pAB%&&t6Wa;{yuLV=h z{_X%rE5;Os7lu2Zb^2eRSfnVtFx*Sk&X+C2U8i`9;u<14$y&vy6u+hT10v!*sdhf2 zWa_fiF6F?VLDmE5q3n$nW!Ny>&@7X;{jCq4Fd=`yyl{3h5<&OP7Z`^3# zI8*MWy$3BX4XjDtOPZt~wU&W)X?*__?;Koa|7dydqnZyk$7lsOZ?+|QZ=VrQ^^Vv& z?ht-F2M?Gxnt1&9(^C6rX_kU!!;fDBGx+fZ0Py24(3WiAOR#|-|E=eE2>`RlZ;4}Y z_W0-YNOsv7!HLhK?WgD9KlwzYBpkCn!OnpL6*I!w<8ff2OKHYxi1Efei&wJbvDe#k z2fqfO^7!+KBw$}*4c-srdn)KW#~Pf3w2I*z5pMo`NiMaymxFa2PyceyD1|#Xd95Tk z9TWEcD3&819Ty$^Q1GAYL*}*3mxB!T`sFa*&dVFy7=AqOqVL=i{*-(=@SPky<0Bh( zqu7|!)3WZeS2?%2w}x&>S~*DGfnLuWiHco`5P{J}B9emkO|kRO^iP_zphrMYf-ZoL zL38wAtB-*;ieczh0L_t+LjwCP;iA>6slL*$0mQ(efAgvI#a|kN4w6)25vp9fd_LqoWgY^KIs;nGmuMLAS3EmUuPQUbGYmft$ zEVuQ#hPJYDU|WlawZ`;U|H}DGoEFjdH_y|i`vF60?)}Zf{e)rokw?VCCgErwsdmG~ z?Snn27?!H{H_ze1@o6$~7?0r|qd}GNn+m%z)9XH1I0_hLjJ>~kc*xCm1Y$YJo3Okr zNAGW*Z)4c#i(c<V;_NmBVcE0HYO01qDY6Q_sD>dG>)`I>Ix5DbR+V|2Bmi zRXRLQ_l)vy((3)qb0CmE7=3!T!EEA?z~10Y-(u^O^kh_040#aev$z zV*wg^8`Ny-0*u)qcTY3y*8_22wEmRT_qP%IE~>VfVW=jcQ3vvEGz;O_4~#PTBckbj zwHb{NgClrG|C|bzpLJsTJOguK>sT688G6QUFz9|PzKw>Mgat9<3*79x1#|P4`8M*C zf`NA)vtLuO-T1APBR21k^%{JI2S1q1n+@j%1m?cHvN$LdpXGkPo6uq9y9qd&;eqUj zMEPz4%6Aj+0(CD^oTGS^V!a}tOUA!m@eak$6VZ_#Q2ag-&(1Fu-&5qNo^+Rezn~*$ z#v)z@{n7Wbh_Flf@Mn;9mH3|eAp0$21OA@k9i>qI_Y~K8a~%xVc{`9RaIH78ezNru zu7}~;aC}ppYsX&NOtY}ZQ`d(d({H83HxZjB#Rx3| zatgX1vRa&6AJr&myB2@utLQYC@m0jR8+;YLNL#W2b~bz!{oZrLKf1U|Dc%;Zpp-&Z zYbU!LID4+F`5y-T9{(=#1s2SXej81@l4kGQXj(PR@@+JY^YQiqt_`0jAr_{vPx5() z@C(SkO6V3Nzuvl=*WvTGzgisQ$dPtj{@k+NrrcaNEqC1b@RM%j;b-y|_4#eWx-g2B z+4oxUJK*E7v~3c&ukR7YHtJY0?H|E+25T|#N#TDJh#*7ec#e8|rdi*E5BFm)-1tWj zY>;>7o1O0ps(k2RF9XXZitk>AGki>tA7TLdQJn!DhVC!i7=$r#U=;o;n6B~TJJy&P zZUHRs(4flroeO)A_e{sYO1@zjG+#|D2lF)(+Qfm;nu+%%-?K&;zd|?!>1_u+#wR_z zb9{OWVK#AKlrv&R(V)uIABX24y`7-P_cH0x-QKM`YLa4c?Itf`=*H$pvSb)q`rEejRwaI0QpSu|^K^gZY;!l4Cz954Fip;MKI299QU zAo~qbcxd2xY8M_F_9C^uE%LK z@`or?e=>;ilg=6N-bfvEd+^LWpTvsK-i`ZJaMxmoeKz<;JGL74`wZ&>`**U7dv#L5 z&*F}nT_@p=8!NgFYjy6%-IKF-;d=>dau)7BlRPl^?18Q~58)mreCr5poK3PDy%coU zfbLqM`)jU8M}BxtiXEQ`xyOyj1NrPXx~=F--45=}f#qcE49A^fGk3#`UvZb+xtjbr zjw`xR&QQUgOoZ{`;FQd`ITHnQoLzr9+cd3+{t>PZ=d7qf&!@!&EDFJ_B*uHm`mEAnstloNT_4iO6A9WFzu zy9GS=&|J4M*BzEScDy^J+HK3tb0fJAhS#1ser(>Oc{siP<#A^fjTzSwbFVLSLKLW= zulA4?@Yy$t)oacJN9WXc$8MNbLJL3M;Juvs;>S%dK~P#wbIt5Dr0lTw**B9()xlXdpaz81%>s_Q!*70=>R?(nY=Umlen#j6To2 z0%lVt7_ApUFG_2(Bm|VQ8ZFNq-flKkB&4D9{emcR$t}q&4XWz za0B7NXRr~GA&$F8;=#Eu;h#KsV!tNGfCLXNF9XAa%R7nV#j)VQuVOlQiPkH&DqgR6 zhvMgnc$Obf>{R?fy!HnC5(n;&<(~(jUI%ZQf%J`f1Dy{m3uJ-q<7a*$9ub1^39=gHf(avd-nXf;Qc) zmM;2%Z$268m3A3k`Y%4e9oP&yxYzu4V!4k@YY)LAkKO>~vDB}K*|Kg0+Na~su+%p& zNRmrd8!Yv1+L8@?2R5+O!$1p;%!4_c5LVyL5LUBqm z)3{px7lQHTTPPHwoF++LNN>Xa_b~5$#8XmUx9kaS?K{ecXXWz3sOxgi4u3B1k-W1n zzBuo)*L86}TPwImhvR@zto>TOhbO^zvza-X2s?R%GgC}gA~iDw%oaLiP8=;2JIZ|x z$b-L9M(V@6h9$u_e@J#5`Hdw`B~0+ul0XmUx`*X(EB{S3ux}np!mrSO^5Y58d>! zjWt9-lSb;^{P`JR5(dJbmkf|UzhQv3I3d8K!QIHoTt)w zbmysz20ilG$7+uJ%bMO(ik*sk72gfIV+>&b80egNWxKa#pWJzWbLJCc;|9#f&&T>5 zD4&n#9#*a~84<&t)%d-bv&I~C6m!)(FWt>`A1-)nIdgmGoq;m~(cO=N<%hU4~ZS3ka z%jp?th&lB;U4tdz%4@_rKGQk_9cE}I=<_mdjO9rdA;UZJB~#Nvj!EW(Kq43$PV}<{ zOO{_ASWZgB!*`2E-Lg(O+-BYEo||<~)eixrs{3$rF~Xn&vEexI$qX0qHQ4Nl7#_{1 z07bh=$vOBBJqADAsm(jE!%0at1C`sC(x(=rLdk<#X%3y9oJWjK!GCfgeRAkwg;(J3 z4(P!&K-A{N3h^dsJDl=O1_=$1JOT`znuC95xD^rdr_U8z$Z{V=qM_k;!|Fyzc_iOj zsUepy4|mvW_z&I6Aj!v_k6eBY#w>Sqgx8k1XVL{E(@GXu?pYrFP~;m3Vr=2a1$dzu zTWaJjM$?e#Y1sVhj=4Z+WLQH&aikTV2P+r-NQuy8;;@H7afCZAlFiuTy>zTdE_~bx zo-Gs^Nxyv07LFXpJe=*>QX{;pz&*#arAL0tkg}%%S8_*~o;%6&%Zj|kc%SfW*^%}1 zJJ+*Ct@P1|cms6UcBe%e=r^5CtkZm^Z~<-Z@MU&nJ3TLAF<^BfJj2&5^sG2`Jp2iS z+hNLhnw7o`_ID9xjqT3!YW8wEkubNwxmS2u2t|rX_sUzvFC1ZB+^bkY?(kJMDv)%; z_u-G1-ADzVhBMBFgy?kK_whH6HSAVJ{tafgnl4OZ4b!O6G(d(O%6*Asn3&5crj@iQ>*^y7t_RZ-+B^r5}=&hTkz zCH0{4J&(%t$S{WdffuhRvX~)X@NC7A=WW=2G-?pz&5e*Vbzj;dWteY;7SND1bRy#0 zj4+I)8%FCeT2bGhf;q(X)pmGD=u}vSR`v``s|kD!%o&U^Bvgq1p{xP>M~Ljv6_e6! zr$6f?kuG9=9u8ra(H}R^BYCy9Z^wi&%hCWhE9Cwta~dmmqFj!S?vi;q+}+8}zesUI znHlso)^H~Gp8D3*%xnfePvfR%ayW6%ch-W##lx4$``6tm>Kn_vnt`V}EUq&=Ka;iN zPFLSanfEjBh0Z34J2?|#FU!5y@rIy+%mxN7)WFj-3+Q`^`p(F_(1x|h`KH7z%G|@i zmucYQOt!IG?66JHfSEkw)NOHEB=G!9KACR2!za=mzTL@uir&{ceAwLKJDkkVlGt_5 zb_92azmb&LPLCU%b5TF;@OV;Yl>Rq4uZaJ?Bs2kQJ1IgkuFZR)PH0EiuOe8gn`~#w z&>FVs#_HzF#2qY6=nM~KPNX%(_G&*2VoYa9C>Q@HJcmCDw$t3x?aVir?cp}vNag{? z8==-gnViOSN7_5YH`NN$KrN$&V}(A8Y&pp%{vMw=JKb6*^T#aI z%DkDx=Q|AT3=e1WTg|=F;n3;~ACcL~xL0Xy&&a%lP4j8TmFg|d>}22t&drjO`I*CL zz1rcc%Nbsq$!lrcg=%fi{5a#5sC7x^NCqx-Qlx5^*_r%!am$>O#lFhU%wfLDC1rPb zhn>mGbleJw?hfBzXJWUZN9?EBr%IGO*+1e+Y%S*@R9ewv+fu`aQ~G;rV& z@~2v1c1bpY+Ozl^?MGKViO(vU>19;nN!+as+Dy|5b1So-lPv3GK0Wp@KHlgw^c)i6 z6Ld0ruWiPd7sdTK{D=48k9|w~gZZ7UBpM@~2Thuj31*LoeeG|o!#L*Wp4e@hjvCdTn0 z=u>iAa;sP4~>f0p}t%uBCmb6s0w%50Ti7e6El}mWnNm;!|8|ISg_Qnc} z2i#dDi(Bd>1Kvz!NsUl$C~s|PYg$~-GEWYJ~QE-9IP!L)g^=UjaG1toLgUf0B{7E3O?xaa~FUs5m$ z;0i~apIlW^)zX3>ybcHQKnoj>%Rxl9IV1y65~VJj+^Y;9u9! z+}=_prWy|T#Ak9N+ zK)brRsTDVCfAAF*CDlwAQBm^Brglx7H(X13XVe(Vk^!DAY`269S=Ylpk(o zv>#DQP}1tPW>aGci&7%B(#KpdTTa@nqN!<79m-mceUE6*`X+#vg_^R4hBE0!Fj=@) zv%M83Bw`C8GKO+UtFe2aKUHeW$aUcw(proRvCL>Pubgt*H#nULBfV^ zB`%Z4J@&W;$SP?*8@0-(*h@$rMX7l{C8pkFm_T3|2}w=zX~7_s$df+B{(5nQ!zGMQF9R%qW2l9s~KE2y|(OVABDBO%Pd0zpC zAiep4{H4Lqbe#PfDnd;+!AWJ5@e3WdtXQ&HH0L zj_74KEGT&45oMNl@DF)oz8Hi_#)MLk35p_qHWFc(2E3>BxI@nZV*a?N^plDlH)!W` zOuSl=;|%R975QaPJ7=DV8x_B$_`Kqe6<=5ER{V`(7)`5ah_tOVyof`#d{UMsQ8rP zR>hYUyA(rs88Y2`#c7H>GnnqH6uTAQQ{({5HFhDz5k!O^&i)K{z8AUrDvJm^ifLgv zj*lFB=nUw<(vY@=}JA>oE3#T_OA?rd#Jc0 z2k*^u?etr)cSQXQxHfKX*C5F9k`NZzPoYeYYvGb&+xBw(TL|*K{RQ5cSmIaQvFkVe z?J4=EobPaQzVlOES?EWhB2U^aK$oJFFR=RW)Sg1WkM&#(cv`Q;fYaDd(f81E(Nl4^ zJO7}faI_zR!AJl<3Ga|60o+StQiwx4B!Dw8(j}<`@au?WB!I3b0dzeH;N9?X44sX@G`_2;f#yO8_JgeE=Hv}6LP$AMCy@u z$Cm)kWjekDa0v6@O918lG|`Kf5qX$Yd4+r|}(M0?52LA6x?HR7KunOkV;> znUK?40+_}i2?-z>`2~(h0G*%&(E0!DeG7bDMYaBZoFu172%$}<53Ll)myf>5B># zLYrcnrjWKN6fES?ByDNhge2u9LgYgbN~GPZDyi zh}VkfMFsl*zO~ovy>ptjX?e)yGWnf+v*xk(%z`hb#efaR1+162Lap*ortm%e|J3 z8%O{@%9b!9zew&!8EeRBZa$wNLuTfVV&XsoIGSw}NC2CeIFJC=GjV?jpwnLh=mZkL zG$!sZ0dxWhAQcasKmvFJuNz1JsjB7#62LxIA&>z6l(B&XkWZ!)k^t^ubdm(n2}uAS zB)239ptG+8u$pW_5oFE?@-z-2NFQ&{9}OkC4m3I zeElVW&H*HVPq7jz0dyb%Jeu4B31BX{1rosTlk6`6bOH$=_lY`z1h9&?CXfIQVcz}{ zKqrs@%11#U0i4LZ{Uv}-k_6BRNdPY-?~nxW0+u8s0sJWALlVH(_%aDe059X^LK46y znEyZ$K&oC0Rs!fi0+_`D1QNhaBo9>rh^~4ppH=-WgDgGLyLrt^h?@Kf~SoiG5QMMGoLK7zsJMf1M9K0YU2 zGT*&)oo-3kXD@Ib?u&7}N99>L*W1@Po7|0&4JmW7hI2;idC@M&+hPdgx*gu_zPxCR(s=ueyI0Ww)6yl&4fmIhasrcw`Iv5VD8P7UCZ(H# zcN^b)#+h`E4b!8K^sgKLhgFJ6}W*vkDF1T&`^CWtrQWVzw)kX(*@48QtN9(b(> zAxC4~j5F<=EH~T}lFL!rWB4V@4QW$%lwk%mI}d2phL}SMZu42v*dRmxnU9beZ^D~X~~bj+Z6%geht~sbVC5mb?<>6eX7+&4Z~XP zVC06SNH-X{;Zn*2aWTpbkHn8fWxZHe)0g43u0wyBOpiKKK0_M}hrb(gLo{#5g|E)? zv*!fv?T{0)ZRj{wP)^A4!8pc^HUyA#VG`YMvJA;#XiUcxO?0?CjVs6xS2wPfjY-47 zBM;2jKPW@2BI5owYq-b^AeUjkb|A0db$!_a#slW(J|&qO1IH^pMe!8HnTjGyL^_cr z0#|7G21Su2B3xvNz`HeEWQm|3Qd(q*phcDl?9=c+Dn@a;SgxZLMV1I!WQjnLB?3j3 z2)t6$i7XMc$P$5fYq+dpf)-gKP-KZfktG5}mIxGCB2Z+BK#?T^MV1H@St3wmi9lJY z1&S;YD6&ML$P$4fO9YB65h$`mpvV$|Bk&-xp0ZX86j>rrWQo99jTc!WXptoXMV1JZ zWdoqd5`iL11d1#XD6&ML$P$4fO9YB65h$`mpvV$|B1;5{EDdv>b>*) zeSfqs?VXXnsF(6X3{&ZL_US$7`Y)L?(@CQW>9%!I@88AtTz%qgJU@LP8QDQjPyaq! z5iUe_7Hr0YoV>y@ZCx`&;k&18E4Y& zquc$K7hb$d_E(tpb)FA>UBOp49=t7z10I$xMe&(Z3-{euN_`(#hr@OfbS3sv&dcaH z&kFZ2Z)o(sTbRzwvzwVXmXP!^27VU=f`hBlLubw z3Ovj)deoWrI}dc2Uj);A&V9*`;Y>&V{1y!JyA}Kf`i5GCbYXru;AhH*&tRY5`Xqik zlgekVm27_^FH}B$x0v$Xr2OJQy63@>OJ3CnMu z3Xj>rbx;3wHkvsG@SD-Rjy&B_^S)7?ufzC`W53}%@FYb(-=t?NRw^!12^ zHsIno19Dea_g>5G5!=RPu(^i0rIo;$jj(%6+sIj<_r~0wtT^mWK%WhBF4%JWGvXKZ z{sZ$*JN|l~$^U20N5PM_oQ>@^EBk4rT_AJSa9W%XIpQzSWwWxM?8CY1FCEZ!MPRNX zVvI(lc*Y=7i|v7?tZDuAxROpC8kN>uo8lE)dH=H3m!#MS;A6O8fAw(o;GG>s=U zdj9GtCVeML@B+(PhiJ!Jb$DBarF`C`1Ii53pH&vv@xnOFpLNYyy(wPeUeZ*F!+toy z#3Qg@J7}!VzV?T|i%^dCdLj4*o@bhy!T4Z)xt|%~Tb*xemEV<#<)IiJX1P9?S{}w; zr-9~`;U47;h5ODcA7OV3IrF|vo>%TKT_N(CJY>UktLaf^;`rV%enypo;FDpTi8~nq z;dxd$h|eI5^R^WHSPxDylIN8#g8|=7#ui9cW(Jfp^+C!wksl(((Nm z=Jz6qY=pgC^U7C4<$F8km7GVL@*Qkm`6erSUfw3puuHDp=YBR2? z7jwc9I4u;sg1rw`{L_8hN0Aa=pRnTB^x^!wmp*oC7tSSLkG0XN?l|^gM9R8)vDoD385 zRwG=esvC72VIyB8wh>`vJs&+S(d(8iOxR^z!?JL_zP)=NZu5PTRrRPoGfpgHe_1Uo(eiyZdO50>w+hN=7355Mp!tkAl zb=}S$<|EqiDnE{Ey=beK#(+2H78Z`Z517fXA4kUlfM zy)S~W2(FWj_H5Pi+Huaw7xiKCK=YJy4wxHv`vTnoJ;nhCjpUUkWs3c^&?^-m^K1or-q?A5eb|u3d?8Ey0h^qg_^x zzUTGHG3XbQ*sruduD~;ge%Z4mcSoPieM)#%@oaTt{;_j-)uz5$#HYvjtZna$W^d^s zzi4a=_}#Rd-;GQ=i~ZKx)R!6C(pRngGQsbUZwCA@@7b9RewBmZhld5rsLug7OT9qs!CoQivLo^qMr<+U2a9Y4A*<`l=96+9ey^5yjzer$GWBO;w+Anojq5ey`CG5`on)y z_QQ!?B^dMZo|tu1ed6k)>JnCVUBbos1NPnh(z3c9-dNh07#>5LA`RXj2{&GsNQ*D( znP^!Ryyw!F&~EplTnB5T8&LmnSH>U^X$-cUWWxB2Op~P+R#}jsJUE+tQ zb#>1yU6!zRT_@#S4}ayT`h=amEU^yAvRN_EQnp2j=lAYC&(2;aJeZd}n4kHWhka*w z_NKlk2GMQ}DC@&EuB;)@cv z_p?#OH}aC$`BZn&1K40*p6D%Y>}?v?Q~8}Xc6b>N42ljrczXX3Z5VD3#kA326!8Da{7 zH)|3M_2MvuOFn+%aIVOeD@yTV_!Zzc4!=VDIA8VVZ{E6i8R$y<)#>T8dSQ&)FmU zGnWHw0#2}3yFUxELo-k+@*H+NJcetIIWakR3fOa7^U>i8ko_^iK2zM3fba~@9&1eT zjxeTpj|-BJUtU0-mMN!JOo-rPLYm)O@4NyN8aj3w`=|J4);qrsKUO#~Ky%siLI9RM zHSl5dI;?jd1wazo3-#AKe=Skr_0E$So#xIVhcx$6fSsC}jX>B}DsV=p{SV{wMqGWh#@pwlb9FUb7|p$e@_0b(j9tdv@Ef}1rAMAiwM!g37C9S^(+u2g7Z?RI@pJCXySma~2;-CG1coPi$4!zdV zywY~kUobiE3Ub~h$t9=kaJ7zZK=QMh{1%h^Q$g}i1<5~6uQhxF{<&k>^tOHM)yPZl zh!5jmnspr2?(A_FAvDG9K+v&wBqiW_pFQ~|Nx;r>mDyoQ+>lv_o9Fo~72u0bXCX>;cjwMgp+aqG& zdc)ncXwIqN+*_1Tsf&LdZYWiU9sN1?aB)GcXrb} zcgL0MR?Mv|aUZdrf7o`s^b_s_S2is#0;gET`bNMuyV!mD$_fc8@`CG?m2 z=zqXpRI;L^(!BxH>l*V4QvJWHD%`(XO{MPjR|$vZ^H;hLTNU$)N=n=_E8NGeCiirY z&y)%`tHPZbogo)3Dt2d8py(jn?_F6Oy>!J6_s4dHdt!xqHq*OzU0J-L5K^1MctfR! zCG(ywa$iQ>Q0V3EH?Q*8K57-a=SYsvBggU*o_%v07=5^@S&Mv3vHN|gp8FUI|In4Z zX8caKL=Y!}7P~)`=xI)#$b_2lnAc&^yA{8Rx;54rjrG?2x;E?d);8c}R>j&i_%&On zuU&2}YHYR6TGnBm*>bT}4&#DIzqSr0^^m7cJm`+dyKDsz`Bydrksm#Q*vw@!@>vUG zi{#bOxVpZPYii)xLLc~=AoBP9i%^F7FmG4Aw$VDLvB9cdvDP}HZKbscCjcX^0mWpz zAkwtcgLG>=ALdCb*0xC?u7!M(4tdwMi4V5X=AJxe{>ft&#m2N+W9E2%mR0=3b59<# z`s6VU61KWzOhd^SsS6+Ju)Y@OZpQH~f<1hdS;K>Ed>paq7{@`YDl7APd!w^~&#}qN z_d*9o)$*+DIa#sm?M==`cLSdGLZrc?1IJZozG}D*Do-hmcGEy$V_lnPWs#}K&r6S3 zb!G}dvH-tw{2K6Md5jwe&U_8uk6$>wc_nbf=eme-xUiU)JalPX)7s|dnoD5E5O<+{ zf5s;z(dw2p9V)vsikc-`i8HAR##tN<1s;T;W5n> z9D78ThbNchE#NLhxfjrU*jL-EX=Ph`2W)*_W-)Cm)Ekk!UFD?x^wLl|&thnMV}~?N z&6>4*Mrzve1k|m@GYYGdFfQ3DH=DJfMN>d9FRO>es8?z6lyI`9wmQ5kLws7-)~`Vj zt`zXDgDubH4Dv4Cp90UfZZXmtaPL?688#yU<*oWPA&+rnq_-Z*@d=N;FQ*)@w9GT$ zzYm%22O4MijX^+|-y``LBfyCKn3w4|WRxfxehv8W2|He!ZVGPLRO zj^S6Yc?^rPp<)iMNX}_<*Z}PxvO$Wa@^r$m&KLAa?DSIc<@thCi7{}jZiYEMvSSX%uh)^6B z9ocVNO%xZD2O|&Oi*&svQ-~k09V(9XDjvXA1RRU-7=ElT>(4eZ&j!3!11{P{k2>-h z$c4iXu4fp&0tP|eKE{? z?p@q;S81(mCivt^x(aa-|YJg?;~sxXpDWrIL6FxPVVXM_1Ls0R-~uJt zZ;nFyuL`22AGIaXSAsV4O3Kr(Ns7n%yzkf#*|x@!_Fv*u>}>ERBEgg@G)3z-t>{0$ z>o+MVsIx+oqVV(uZ$hro0M;yn!SH1`Ul@LGo?BPn(uRp2EyXv}$OFG3WzJWCBIb?q zp5?sJmc@HVIsA)?yA`Qt!|*+duPVN#DEsFS&xe)iB8pMPOvP+P9;?E1!xi%sV~Pce z;}i=O2_8XDF5_mMhLttW>O0tX5p2xKy!Lu|bh1PVqX;iX3}LQ%{I^sp1ui zor)V2H!EJJxK;6H#m^|-s@SD?r{dj;_bT3}c)#KUiVrI8QhY@5QN_mJj~rzDBi00xFR;aN&I!h ze8@DEj^UNYd`lH~E8dJ(8^a%0d|j~tlU0U4q8Ps1l+JbU|64vqh~;s#B3hthW`azUHv zA69%?@wXb^t0?b7q!R;~z)=_zc)dA9{3;d2s380`N?)Pasdxhs`EFPG-xQO_{U;fY z>u`S%Q7rudWt;|z-AG^to*l;LD2`N|pm?(4EX6Yw&sA(xT&H+F5x>tX{Z*x9+`)C8 zP`Xd!|EzRs#4E>8BEn>UI?@-Aj(PG_wo?x8D<=8FiJ+$_JzZ&e&JbU%wDe>AGnlR6 znDSszwausp9`qbj>}QS-cAv@JC^MX|AINh|shek2E$E?cpamU06nzASs+ZvJrtU~e zcA&RH9k+<(**!M8b)qMTw68(lez>yZLGKX>Spwc?j|d-Nx>5Mq_v4?DnevVVdqgfJ z=GFnYN93POFu~s=!s~O7h-G^+rm8duBt;Tx zFOF_xDM%iH*ZbVIw|x#>d9ZYH4U()Uvj1 zS!3H}F`OO~n-q^vy=Zb#>3HjO3^G<-V_iME5!Py~6hxm?T|R%VmFnOFueklP)g5*9 zKzt(!t}s3>M7}TfAY-Z0!fVQ3rQnzv?p@w+=IvF+nB}`UAUK}p;K%$-7sU_LI-xO) zi|bT0z_fG|@niafrQ@8!X?laV-c4^UDSkQ@%{ZneuTB!{i~4Ht>tlqt3*w2OZ`&JXF3c z#2J3Kz|TCqe{?s2pKF+arkB6l6#?Qtg$}{@xp5}TJqSQls|o)Zh=JMn%>}XJNTO7zUShY zauDAM`&PWybQ~+V28N|t-?81yD~wBAvd4r&HUkN81^CfcRhgp9(NerM&G*vYlP{xu z4jz;XiRdtVt_Qi7xxKN~pJE<-jyZM8l)=t1TfOelZ;lyB6!pjCV=d+Xw@2XzU7hk;c6oM${?o;5d--zDaxur?@H~iy$S{MLQV&TqUYV1ZVrB? z>6O-MmkFS(ZvQI<=Z7yer^H=^>W3p8Mns4h{@VM>=_~ zxCCKgXWpU7bH)9oizBniLq1GbOOHAeHxsn+Gm7IDpDN=_T=HCTIO=gX5*=)=*Z~HY z7-m4jFL|!GE7UG*57RF7p*&@U3{N1hy5XXZJrW*oivLw$H zZ$Y}j%oVwQKA5>;0_)m?nJaRi9KWxOGvzb1!EpGyF;`^Y2weE;@625B2)$SVkaNZG zJC6M|ct?6uMZVTxxY|3y8nZ>F=Unk$JxAP#a&RuVm54riv*PD8oMQvyS86!RJ=nQo zYhYgS;B&=k)20u0u2_aSHJm?J>}U6ed)Tn9i2mT)yRk8c#ABMicbBnuvlM%HxrgtS zKJLMzy&Gs!Bz)U8@h2r5>y}8fNBl1%&0n!r$-TMUr+m0;mf>UE(gt3@9KbGPl-pzG z%B~XY-+2eT29R#vDt@f=18sgPni**${FsrR1Hg>*N2JmWbb-Q*^d&D4|1l$VQBeej z?J_>ah&1;r0L(@Cj5*Ixvm(uY9sjY4N%0093qiY#uyixFmj0?JE!}wj1w*j9IZ=YE zhhWlJC|;~a{01o<>+AggwoXv@vlMrj=X2j z-nL^Afa$?O(-k6($wMCGcR4-kOdRK`#?Pn|K=A1>&cvOJfbg8`RuEkXljUz9>%nrJ ziJ!>>ul0Kn-Snt4aTTD${AOU_V}A0(G|A`3xvI$nuWY3nM~^zwe&>M>^D76xY=n^? z!%g`(R}J%{?#V!N+EtnlAg(%8z6^vIe(T{6^E(PRFeW*?e z_?ah;A05wt9BBP>JK_v)rker=1I=mgLL6B5U9K7F1~aF<7U{l4#_G(qh~Asgi=ZuO z7KC$_1Fe5@^$oX%~$!%aNgOh$nQPU94CmI6mKM=sXwLo1I0s`r*;Hl z^MlV*Pl^wEo=O`XaQ)_~#tt~zafGGwOpI2;WGz$Ynz)ncu(#No8GG_~u$146I6E`` z1P%mT2sc;vPRG9F@C5beyais(rO(!i zAL{u)2{02>-djviIgDb0`Z%dH17Bd`sLM4@1fBuP-#en zG?kNId!oN`T1)c$=&uOln)tse+7l29hH&`i5=%Oyr&BpD+Dq~8dHntt%u~^i_dida zXjjBb=DE4W?nONiIvZCoup!Q7PJ1J~lmxhdA)=muJ+t(6$> z-&>xFO0D*p;c5x~l~YvgrCYY5u@S4pEvvAbOlRSPQ5E=Lvf2SjLjBqfY<4;XH_&{w zHk6<96uMFPaiB48+?yE~axw^kPM)vsFI^$hnmlB~bnEF+XX29QtH&UMPmFOU-N^_D zzrF7Su?u0G5Av14dT{D8(0uhj5pJB}SAl>qKkkKMe)2oee3d%WF{Clhv>)HSVSdfv z$Jqk;G2E0ddA>>=>cPxcuLzazK=aiU+`t&FXPl{T@_cnesC);SuZ{t~9K!@m>E$nZ zzREMe2Qy#22c==aUg16>LmOiN;0`j*CEmkc(U3PJzot2gvmnV;QV z34b}_tgW;~NFC9x?($mNFZ++aBCNr>uuC`}`lB&)TIwbr=qIyFv{4ujl>SiS$aApi zX~T(WBly{!UA>i^sAFP#pB;a*kL$|ii7kD@G0$HL`(x!6+6Hm7zg})_&n?WR|N30o zP)Du@(-)m^6aCxW0Wl^4Gx*B-%`VM zh)*euZ%KIuYu+pa%UWKG`!zs$e@Po!mSU2j&#NFSG8{G`v$+WYP))8gKk8-%|U%uLH+PPPA>xeYhXM+vxm0$&<-2pm?-o582U%BpWCs&NqaI3@`m(Mq>Uo2 zmFQYOC$VK?0n^83q7AqA&56O@XD6@qS|7{LI^z8+ZIy+#ngf2UXKLvtX&0tLdwFev z^mEW2ub`gta0dT6>1A0?JgKYqmKp1NQe$2px785Zi1-I$nz`%FEYsu;p{u^%t&O^bCw9p;?gw9c-tWp{Rc9y@7z?bR$BKZt4SVgh(?r8)-Gp22ZOCzeHCr`$#OYrH_4T4$4crt}(QCvtvDfH0&(?JMhTF z@*dXb==k+LHteioZD?n~=_C8tuGgclu`C(57VN-vr`E1X@cNrh-;glZcdeUYHW79; z^}12CHLsNxUy*RjIup>=@5R0cTqmce9QXgovZs4Lf&MZ7$m(8vPCg&QwMSE*DgKGR z8+3f+IPkYO_ok0S+z_o7u>dr$MSot%PaY>_dCq@1mt-&c0&(slL{}~Lkst?9pU9O@9Q2X zb*`p;)86MgcRYh<>G>x*cl1ST`98|&wW~JvJW|GfWu=?@?^?I?yVuw$+#7{mV?1Av zZ7kiKnEI`G(sxbza2=e}f7)A6(bYY2GVBuq)2Gp{adr2VxDV;mX7vnF+WA^yz5T6u z>#VNC`l;Xg@B11X@ivIs;%A9W6IM2yOq2bGp#LNpTHbv9P%)XX*rf+`KY%6`RDA~ z{>?nZ)mjLv#duiT{B^6W>l=GvbJ~hsok-o)bvu4viJJtCua7@vx%_~cC))8 zWp&sBc|rHA3$FgUTeb1))2eFkNJSf_lx;|))NV?oq8~*PU0+L0blskYbZJ12-D$0B zc45rg6)9V@i(@dphn~+wyK?L>(qeKp#Ljo~x~LPiAR7Lqq+zTJM=jZ~E#qq<XmrzCnEU@FE2uJv*(DBHXD zv(xZwPC-AiCA_K|@ zseNCaYFPIL({q?;g{{H&jm&_dS{5SSqD|2N$e|%S4cwch9 zJPiEn2H zKN)90;b*7L>WS@4bZ6kl{`6~J2YEOyVX-%TZvpyeJR`w-cjSpPdmPN2)=68B=zZdi zz3J64rd`kg+XzPmJyWZHl zlk@FI9~#+r{SPY>hF7L_t33CgLs{dr1zgt9!+BR4%Jr(Gy>6ehX5PkmSw5bh@|k!? zW6auscRJtioF7bCKT_rgGuDrMOY;NHZ?a)8-L=;Fb4s>EJhBs8aFzht596q7-6rkuhyC!g?!$LpSC{)c@PaMpm%@GJdh~Jj zq3eK`Bd&1D$iB{`x!Fv#uW55$+q@I$H|=>A(%9DJz2GsTU%&d+`X0{DKZ1Db^be2Y z%!I@?eEahohi8$Y{Moqg(CG(18N;~0lxI7H({UewNh{Z_3iTcE;d6uj*PVj?$Ni_~ z+kyK9!uw9~{Uz5ppbl49AQmaWrhtr$Q!}tWtKlhg@dcB53=9AdV7nO0uf~|~5M#_Y zotBPG+KeOoT?W(Bu{g!k&!8VF#*lF#&lqwR5~*B`iHw5P`%d*+ygjp1E9FDN6{ ze)qSj;sk7}2uTP>_7@n&0=vev1TZRH+vX@6N6Ld>&J+^)8Y4tO=wd0X_fhsxyA1iq z=*3W9vO7_^D>*hGJ+sSVX4p!>JPEH=I4S_jq2=$+t58NosVpP!Y@JE_XMdGH~}5%&Ocm_{70667H2C zoM9AmMvlc5BWXvRh9W(Q-*9Jq#`%n$z!0#^s##?@6FvTs3^`_9sc6Q-Orlg~Ms0}7 z&Z@c8atdb)j~wgBNCMZ2E(ZB?c%(+?&k4|f#;?FB&A>;6NwKM?gY(4@3-2{Vy|V-W)KTG$eJb%YUKut%&op+_8vsPIAZ<-6i*48#u%Hm{d2C%d9>b z&HYI@HZ%7tyoIM~-t63b@;J@88Oz8{eopQ-<~?0wXQspII{8y_UtvR*YwYyg zr^)IJ=RV0hBX=2N=Q`dHRF>Pw>sDyu^4yQ}(VeHUb8^#}x6=8R_^MRP058ExnOkqPr{hLMdJO({?^ zHTN(|$SW;%u9lK4$-SMi=R16L zIr%GcTgd7HC0ld9&)^y*FU|cGuUqTj)E+c-r=5EadDS^sRRq1+&fUcLdbzTj-(~0C z#*!?P>~8*@cCJXw8kD}*&fUWJMy2n!b6a@1CZ!*=bFU=5T$i=OQQfQ5LwxAFt^;kZuxJ|!ABOYtB$u4quO)GjQ{`(~vZjIp6V-MrwjZVYJBO`o*MzHtV zW{ml{gg=P?(HHTLearNVi;)=W{SjOb|Bpk}LG^;0o$5Y-xU^GPzT+l9yxfO^M^nr5 z8m!dWWRthjNKN7~3~|9oD1&+7 z7mU2nco&acW!bG#$|WP$G#LLm@S|=L;okU!HF6Eko$!(^9=YanB(s;s#-R;O zp2txT%f5(jZ}-MWt&!L}(dM<(BOs7Tsa>E@V4>^F`zOv7?6XHk_%gxZjEWXiu}4=i zWv?S$n%%ity7U<7#ohACvloqFC+>FS30P2w>z9~ zx8^%h&IWneky}^2ErPpejg?9ENLL;mJ9(?NE}n6j*{TegBmzo`UCRSQwMY-?;>)8QRgQA3-f?Vi86W!Wmv z=kFat`>t+nYg~q4G_s!<_X+a~+)F(5f3$F1!;uw*^XA6gi;A(mXui{wJKw$9zRi8o zt(b=sAS!XF#dki|wDEfzO6C?$b?=W9yN`dYm{@|?dG6;w*5r;`x1gk?u%zU{#*(?E zb4w<;m+dV1uA9+RRN{^)E}2^rubeYEes#%e_vi}u!s60raYgqc=!h1TI)%d~oiS;B zQG8*Qn_lc*TtbCbzx;? zrJGaXwiH*A;Yr2r*PP<%w>n~NtSL2(g16DGS^*to^^#s4^J ziliVB9bYkTQejDHV$YWm*%d8?mwJDPaJNZ~x3 zVsf`r;cmNXo%^Mazv6!Ts-_hs^9tQ(aFWPN_Ri>NlmLg%Y^ZdXR;+L*?wr5s)j5@O zD&0+2g8ZTN3fk>2l_lCj&s5HxH+Ok_N71}_C|7z#iMzJgeG{CvT=^gFP0mhtK{R&e zC)_9OijukW<`pd{nY(<)yrRnG4W8Ksv3VTct2U0kQ5}c9@~ndLtgZI-_9vZd-A_a| zr(Bb|DQ#nP11AJIp>)g#8xPl`e~Vo^MsfISkZ?WEqB<*k5@_l1))0(9XMl~jLAC+k zro%B9c@LPyAy~XkWHg|{v01KRd=2-&VXv(`Wi=g*Yuc@vrZshK%YiVd-!NsmRnxe- zv2A(dnq`++jXWgcFzh?j)M5YE%8s~IbICFc1FP#%bOe!X7rI>o0uAMUn!)%$ZSo4b zx*q8-Sr+6EbF0xq6ap?ZM-e{Q0`I~mj6N2=n{mXIceqClv&oSg*m8`(mNhjjY>n3l z%b>5kvQe0DOY-t&9GRl+E0^IFYF4gpUEAiFPOfQcu4CijT#03u)}e+CY{|y)9M=6jMJ`7uK5%g<%n=Q{eu9WzAY#dGaJ| zU&JlMO+lK5#m97+{eRhmZAdT-=2f^(ahp3*O2s z6Aea7<@%>DwqWuxfDsPug>v1x<{GJ;S9@F;*FixVFR^Mk)LS*H(I}x_ zTysg=N_Gm~4>?o=$4S(!nq;l0ySTBYVdZkfXg6KC<}&H34Q(y0H4QD7p!#bXFYRcu zS}ty)C2KI?$sF44w7F~6qSOeiX>VAGc3jzEU4n)}12#3c;B1o`c8ungI7)}Nf!&jB zTY1*3c{K}X&sw~2(cH6V*HrUf)-_o5_4O+|+O0ay3vpf!E(*IU9d$v&irG7q8KuM9 zuO`%7a&x4LJoW>nkv6J1V{YYaQXcZrlPa+=p&o$ODwtscU9)U$TN~b@Y{@!yrH1yF znia@JKW=3sP7=Z%`qg!pY6nDGG<72m`$2TeT2eLWis;P@#m!)m8a>iYg#O+RZV^KDjhZ0&g_wTU+Pybm)o+YZVjIT@22PtUR5I&0?~QpjgNcNz@jX! zY=MoOn&pih=va+4(t}OamLX($3ywo#Gne9-U9+~m5yKs7iR|smc=(Ig!$KXdA(@$}G@IDSZ#?ej0kLeGVE{-%N54;xnWq2=hl78IGke}iI zghngh_Qn|=ry?L+j~FV<{d1gGunkN-7Q%1xz-vWfmh}%)*ihV=@Q3-W_^?+m@?-rB zzxq%fc*Vw4t9ZPBOhe-zag5{dc107u zaKgZQBJM!~G{4_u*CO2sCR2z94O4_}lXW-J?HnK-uN~?}*3(#sp^atep;3WE>cM)k zu3>(6VlsIVGph@EO^{$X{NQ^c!dKw+*ouK0j19x|AUS-t?6Ix%!=RW4zbA5JpchYD z`JVIQX%pYjd~`aoRBLGF|4fKx{8o_)F@=|ZPl#rG6&p~T7tgu5p&5UFh&D0Acf#hP ze<|>%pW6wIBR$>_K+@Ba=vhfL#|Pt>zQzzh(rc3Fk0;UBCDH#ciN0HDeh&>r`+hws zo@?L6@p=y%0!aF?B>ERg^ly{s7nA6hljy%B(XS=ZZzR!ap$CBFIVy=hHi;gUM03r} zIOZ=&qRT+DZN?#v?emeO_(e%{4QTUi$n;G~@y$teunDjjN+|| zU5a-q@>ylRdlm0fykGGF#RnC4DL$h3sN&;_PbfaE_?+SkiV4LR6?ZGXthh(qgmV;-ZI1@0}WB6!DJfmK|Y+^p<8bp+1;lZ%B}l~k zKZ=(j;|qwO%M@uJB@dE~R^k*KTTO)K>#f8X=G8=$GY{`cmU|o#^b{h>eK*j-i|1Y< z+Tk^ZqrR^bQQz!LASUcwsNxw@&BOwfQ|Sm^stkv+l<;jJg72L~l=D6!%9V$S8m}KG zf?qiilc`SP@wmPsjhV1~am7j^(sdBQce94ys^NQx;QPA9S7t+0H^!R>IMb02G|#T- zB%XqHA$|zgBhK*V15AhRaqzvA$ACA}0mmz%YC?mx;7r9c70*{(p}0ZulZu~Jyj$_x ziVrFNLh*UUKE*#OM)_Q!JVz@QD4wTSuh^=1rQ&sppH;kD@mq=zA`9QA6#EqaTT#vm z!*%&x#OsexJXP@{ii;IRD+1|6hXMF`4gZqjcNBlFD9Q~;m&tL0{1vAumMbn)tW{j2 zC}%k#-~CEIq$o;Y2!B~=eqWJ4zblEyD4weLgrZ3F5id#=!2i+kRE#&wm#bKyI9YL~ z;sQmETTI`gc%|YN#ak7>q_|V@CyLK0?pAzFF^UdMzQYwu6i-v+c*yv36q^(`Dc+!X zo8p%hf2Q~w#g`TTshG}j6MTAVg%zS zuRBF?mLjE`4BxECjiIDpR{V?NKNM|@uZ*Y7TjD8-a@G~-b4a64epK-n8vi%NqcFZQ z-&Kk~S4=3*#yHCOPbq$0@ry+8{ifnh4d12okCgtY(oZP;tkN$i-K+F&rT?V#t4jY< zX$nACjx-{!dxFvvlrC00Tf^&>Zc^N=;kPR8RD4eHZ;DrOd;tF(j!*bEoCvy1>2jr) zD7{o^bSDd<8gCp1VtAH(GN)TL_&whz#RqT0sA?!Kf>$udaL($v=bJj*dDP90ZR?{> z_EPMbf*yJ=b+W^@*_q=59qYr;u@0#=XM|Oo^ZM&i9}hBQkm-bE)n+T74!Fnq*n82=JvIkMSF1aD6bwF6B*}gH4kGM ze68jqSq5LL`L9fQl9w+hqZ&;gXf^+d`FyQrQG)BQ)w~{=MXQ;g%7IohjhKYAnt#s7 zK&$z~4K zXf;2}O9fiZpF^5M&}!aHmcCZ=L*%s|t!8`~gtVIPWx;%{=2@hCt>$e^>1#FHyn?UQ zypt&pL#tV|qJ6FAK3-uzTFpG_GSF&nWlCSG`BB!-*J{3rRG`%??~{XTHUAJbcyDPn zx1q+O)jXGt8)!9ulr0fxHOoBPkkQ;8CN^Yd?kFY>w3?q{y9HX!6Zv2STFv!L9B4Ho zEgmt|hMk^!4ig7j&1p;=Xf-!6aiG;qRV*jaYM#w|5@#8RiSLny)9<186nh$V!B?nrUXh3ACDj#O#4qb0?VxTFs|2 zHqdJRG4lpm&0JUsX*GX`i36?XVI%{sX8B4Aw3;U}Z=lsYhKXwft>#NfhqRhwELTXY z`FOTTNUJ%6@gc3|yO}?v)hxQ-A+2UPfATKVShI*;DU?yAGkR`k^p6P6vH6JPE`p-Q@st{A^%jAQFV|Ese989!rj zpQy3weXU4ZtYMk?sma^#0J)H2i?3JFPkBVNn|!qhRmbr)t3;8+S9SB2R(GlLQ!LkwEjzs3ob=#=dGfo<>rQ z>e2L96Z6hI>aS!XS{Kw^5!IYPJu1)w^3<%1R*Y!F$UjlwF*DY)o~8}RHZ=E#c0N`4DF4c5}2p*=4*I)sy(9IL@gXB`$z|= z_tb!-$bMS3KtBRq&%3q#bms<85A!wNRIN@m@I2KsuLwzcYyFgdjE)=oimKMJN}?>L z>On@Si)uBf0%AqC28uUfO}c$ljEuhCz7-8?Qw4fqs%3Y$T0!O*(~cGnGQOHtf9;@T zzR5igx}9R-c%Cl$dA9<6#?SPpr8a1 zm+#DV??DLq3cs$!U5a!k7y@Y0CF?icf`FX^q+@!_hJCjSicN6@0;IiJRJJ?oYWgU= z)}EuWmyaHG=DLP97!Lne={E)aD_k1Zhdn89uFN9CH1A~KTxp3g%~lSa3k?&t64|^R{GnD4=IWa6!9Vh z1_fg%G1iVPGeGEkt%K!M*pulBlLzYiupuo>7EizEhA_E1A3=}9bP@u>_ zfg%G1iVPGeGEkt%K!LS*sK{Srpg@s<0!0Q2l&^cB$UuQ20|kl<6eu!KpvXXhA_E1A z3=}9bP@u>_fg%G1iVPGeGEkt%K!G9y1&Rz5C^Ar>$UuQ20|kl<6eu!KpvXXhA_E1A z3=}9bP@u>_fg%G1iVPGeGEkt%K!G9y1&Rz5C^Ar>$UuQ20|kl<6eu!KpvXXhA_E1A z3=}9bP@u>_fg%G1iVPGeGEkt%K!G9y1&Rz5C^Ar>$UuQ20|kl<6eu!KpvXXhA_E1A z3=}9bP@u>_fg%G1iVPGeGEkt%K!G9y1-=yZ`o&*~=yQKp?$>j0^Z@(2NV-_)_DaFj87NIX-<_JU;0|vDj4p)BmOM__S$LVzJ4k{7-jqd(54@ z7^=vzg(H+_kGZOM4{Rq{Ww7yB3%g3KUEO2R{E*Le+f~1Oaj%uq1I>?KJMr|3?k>;P zr5!6r*ah7fJJW6Jg%=qQ8%ZN*PZ0K&Y%8%T1tW91T~*%0d^Yl-8D7$Kl81Iyy*#ju zR)#$Bu3>h(Jl87Q)R$s)b?+(j>=dJC^}=Q_h5^`XLY&=NF6Zf4WjA5SqTRqQ8}@}q z(0(n-Oqt?gpS8C?FcEaBvJ!(zm9)AsIM8AA|X2%o#uWF zfD=%L;Hoy?5cY}w(I=0SJUrvcj6JG}{})8rkL^*C@$4vHBKD|J{D01n zhX`XO&(d^kb{!|-7o@lQ{;G6*^jY?JNwZk2>)0p7kPT)A7?x@Cy^rNN5-bPX!z;`A zlBdcm%lYB5oG)cr=*`p|nV-JBt8@D5$D=7bc>QIriMD%radGpSxh2czx<@p{i;5;q zEx~R|_tJ{xCD__I8Cx-{3QMq8c3zP?t)dvCfxYi~7?-w;W0mJ*!H<7{#_MmAvj z;Lm&*hoQ!rfS=c8=HupF1qv$==Csfw5#$qy8gLJ!>12!#7PtItvS)}JmfE?o3kPP) zx`4lM<9iN$QN~|4k=2fXtslP6;>rNaDBem*Q04a4x;3o>Y}spHwX(Gad%^JWj-6<4 z%gNv9ywV9i_>@1qPkA{H7(Gk@zLHHnFnCG5 z0OC?np?@<3(D36o0KfN)%gYSfh3#SZ)x&S{FzvnIS4NLI)6U7?@&(`*LmHNkBeCI^ z{4LM9ZZYDGGuKM~mM;&L4_=>N^0)j5TqtIk0S&+P@Q3SL2_~E`v3!_k`23Q;B^H9B7I_^u}y2at|ssm@~9#wJm=DexV@o zn(L5wH@@Y0F9R38`aAROexzRPaUj3lG2xWy0sA~@|DA_7G#*PNazx5^IdDAF0Xa4hPg3NwO?tLsrQ#yRTE#ZS%M>>%ZY82q+^l$)hJQnG zm*US9-&7RYJMwWq4zHg_1RYbHq~SF9#Q0Urhj>0S;q$nsD9!%Qcxe~>Gsx$R;nIT5 z&A!s$!M;mQicg({j}o|pf0tY_6c<64Wm(L3NiDuf3XMHi*lo3I@qL1C5@XYq_F7Y8 zo*iK75Z3zN3wYj+va?f%;{TYeVHqw)2nY69qnJU!Dpoabe z=Y7k}5WngWicW^=5WdDFo(|!c&`F^~SPOs-;hA`?>_>-?J>;-;2*1G0$B)8)m|x2{ zkJRXDp`b&^y)y&p5Xw4^XBqW6BvBngTI!?@p%|?k*fQ#Ok;Lc;Ml>G{p%2JAlHNF5RL^u(IJ$U^>qlxlJPlS@gknV(YK&OSdW`d9m0R2 zp9VUFx9}RtmQj;*2yaE2L(n1o1X&JBhwxwP7HmH{gk4PO>kvA;g0Dkp zvxN^shj1&o_&S8I@Cy6UAv~5Tf8v$1GUMY+xgQ>vL#DNYW78CJ^`8tHR zF>#x9l{%!IM5;FlX)N=!W+r# z06K(Y7{9L$q0C=GmQlZoWTHbT13;idh(*J&4&ii?2hbthjaCvJLKwjh>kx`qBG4iH z91C>-9YPvx4eJo*kz1fc_!P4TI)v+3s6dBs7Gnb)!XubB&>>vFTN7AD{V@{75H^roNQZDZ%N^1o{3g?fbO0CR(H>BTu-P74_8$Db{s7f!o`qR`{MXrRaZ09J&=mf5CO5 zZI{elzkXo7LOwXg@s5;d!G7E(XQR6$E1Tboc%b2Es?*mkY;Kk?uE2V+=tb(x+5LG%~KA8>Am-ta^c}>-Uar! z@IAk5AQN`)Hyy>ds$FPow0)pm2nkbNy;a=4f@2qb?^pY2Txkf8{^p&KER(2&5S(jd zIr!oI?XN|1x=R|f5OJ-F1{g;-5kIb99xPoPX-pn?MZs(^`h|Z)Cb7WIOmKz=*Ddi9 z^xaa_gN0{3xc0~TvRpFB0U9?JYtd5-69gJ>vP@zr8jAVJk7)SShw{K{EydboAwB9$ zJ6`}gT)qbIGwpmJnFRM#pJ12)P5F{#5*?xPA&XzWWSPWWh>Q)uZ#}}o<+~zOz5~f5 zehhwhno5EP%g5jCiU4sJLWhiNvc@qD-97lBulU{R4x}5Xz6kdF6!Yyuz)pJ98Gb}> z*5gIIJV^b*JoFd#N#hJZLmLc-zZ)_MbkC5pMLra?W4JVIANHicy&d|6YsUn38&;?dE1!gbHgIjzfOx7qU(t=ofyVU-*H3A)W&)k^NuM zFXZk;*0)eGA43}Db9~PZTECE^ic0bhD#!cK^y!0@DtrT^Ib9>PoLZ@%-8W!E!b+{9OcPj#tednj&h&!+NnUhh@uQy(h(I4?QP7+i|OSe(~aNyaVn@vlevU zQ35{DS;VXKTGk;II+3`K*ShhWy3>>%3LcTzcAT%Xm}!4$$K8i4oP&!xLcj947p+)= z`jIbfJ$Xaob7i9wH%=%>q*&V$KN@*wg7G%W{EX^G?gsL@o~~t=OZv`QuRV6ckJ(-? zMB_W7akkf@UbZ!+8a-BacTc9aVMM|f_GZVor(~jB*y1_Vim$`H-O{t?EKg_CD>T1QW>-z(*6@RX839fOewP+a1nUanB6p zWHT=r9EkZ3X7v~^?E5$_s$$;;ayF)8PC!4`12OMI5*7PC3opgKJZNY? zrel7~sEMP5e>9_oY?R8(;7Of^8obz-c6TWDU5oMsrej3bFxk6KB;!iPO)*!!lGpLY zzEfBRU+i1WxRbn;IT_!yLHT0e9H#WezJFm{f3fecaTzfk^E1ZzV&4mxFE|i$6bloW zjuESr2NC;T4t^r`m6r9zz9KdE#lH9PqQ2OdWjQp{G56r6Q0yy~b$rt?J6ZT-vF`*j z4@}4GLYhMm`+k`$eX(yYdF{t^%(d(%zSuW|_r@3d-okvo>6pJTr7!jsn>xPO_gLmT z46*P1ET=E_oz3RmkJy)|$^~NIAF(XH*!MV=(>ERSJ8}t3$9#=R4=(nNp$6|QvG1o* zV-fq_&guoGV>;OqMz9;nUCmfSMsrW+oiJo(u83a)v9IW41!7-08!-_3UPI1-*!OI< zTp;$9eMW)US0sRe*!R0k9GH&bxuGGk?_Innf!O!MBm>hiF3TK_ ztZ>M5%!|BoNbLJd#)nMDtYQ4VV&4X`4T*gn&?5Gg0U!|jp3iiF>6lNGJb>6Y6BQS+ zZz@|LFdf5Hu#oAP|7M{MAodj-Um?>mQ`kg-*mn%M1!CW4NCslxZDbyZeaA3wAok@s zts$}RvCJEYee0MvFdainI3cmGn4Jm4z9Q=niG6>@%ptMwT+$)aF`LOPB=%j!YlpD0L~C+{+p!ajv!VCTl{yx&V4GdnkC=A{WWid@b;9@}e9 z7isa5W9fLcsJ#zmt!Gqp1!gS6{Za z1EzN%IG6LZ-fjav+(zXsyuK%G`RprUuaOQ{Lw%FCXw2u34fwn#CG2g|5^s|YpT;!} zWH-Pbw0BTUjtpoldbVO+Du6hvN=OglztOkc!p4e??C)6yl&%=ed$@=242`IwIODU37T znFug`#^vF?&9|a)CN5cK{sQVT4ry7B1If%E!$Rm!3=^a^-ej41WF+R#h$lZHrw_z> z{7fErt(&n(8^|=hbPP|HnP-9@Wsc;BgKODmR9tXcs2s6&aCCkit#)K)~fn?@? z1izSJ1~mNE!yjr^s~}Xq1If&fKqVe!W2hrP{%%*)VCxxFG~6!cx?K1{pK3Mfj)0tE zFf#LrNH-Xn`4R|usk}+?2iu!PC9Y_2=$;{GOWDi( zXD?hD)`vYQaBqjqoWrMaY_|d>INhWSy~IQU8E<6fGB+>icdXOeW}Mixx&>!Dsd6R7 z=b`D5ob8hbCXav(u?pAtK#u-_96gGMmU7h(?DTl;@P4<`!@-&NJ4-Q7ae`uv;&qC* zE6Rp9j2V2V4qo2wZ<~!BOx`}dbn3Lh%G+NUK;BMS`{vts^kqWUZb8-_fqdP{{%oIB z1sU>vo_!x{E9BT^&%7AvCugr_Sj2`L79&1n>>iyB`#Z3~qcZktk)hKj51Ifn_UhjB zR>;^}yYQNW+`TU0I(1#cC{L#ho#%VdZ+8Z?$j%`*hb$d(=+E{=jNH7e+?Sifbe+o0 z%ON)}cib}Mx2n4_T;D?(Ipo*dpcAnEj*@NNn2(6u+{m<}NJlw2<=3Asi&>C=^A(&< zIXUaxt#WR>#qerB7j>(Ji2b9zNQ9t;&`H>yVrS2Wp}0??4Fj1r(?+sA8Mb4io_5zT zD}Hs~pG21ZOd!iHdnP3t?cr2ybiM;w_BT|1&Hc==0roS)UQ)N&%gjB@v|ohsez1o* z1!M6r+a8vYadO5fAch|kB91-uJk;voB83xMo2N;F97aG_ATNHU-o?o z->AOqTaG?ZYVfjeTHB-S`y`YvkbTSMKVSCEnQ9>W-o)bhvhNuz!?aOSJA)i%QL?mMD{H$>&w0u zk+CoPZX#b__RX>!n(Vs{O+eZAaV(H8`+kVmNS1xS%u5Bb?_VIzA;`YJNtV9s`&shZ zkL>$&-W6Z=Ekb!;_RUp@F|XjuzDKb_havlZkX(G(_n&!%{m8!M91efW z^A$|#%f5fZ`uVc&FOqulhfI;b#EPt-=isvMaj3z2OZL43Z6mVpWxNf6?0YlY%t*H* zxh0G>WHeVKw}#BjJ(Gz8+4q04F#_55ZM{|}831r{=APvdBA7kP`_ALr6f$Y1D zi38cUoFfrzd0xtU63D)P&%}Z3TQn{L+4r4H9LT<9L*`ni6ZLfSA9Zr&Or((Pdn=iR zWZ$Ba5|Vv$J!=5jcQ&sQl6`*#$wc-o13)1Ara`-q?3a-%m1oAp8C_nFq4(3dRPq?;_r~K=%D{7A)BE{39j~ zWZzs749ULb9IIf<^AhF_WZx5*I3)YtKsqG*2H8*cy_F>i$-a+axkIw=`(y#tR0r??o)n;mE%EtQy%jHR#?k+4mMqa$p`3|2}C?X7j>* zhUEEq7ohI;CQtSq$-5e*us3}#4CEl5*2qJ_cV*kMML{PrMN6A=VkW! zBXQy9y$g?|D8+tWN_Vzby65Eri>%n`NNnWgqbNKNHfn#Hlyw3Be;_?C!7(4rE9*<} zTUL@JJ;&}+G}2oZonLF)P0NeUnpUzL#x;%DeEIUC5(vdbXdXSkaAJvjaj|<;#r%?z zc^e=oFPS^ft*Q`F`Dq}K8m3b0eeG@*upg^qAA!7lUt#&2tT;y}I;M#O{e9)|kHrt& z9F7*C=H|i;Aq-bhL2n3Z5Xb-lQK=%JGN}=n954e( zASIJY5U^GeaHvzU+7|n&hSt`hwx!lutF=W-ovJOiwY9dd4?(JScvYXTwtsE?zi;ie z&pEkdxJ017_t?p~Yp*@5J@2#5UVE=?mLerUS5kHRxxfG)K4EzMvWmKuO%T(6h;Fmd z#a*uL+KWF#9?H|^p~c=0C<_nib+7opCKulayE`!WJ85+7`i7i?()H$5OVOXvk9mts z8@8U{awzM71LqKB?0MbIhyFmiPI+ka(`U^+%{izlw~wlF_mHuZB?`YVz~P8Vm$8q6 zLm_;I;=wD+m;Lgagg96xG4Bxx8H=XN*t-kIccG0#G7NWr$iZ5trG?|E0KP4)vEkBX z>~m2L?t5i9dXlkk!Z+iimI%UHYr2g6^C1~FW!bDh!s<{QSe^NhVb7;UjjiW&8T(zJ zmqHlkuRk73FI~od59qN@t+DxQhC`?toNb}}^(15e8R(@fF+fXieHy*zKo9HYlE0p0 z?EeLNzqEx^dZf8o?Eqq)ML{!>v3nWH*i#wG*ylpVz7`px$O8-ZQqL?G>(2INSe@q} zV_!^*8e1UsGG=F7+!4#wk?CY(-zCt!rRjj0g72l^x@9kS9#F^cIbcUlt ze4Y>+30SA>ds_iVps%tHJshy)+|jGPUyK3S7YjI=;Q`AOav7dD=P^RgD}+lF%3>ez z4T@i{P?lTZevjhcR``U%pD27;;ckV0QW$6c5&sZ{qZFR6uv%e@!pjwMpA+MW!aJs~ z_(KY%Uf}*y#dj-|dwAf^d7Sa(9v(o^ZwM&&@Bqp^Jb-c!51=d+0?Iu+fM4`Xe7T1Q zxZJ}7DEIIH$~`=QIT*Z5=WvB`4-as;hX+vZ;Q_2vf4PSTI3)v&_n<;K9|Qciic>c^ z{Y8H(pvdx#dtQ10P@yWGPADEIIH$~`=Q)3Qu_xrYaM zrQ&iA4{*7M2T<h-cc)Lg5S_^V1lrdMm$_i6!et7cAzY?B3c}@bOodjs{B6Vv z376SJRJeQ_e7X}Zn^;kvG7brs-(=(w`OE_JY0o1za=u_VSbZN7RpIjaq-=%D?{Qu> z!sVM_RpIitV5M+*0)4yIr~MeceBtt$oSuE*@(Cfo%!SJoNmIDI0{IJs%d1gofj;ea z`jwe7#*F~k7cLKG9wr&Tyu``OgD+gZlT>`+^4s(~!Gs*1c!PeOh0D(&84)ha(z1WB zTEy3ZaQRSXCOB9vqV8S}R+B9d;j+}MFI*nYtoy=c;Sqe{GV`)`!sYYP=oBvhgE4*K z@+PK{E?iDANFZG15yQO@E?-ZQzHnJslWv5|C$b;NgnD7cNJc zf-hW-u-*C~T>ccP_`>Cr*xua;myck`XH3tSn^?)b_`>Bu%%?A07E$vHk23^?%T=`W zE?n-95`4IX%RB%p!sSn~c!6+Pln7YyaWpCXq($S&F>DEo<|Ie4+5+KnA!|4gF1Isq zAY86x;BJM>9Sj@@m-{ntAY5L-Y7T_UGwB-$mp3xqK)5`CXdqnv6AKs!mtUf9AY2xP zJtSNvQxHB_ErQmNaCsa3dlxRtcR@(F{8tn}gv&Ak1j1zzI0gr+uVm(WI9UCA)RG97 zUuAU#!e!a-5(t-HWp(u+Tz;8_2nm;uB(*@ed<1h52$z3EG!QONC-FeIJdkk%;j-+P z353f78Mj;E@(&p|5H8D>lJ14eA7{cn2$v~;3=5a5n083G{7=RY370QpFA52lf5!Md z370!iZF?hJ9?A>^!sTm-_C>fXht-#RKLhi6*i2?}e;uqA9ofG|HM!TgJmgG6PTJ_x zUT>teMxXY2)u;Ur6v|zn&p^IDZEBJU#I&WvoJ0BhzgA2ed`IlPs1;lx`W1Myt3wL4 z!67?TvgA7MWw|*62p2T6THeOo(hO>n13byZE( znzWlA;aSzX4E~{2xc?>c(TaU^Wca|I74GVgu+hHG#=|lC)`r?9D^Xm!vbD9gsl8$; zI>WN&R`}PqRV-ay)y37B5T)bd%%+tsq#+W@3UrNW^~)`p|+JonV?M&Vcgy;#9 z0JHYRAY5$-zX0rOf$tG4tNCU=*6X=WHWUxzGaQ+MqZJ1yBBn*51q@4*F1ze5TnWP3 zIE=?|9}hWL>$J3Rnd;Q8K{=RtmV@hmwj5k4v9w`zs8f4l$iZ6EWtY@}&3Yg`LQAh2 zb{hxQjCE=^fL1_z*uP52%Q=rEUo7RvXpUn!bd*h(YWS3t;xFc<(5Dhpxw(rsV2XJ_V7B#jUgog1k z9&bV(RRTxKE?M8qDj~}nrk6s0nE*FyEIo@`7>=DDpx;krx7rybw_2g@7V2 z1QdB8pvVgWMP3Lf@&hi|0E;$io6g|eUuGJ0@|y8#6xVi_bu-Si4tw-U+4SGnMCU;)?^XjWPj7p2u^((P@EB zZD%Xa)aKnP`n0KEJFf#ewYNg2HqQLI=4ZA zqC>k0{?JYR(yQL$NNOipO#3>!ngS`XcckIe>Zsgh3Kjb*KzaHqwHhy&H znPX>d2k0OUbW+be^-k!`zO_re*`twWy58&r^j{Z<-t6;yz1i3jbRF{YdKUH+JSsr5^41 zyYRk8UZ67@XN##v+s&Je^Tjvp?uRqdanwgxclJ;{W9)21-L1ugGsb^pIwda$XN=2V z&dNg@cpcYypT`;F&qzMN^BmNN{jWMRoPJ2yxfjfx;Q^zeT&m%T+ zK7Qp)@Q;zGif!{q*@|sb=))?ueE>mJZ2K!%DYl&h*p1ls6?&`kiEXP;brjnsnIT_nD+goK#kRj-Qi0f(=Z5z}Z2NWAhcC8$oV2Rn z7u()KED+l+XVBiowj)vU50}{XHk4Szwr8>#0~6)j+ZZ?y+lmA)5Zktrav-*CU?u~x?L4+gAhvyjfdjE^ z7AXf}+nX3T5ZiKOhV@}TOuUCP!OyTldKcT~kxWQz`!(cA#I`a41Y+B?Gr`jttp~9! zj{=L>Rz7C}vF&Y)7l>^?#~SECZ2L9~5faD;?9?R+t z#I~#0G=bRmhYZ}U*!B&^4aBzd7`J<|?FQ27L2P>+sqMv?;0`7i65GDZ_&tejFF>{J zjo9{CW;hVr&SE|GMQqElYR?2OVwlfK)6oMV6KJ1Sn z7w!~_aj6gcKg3UVTtXlAH&IM?N;T~uB#z9o7dR9-{GIYYuN zFeigg+e07r>GbyXVG9O**jx*64N`8^VIPlF?eSjcyFffgwo?DEl@#|)$l3Woulc^+ zdr5Ow`mnb;Zry~_=0G8KBCHU5*`wp;ESptaY_(y>U!^kaM^zd26GjjArFY&1Ag7n3EPu-tkSaBJ8lyE)f8mFv9lhWRQw^Q&0CHit{4sN&w07@HKW>5CY9|LU*) zP#)RcL-@S!4(k42JDl6;SZ&|NbyyF(9o0P^&<&4@11sJ>s0zESxng-$Q%wU-2)9hc z#tUpS!9jPP3a)6XT@6`0T9ZfLt!y8gIjR^~6ff{pu^cM4I{@k$soiPCqJ$<6F@h>vu97Le9=c zl!IU3EJsgr?kgcr*lLL&thJ`gxgW+$*~*a#ZM{^7;=t<6fFN=*Eoy8%Uj#gyzpbE0 zxghh0g;<{+TiE6SR_8L%8%c{A>z6L)-X6*y`3{@EbUF7OpqH}504=@su!r;aQYe2t z$+^D=de7QIDm~KN9HI@Yb1e!Qt{0o`eegq*wlECMR)j;+zOmu3p3QK+`7Od_BIk}{ zK|T{X_hj^!kNDJsdI>p+)#iuDfsk{v?gQgGtOu@w8WYY9>xVrlF#AHz&HiZ(`zz-G z8qOt@dzTtie(CSaxqDZHZP?kcauh_r6%Tb_->;BmJ*W%&pzK=~i!fIolzn47pdJqD z!Z!6_bzyhl<;8kw#+1loE1b9XLPqW@!|qK+KDo54EG4G0{}rdrJ>8WreIy3sV#iK+ zMt-gv8F~AaMi+LZvV(HlUC?j+O0!b-tY2jmnux<3J8W!xU@D&u~f)~x6y0FZHCfi7lc+%F+kNXC6S$f}I{5%_c`<2JFP zpJS52ozLH3WM9TzLu}-H{ECd5TfS7r-9*Y(#$5u|T4mha9i}pF${Z-;z5uWr8TVWC z@@3ptl8i6ot_t~OF5~9WUdp&-qku2tK7my_A>WiEu@QL>jwXwOQ(wk?I`iPmxaEAB zFXL_?6<@}E3`6=d?uY2tS;oy%j3VRSKtEr`-NJZ*jC%|-6Uew9VX1pLn#|)_BIA~t z^<~^kNO)1c7IGOA^<~_0qVoJ5aElaNi+!lk6PP((l)MQ~zx9Z8lrzX37^TyIr|{DN zC(5{wW`=wj_j61mUB+F8;2|0JPZ4G>WZd5;Nngf&6lrxMhh8Mkaf4P@MMDm9RC%c0Uh#=V4X63DpUA>}~EEn7YU z8TXeMIFND6!O76kiNT;W$0`2Nn#-d+&7xz%tpX{)34|*TCYDTLFONM3SBme`y!+D`eyogH%E=y zYr!DaZefZBImfEK{uy(7EmMD1a?6~OEi-DbpEM~OwbxHd_7!hY3u$7DF zbCEbWPc2(roC>-fl#=(L_If4H0;85bu-@zIq4#>iXb8z60uS98P0iPH_SAe`GOl=R z=^SdmUQ#D|ug7Mp_nMug8~M1e_nKiiulwh}VIR$2iN|sNjBXc}o#S-Pr{JWAZ6run zVs!RQYpj5g2Xj7jH$wkklcGc$8)>O4u@pw8fSced^ zuBEvRhmy}YYe8yyYC=(2QCX_6wHBwA+iH70om)`{A?XU9XNK&wc_koEySLRY_4}+i zEXUoyffnnf%d5~iTWhOooP#$^A3Q;RP^^xjR#a14y>eMa6?P*m!-!NA6Tefmw7KyE ziPgK*eI0&ffCUtjE>|B0heG&pU7BwghNB!gU9SFm==B3{!{z~|%hkIJ$M<2F1jF4Q zaTZ$d)XFJ>5=AUwF8KG6ofL7tN$0mWg=IHM#_xj z>Qf+BUyBSOc#pcTzYDqg1)5g^TQ4Cev4-6bgj}5;rGas!Em$67T!;STFD=ft;@7*y zt&MPh$lWRDw}$-%-NrY>InHUAN6O((GN}C0{|xnGIQpM0KIVu1mZtzeGph4#)kfEK zSo3voclAn~CGB*biRGp{om;;aC)J(zsgcer3L7{+5RUKGKI*?-+0yE71?cr&?D5A>nw;rgfU+!P3hYRk z0CQg6$=kjgS{HUjcZ}POv+^uP|H2(SgMP>E_w(GHk<<&XrSeYQ={bXOj{do%oA;iC z|I7RDA0FLt`>RL3U;GNm^?1g5ltYElC*yq<9q1$yR4$!mluO5opiTOeoQOzcseO8o zJJ_8HrYRfxpF`@P<2XnhLi;6<-e6R9|G*tOHugAe{8Qu%jR6xyVC?YZ4@@B*_Xhk} zNi1J&(X0sHc=4>r6~wYFI3JiBkNn;^;ulh!XtV+_f~tU5G)i$=mbgfY*^%XNh-b&1 zraxIg+z@yk01fltF3GNP+@tB_UKnq!ZFk&b1u5@03U16^|B8y$jypCVR+LNxQpeW8 zioG5`1n`_M@poS>IJVX|Epz&|HW5Aw!>%i9eD-9ERKBWH9P38b%q}jQiDkOtk9K!H zh2zE=*3{hGC{G$XVD+>me*qgC2(Nu42Mb>Cc(j=X=MN)WV>aefJ)1^qXl`1Tk{>$y zmc3su@sAwH8c0CacPIT$NZ%?M`9=#Bo9v^CyEtkPYHlAcwK8%V<(4}mDNpf0?B~Le)-}yyf6D9zc*<( zhlabD{Y=8AX{T?u*D;~S;l_T=`1V`yXvOi#E9NqV7BDPL`ZsrX;mBj#IE=?|pP@yK z^_vFV+Udnflq1R->zDq`%{!^KAP~#Z(>FK2^`EiC04=@rZ|)Avind+|ZM{^7;*iXP z7}tfgsIm2&{>^<4=<%C^`QwCZ>7{>j{|5Bfo2{|=YlZ`g=$nT_`RnPM`){C^@?!<% z-Q$}(l)s+7xer5!z>x9{t$a2sv>y2=U?$((=OJ7s-`qTJoXKAHyUbllOpBe6LU+nlvWf|WElgdIS(0$7U6rw+) zHB!@dx=!mZ^1`n%B$>>_% zms}-y-^BpneV-(jZNX+>;C=sK9Pu0QzP}T%Fz@>_dS^$z4glVldGKDGgx_rUANX}o zbjh~SFe~nocw4FCPEsDYZ9MGEiF;1G304Mm=k;sF%iTRmkaF{)@*L@22ZHgfZ-RE; zhKAzm`ljNdBHrX&ylm;x;;PohaZSxlwc~25s_TnIy4LA}XX&%T1w)2bQ(ITG+_ZzT z!H+v`WcBQlvN30lIdg2ugqJaL(4+W{37^v@ZVjsoOPJc4tmW(QU}j)SuyxG<+xDh^ zhyljIMu_)5C>N?_3>e-6&PQj?0s9qoz`5W51)MMWS-urx>_#wUc)~r4?|+(nJPc=f zfNSX(GW4T477tj6Uc-$=7#jyxhx9I`MUD02yUW_?#VyqwA=X&G6X8G}#hSH1I)Dtp z!&d>z!F-WVwQ*o|UIg+oEo!XaY~W#fDNJ{aPkMN7`1Hu9+BmQ}ThjPNTYu-nFHElx z^vDm89^GyJWcCJb&34f1ioaWd0AYHQL;1rxj8AVp?BV?VXIlQOAE)3jJ+9H%{NdH^ z)BBXtD*>d*MTf|;M1a%E=XQkvVuqlAUGcMDhA&98XfS6E!gW<%zR+ynW7v9xd&out zv{@iDZ$;y|oQ(#@p#TH%u%1~imNiUoIUEjwn>Ci6#VriG_s-9TbHen(DH3OH0uzy* z8pg9lMijV&Q)m2eixFqb2PPu7t%h;dKwu(L6JdOi$f)STIe`4DeGM5Ijz86A#+%|L zC%h@(Xwc(&DfQ>VmkNbl&sz1=AFAcC$;^xoRXV%xT)#8bMk)tnz!|aol%6xy6hu_IjNga znK-9aGA%1_>SM2W%Zuv5Yy@kxab2Sg^PX8;utjy)bzAVF;RRc}T$|2|f;9~tu;D7L z&&_g`R+nG~3$_5YO^v5oCLRqGML{DS*h}kKk8>WktOvdS%C=SJL&j_`y2w zTG}73#BVm&P241Zj>3=6(pH0|Jwp7-O2 z=6?)$P7Ah%xFaRRg#*|dITCVOuu6O-EbhFViyikEv7UqGhz>*S+*p)}52UNS^bR0z z+}65Ow|b5%Eh;T*X|3&Q=Vx)-nl>Ff!Vt^$G{X;9gzR`lNc%=cx~CVNRXVF=&gjPC zWnL7FF@|y{zL?|H8qPs;bK^I;8*rTw?52+#jVieX7)Pvx>}qwGQLU+KZEpO43^6B% zrJ?&^I<3I^NH;6AZB#bWr`>u!W%lt3OQ$naE{O*GzrWT^Whu2asgQRkYEpZ+A7xql zatQJd^s@2)e8&01#5X@|dpaNnhZw$Bt(^{2fpFwlW3B0Y^C-+-oI}Z%_QW^WVle*F z5(BjKX2Xuxt#94|y*Mz^>xplk0@kR|kAUI^wz^}YWBt^n4k z@fg0@yfd)MD^soTov3@h?>r0y_7U=(tY1RmPvL3#<&ks;K3ZXkLd!RwrubZi=PKlQ zVZ17Z4GLE(T&M683U5=`L5O_ZrSJ#pzFpzl>P}9K;kGK2{G+c({^2g=#E*rxoM04| zVy&&s^4Ptt^_EVas2d-8=dZW0axiqu1Qdc-80w_*u*V@~)_K>K-u#;9ocoGd+g-bJ zh*Q4nZ|}eVGI?g^k39I|5{AEJH_!b$;Kxyv{*y~S1^is-_@~He{;tU-cV?kn{h?=I zR|)JG!u>tiQ_c*sgomd{!?|U*<;Ojz;}z;a__OM%w{r{VId7gZ?v1-z?%bWX{mh+_ zwa|&sfv4rh-M4PMb9a30jl12c9lN3(H|`!#3B3)VGXOdj7M2bEvjd$CQRs7ESf~6G z61E0(sN11aIFzBh9Qm1g4W6rZ&valf*|F=o(zUO-9oL}_&fkSK?3bOq&%*sS*43_@ z)LPir?vCfJ-5rHJZ~Kiq-#o*7Td-=w`DeXtnSr|)kbmS|$~gpicBt#29C=5cvuvJ` zm;S(+mndj%nW5h+P7Bx72T{*|3)+Bn;h}se`zyDh-b!(|LJYK62U&<8t^?xCUyFYG zyovbCi+oEVJnQLN(6}t5gCd$TbmU$J^Z|_7N6@CbhdPUPT{CF?j%dlv$!Mx_2Oh^O zSr4^9tm`Y2%=4R?4)t1C{CmhZ>*38)$Gs5`r@gl0m3pMhJX{FK{=$06*ZzWahW-QK z$2$-z;NKthb}Gu6US~tg7wvS*JMgMQe1QvgRhHbDyry)0UbJ#OM0E3a#heawy&Xg1 z%;TxrR^>PD?muC@7RHS4@LPAFY+dIR^*@#KojM@Ww!_aUuwCyXNYym z`eK>6AL!;T+NuctY^$sf&{iWrV-OyzFC^SnF8WE-DIbLP!kFxPd(E@$g}%b}7>cs7 zJyFN6y#3Gj{~&cz$vI<3V_e1!oavgxNS%_+Aa=vjziWDXzYqR z7=u%9+|9n}_tmMSHy?h^BZYY!gB`oB&c70UZQbsxPrdTBl(S*y&`|$kdliBn<|pY} zxeod@+X44uFr897Y=<1g;rvBCBRMF?^T`g8X=kJ9ZsYe$~!loSP6YJicvSyyXZ}dG*d=NUy83 zY&x#f!Lk1e(<+yGxmo7gnV45u4&48N`4#2ixGGt{V*uuFb^kQx-Rop*YM&$>)=duT zmbzXzhhd%M_b7@O&hJQ1=9MWagvsj=-8Ak=Sc5qZIPx;KWW(-gYJ)#_moUy$lfDg4 z$T98WeifEqXkkvp>--Vv1E6>1*nk$xPj|MtDa(yJOG5Jq^UeN8Xzb;?IFC7%NCW*7 zbo&n~N1CW_(u#)KEjsmT%>Q_V_9D_DbPGn%-LtEfIXXgT2?~9QK);Y@pnd$Gt{U_`fj@PB!w70b? zUAW5P2E*8)Sg1-QC_}}U#emQPR2=$}hA>FKd}r2>V$K>vLSYj@ST369m<6x_b^$Dx zVY!{rP#%cTx|+q%dFq>Gd~uTDSiH>#ClQCc8}VI|g*3s|nWe3yriC0c_8}qKS4scz4ml_NTfjiEB!7Jw^oM|HivmkL(!7%G1R zNSDfHO{j*>6L;M5&6=owJ!jdmI-mA7Teo zkYC3c8{`9LXM$i%zNknWnKex^#huF%Y%VPc%Ir9$p-@@jEvVy_JQ|1Ov9nt$O3^Z< zq3A@-n4*&cU#w-5`JLQ38M|}h)ZAIv2|ESd<-{UK<^7%Vb5hvZ#-9?T3+0gk zVkkLFzyx4O!kDGg4t`_9oQ}sm9X=i}ZotwhCM+(UW}$Oo>9h)LY_N1X5EzzDx#WnY zQ+@%&v!h=@gm|{BnR0_>G%M@th}*B)odN&YXYdov9+|xbb8&WR1+eUYAhqm#dN}bf zircCSkb)=_2FGJi9s%5=zEK49nXsS znnaX)^R`HU$#ngOSRX-ty(ecd>|p$OKN8n9aE%RN(z(AtO5Z^EVX@H(UM&|pjxJt- zGq7TX6B}cS7EOE(xv*F~F&#OuSWe>WjHV&;24XXCZ0v7@#!!@D6>RZ8;)naqr52GW z6|npP&!|{w;xEWWY`m?)7->zgsV+vGSee1%i8ZK#*hGWnBxW%WlMI%Z7)0!NgAGkQ zPAZcPHY_oac|XBm!xKl7%83R`IeA-=jb+TE8=IaO#dtI5gbKj81a=y+2sCvh7Sr<# z76Yi4_!{#z+n`w1jZ?n)I$}r}k8<)3MJw}ui;Zqm6 z4(!Cy9Za~n2G-oKB5TuuUKsoGz={?pcDF_xh%-yEdo$Iw1-LoU*z?J^V2K^?kt(`Ik|(HQQ@npl z(W1#Hi)PVy@?P{eAI(WNGw#V6H!nF7G-9WC{jgBt6%0-CGSAql>RXar!@$!#7S}5% zORfNn%~0RT$&K_q-8)+1PDxUeQf!uIrkknBZOqkd4Ll>ckj*wneP<>=LsE0SF%oxf z@@U3ATLYIT|H8QC9-9G;mHZn6w|cL|i7rlZ6vkG19DR|3r@iEQM!v-3z={++=Ox>S zukk(t+L40aWF>inbnJ5PG1O0_U`JN6n)nsoEb;$i7Mg&yomI->L|oqTcF125_T#YR z#IoI_Orvp^Zme!z02J#dO^DY*5?q24>+hP{kAoP~84&#jeh)bXg+3fLoEsbIChujy z0+((i^9Pa{rD!bKj_|RgT~6m1jZXY*1S6sy;?QOketT@Wmpp={U+B${fKKu>##^LS z6;0kus*62__6p+364v^89_MSXU{sQKxW>-cYMzUrno#NkhleZ9GrZ~DXFKsb!}y`jp-%ySGj_3;oWlBS_K34te#(Sfyk82s+KJP`X-VjgaN_KQtb4_W zapb&-&UqL|C)$VYcGw73?8P3_bmE60grAdP&fy#{?hp=WbQ5|Gh;qyv&i?A!S!KGo zm*O{m9)8%Hv?t_JjQc(!Pl+6!_z~PAM;s^3>m>e(qC|#MGV2w1iSdAu5eo&2CSIc7 zkyV1l6Ejev$Wc=T>z`nkjHKoWmXqKCx=6mEnVWzt)QOCoD1Lc~*HOsG==YF1W{bpQ z^gFIbuwjW>#v5b&h9|gA85wK*Qi*dJZ=CTPmAD<$B1OipFp;8PvBAbBo@TrfgOw!y z90gX&5@Y^x;x(|)OR56LmTv_9NkoW8^AZygG&;ycbP{)?Vxof$7IktTLcq^Tz+~cC zls$TgPM(RMGT@;Gi#kXA9Rb@L+nl_tyu=Nlm^J7vDV~$K1JSYu8!Vb=LSeIp7%ZN+ z2}H7n8Z5`@&rg83Tb?)tQQb2&rGe0l;<#tol%jt|CAj5GZ}<{~zl!K0nN<+W8Ox|k zM$|2biYi8dcBy*DT`bmeXZQxh7)R$zBnCrw5H&GYO0fCPQA5BrxQmf-_bQkEHB4j) zDP1i=&QHCGN^w6?h;ZJ`PX5nH7WS#aPtu$j(N@DqdmEhc_?HaM_1wpJDVMMsgx&j+$Yc}+-e3G zQ`Nc**4JSj`)lU5hOW+V-Z9^S7IMEUQCPIQq7rSkR;sU?|~5IlI{=0f$8x$x4Xoo`Glld?i61Q0h>FCF@G!p z8R$(D@XO5dk4(T3vi0IQzUJKdBOvp3+~>t-!I5nEpO{dljb0#4w2|chX~fup$K-#3 zw$HKK)!8-;s{AvEMKW6D#cwfZWZB$TC1=c418a53ILX;7CVi8$oszSKCTF|EXMQTi z(7Od$bR-T6{!XkY^fsI>aksLw{Y6NVEaw?Z`oARLVng~JK^BgvsmJD%{}yC^iR`(4 zmxz@Auj0JGr1&>M7MaTUJJVu^T@T3qcR$kFf=3%vdZ1IV3BEkWvki}JQK>(C`8mVz zgo7U&S4SHXwfA!nV7fZrlpXq{Ala%IQZPg{`?w)D#!@LY9uEmG^{Ys)|87OjJgj!nsRp?oN}f@`>{}8*H{wO=W#SJ*7|PAr`+4I^}oa zvHUuqbEvtlVxs(*a<`a7nc#dpHqoyuU1##I8I%*V`;hB02tQTbB@-~yd`ko6KZ7u= zFnTY>ql3asDhr%rE8*6HC#bNGVCliV5KitklL1ogATE^6z1i2MY zS`jy>bEt@QOrf0l-fmJL^?UG`6n|Nx?VDVJ)M7Hg3ddk zwyDN(UvmF}dLuXHx)a$G++Rs&#)>}7#QyYn*>vx6r}Xb6{utf0l`1#=H$g-85fh9+`m}x{j3CEZnCidk>&GqEN3iZU;o@ZiD6v9#Al<{^w z(cQ+NLk$JSzDFpW=+0qn9B$m{wnf}ea{q$K&P{nPaemXgOG@8lPHv<97!#iEWb;v* z?cC_+Nr;6L+AkICFATrPylD_}2cAw%Hvib|>KruLfGC->0a3DKr4>U#;4cW{&hXr~ zPyi-2BS>(%Cm|M0A@k;*<}rvQmxC~)@O0{f3y&SD&VCm}LS*SmKgom&S;rTck};9F zcu=xBw72=zanY6!GvskhuG)lTsLM=9@MTrn7Eb9~47i;nSD1hd#MMjmsIv$@szJvO zX8{#E$N9+5(IBy-B4q4cH}w$5=R|pdE=j$}K6D!2Bv}zqc2d8>k9)dt;73C0HO4x_ zIAAQ|`w#1<nl|;s^8yh*dC{k2ZG7fNU?b*eVFJDm^WtTo31FD8~K~F z?%LVQ=8P*|e%83+FB~^MvZih#bQVMg%$~h`4m6G;Y-8lb%V$Tv;ub}Id3jOfF?Zda z^~)mFb&;1ZFPghHa=SYld5w&DWKQucCHy6LM0UEC@JGiLZyr+`xwH<&AmIj-rmSRa z={V>zEh)xdN!jS}#gUyKFN)mZA$PlAxyM_F`WRna`-wTrK00SvNpa+RAFrDmdCFV& z1*Y@B$BU4}%ig*Pkvl(Lv^?^fx2~~h{DfsfIkLJ4lp}*@kBzhxMTQhbRXRg3Gw3*{dp(b@)$(-VAsVuT=EC@b&8Ge2eSr_^GWhiWCx8s?i`*=qg zXQu;jo4BWLalXR2G*aP_+{d6=w0JoE%Z`wqai!}5+D+j_}3!6 ztD{$CZNSW7%S3jRBA*$#Q7M+CP5yGKxObg4`MtH`-#Kj?pX}QG#{VYQW^86|q4g)j zloJ0O6z`_!dUu_7rRD|B!c5J#{-`UK-R7ChOE}NA{>YA`5Qly=E3Nu!LrwDalcJLn!T zRd_*gaiG4bzP-Mxp}wuQqOlqF=2pG2vd!T~Y(?9udQqFo??aP0jFq1a^k{Cumn&KP3bB!$rt{K<=C)dg9CC%Rl5ef3U0vVq zkS(oPQQy$ukd>r%;g}3uB)k9n;Qh)5x zrY6~@#_;8DO+`)U?oYX^Q?fz5wY>hbY%)sNSlha+wrS}a=$me=YOyzku4=7narD;E zy;t{Q^z7D2KGW|HUA44L?h|d3daCX2Gyp^;b>?uSQ+k+`OV*u0>teu(H;vt8c1lYiJJX&oMo(t-YeHrK+`d0y>YmQ?x8+HmfoSq|3h8k(0O1DCYR?X1mp zb#2g@B#BovR{wmu zuy0>d)gbUvoD65d12xLEt_BIAajil+MW@3Z6|EQ{NMa?1 zdqq=yb9I{oD{7{P`HFe2s9V_t-P6+gAq~_`$bR^)X{_9$_E9Gs(`;iD0$E0iRj7Ba z$pkZ8`=u3)^-a81c2zAtz$#c9@W$bks)h<_>_!r(GCirK3dd27V^3!V$sN6B5|oa+ zrj~lBS2nF|tF4iFz)m&N7o7G>M3J@J4J=pu^0r{Aw?@aa3bpNQ8_b*-2sKbgiOJik z!BA^={K3W&0%vJgn$p&R-^FC#?x4w=TQNYWntSfq)8|yoJ8k-cdFRercv{7LzimsU z8f3Dzb011&=2O49%=sK0QDtbY+EpY_-_#sB)Ne}9sTR3qr6ELh!wOSD(!3QFr_Y*u zn!~|@>73cNmmAv|98s22XD4 z)#_C>=n#6zGG1df&MI_$NpflPN}g1zFr6IDfp^@}s+yWs`i7OOs{(Ums>);vHHsoj zZ3IP=#=~6U*A|BuYDl^Xw4uwig;!C9iOoip*R6j&G$xJ}6%AErvBoucDPY{H2K6qq z3sfMV$ohi0&>bcdCNx^rlCt!GrP|>;z4*}M&=*m4QX|qGI0;Ktpx>=xi=l|KUiSS^=~7&8KpSENzj2C_1&sv4xjYWKiQ$fR4D zc5_3GsWEelw&gM4-6)mM9**0_Wk5@nGvDYE9LMAnLRW61U!rse{=nG2&@<+W%vzqL6$e-IVLQ1`DU#MM~sdp#%DP4vq$40j!yzH zKM!$Kbf6#27(5Ig4!4CKYHYeCz-=6Qk=_|LQpj&w$j)#_fHNkCY>lPCGija5aT54- zgk@0Hfi1^8*liqGoy$_#=FvsEXTdK_Z`0|fT%^bHS$Y@2PI}|<&}=L)eg-pk`d^GE zobIg%_l{vxC8({JMquG|JCH7gLQEIM@zY%gdzjv}$2bnR8(CwmT&4`uYnd681D^{% zz0bgII->|e{ zb#5;1`b^q);D=^vVHlcc5bj80m0wE(pCx|ZqsMCq_l$%vKQ)0t-yoz4tR|;S`vj?G1+Bp1K>@qXQE`kF?*PW8n;? zK++yT2v@#c3w;My&M&fj#zbX&GcG1zKR$6|O#F=&1%3ASAeT{RDsYYqW1^z3+vX`8 zlK#{;&i>p%M2w+NX@SK#uI&1ZEe~<)UjvI>pP@g$&6oQPYRb>`7GsS6RKJ>yKi68q z{=DqW;>;h{Oe{|N+d??~xn^RFp+7k*!0FF*5o3(M#aJKp0Rmf8@*nk^)#Q(B9mbgW zesZCjr+-9d1`R4WM|NN$a>_D{bCd)of>VWI6Tt~s_5*9!PcE|vAn|MQbl};Bhi4MM z2xtxczk+8A+G{Ex{T~Fh>tnorxN%xe$<+!hR|o4S==&< zB4$y`E@&Ahl^>0|nAKR@$mIj`Rj6xOx{jr5Se@6el<(GcE4yZ8zuC-=QEt%Ucp8ou z&qhG6NcADYeG_rO&nx5{>0!9eCxkoOo$x}1l?qz`hnL{N95}qx%#94kIgoHJ;P43; zBZL#dE5VKK4S0r6Hgg^EpA*NyV9ssCX8;ZdkN74b=yT4Zdz^5pwGPs92tA>NfO zieF2Jc+0^9Fy01*aK@nlvo`C&Esr?zJX9g)UGF%@8KH2b!qEyrO8n*QGQypv_*{kO zDm-6dt-=O{YZYFv@NR_3MVN%RpDHP zixhHaE8{gPyiDN+g?B3as=`MVzNPSQ3bRp%q?1%wps-ZoDGJY2c!9!tg_kM3O5rUE zzo3u@6iEL?g}+t!M}_}SA-Ci(+=&XODJ)l5tB_k=819P-zoGDXg}+wFtD_n2U4>cb zd&H>&jF39M2&uc4aHYca3U5|;r$TOPWH|1HAY7sFQia^bM)yq$?^eiTCUpOy!k;U| zVLEYtTcL{%&Tx4Ok5X8q@FNQ6D!f493WXn2c)h}ZQ}}?wClqoUDbsmb;TsD3VNB6| zu)=(W+*VBY^AvJi5?`h8YK5Oxc$dO&DttoW3kr8A{IkOM6%ND;jdYJvSgi0Ag=Z_Q zP;%%q@SyBxWeNU z@~9pCPghv4@M48mDEySd&ncviX~z43!WR_&hr&N8j3!LDe1# zn7VIN{8ojxE8MK`A%%}9e3}sH{7T`g>i)XIKdU=+12fzJLZmxL;V^Zdqi~73S1D{) zxLV=o2|?#>#lNEP0d@bC!gm#VkghSkn8E>sh(AZ+VuelW->UFhg*Pa?UEyYh4=8*{ z;md@e`#Z&dukbB(&&NkM{l^g^KcxyMt9!G;b?Sb#!rK(yuJ9X#p!1mGybp}@o>up_ z6%NJ=n&FNlg#So|qt*R*g{LXJNa2-)2!EBr+Z5iea0?;mepm6W3ZGK<7Zv_N;k)Yp zcZJkx&G>l=k5X7lh;%0^oT+fG!b(EKYf!vJ;VN~%Ug0h3{#k_&D11oavkHH#@D)PP z{gdKvDI5ykjrkd-aE!uYh0_TU?`*}-RoI~Js};XY;d*u7r0|Ohw-DkT_btVrQTQSu z(*Kph9qOJ9IV;m0LJ0pu6&|VXCn)3rWQJRy{^u#IQujv1FIKol-LF*qDup+z`|XNv zR``^{A1VB;LMRoHe0g9DnSL%I@;O-HG3q`^@e>uEsqh?yD+m#PmEs>$_-S?DtoWA{ zeox(>Rs6>aUsU&93g1@9g$>dlpztt4w8N2#AE$V+;wLFyuK0zDpG`gv{0!Cn zl_*}OxO|_$U%pQep5Gx1->&`}6~9&S`xW1!_%_A4Kc4CRT=AC_e^c>y6vtwf(2o-0 z8KyYDdx)1PUZ(h5#mg1HQ1ME|xhBE~pC*=V!54u+ zyZk%Gu^hn5iu~C)zDO)P@(lo-HkUNqxSJ1@hIw$8WN~w8jBaju%zd3ON3d*ISK{%U zO8)L6W$`NTH|s3Y(6SxU?pr+UtP(HA{cotGZgo~N<91&d?WPXD09z9tvxospmsc7| z#nThUgzWPU2HCkFTNtz)X&NGZHIcq$?>Ec%QdyDO3L*LN-6^f@gmfi!H3bbwbc*ml zQ_$$&4*V~ZEOvdLQMiAZ>Bi_t#AlUnUX7de&7pANpkz2W?IBy73%9UgSeh|-7#^Sg zV!8`g0$&@40U54_7B$vy8gOf;*A_e+P1abyli?69#~+c24!E%#oUUv+=D}{`!0OBc zvW6Bl*6%FfVR|09K!VO3gwUUlcjeJ>^2T*h+mD9t z?wBP4oK`-Y6#|Hvgbp#;B7io^eXzr;#da$F2YAYl)%w#I(g?RqghWxW`1G{XUw zD6~2*Ii~4;n!>pX&s8Yv#qh6Ee7V9Fg&!kCXP}N&!duk6QE`stjC8}VX{%jbyYv#v z`1Pi{a{R;-CZ)vmuDkN{W`fwKe4kZil@(G+ln84+igi}3l--#ljHh#i{p7{*3~LJy z`n_~R`!-n%7ne9nKtfW+F5Aa*Mpn{D7Sb44)Sqvtb{n(l$%C$azUlD)Vp^B^}l@600X&2O!*=7wD9Mw$F{wNK5Ce#SRb*q*%P z6pS}c44h{<3@uM`wBmS$i{ZQ;HZo-4@IiRV%R>Y$y=ic>c6vXHha<}x>&N#FvhJH1 zK(+v5Irwg~F9IIU-+Msv z;Kuy*#7j;AJ-&0Tv1z6Ak~tt^+YPT*KY!`G9E0lN$$Nrune_6M*sl6fNb;XIL8LulYHj_rT{N-Nh zXYKPEV`qNTxtA4#2UCmm!ck&3m&dtZ1Y%i9j$W{m>?~j<*AvUOKsdj6?u_v`lt{4avntPKs`hn-4(4NW>1P=Jig&5y zF*pY>9PxDCa53D%M&=7Rr1OT|g)2c=8;5ilj$e+}Sifm-uy*==3lB${}Z|4Qc#9}eZOC*E)r=%tXRH8$^@!^8R88p>ZT{A_vC*BNJko_SdqiloP9 zvqIyF^Wfm+CR-%rm(ClmML51)tg-n^=MAZkE)(AH=?vEyUqYjH#e>^?SZMP@{6O%A zY|FreQ{O+lpRU2FUl@<(2>kq~`%Z+OAx z))kf&?EN0fvPor`t~HJ|lSH??;69Wwr!OJKhM^uDsT5k$mJlh*b=e~<-&e;V{*~p= z5zCG!xSN6Fk++N^e#!U!(K!B!SayVyx6k(_+qGju69xj?3*W@zw0hsI)BG- z3oJ1}OK)1pPVdclIFhWf;nMlL?I=VC0`^2T* zJP4$a7Byz--cydeI>bNq#NY910rKG1*tF95yK6)F%Ryk9ziVK(aY*A`ASqhZSif}s zj(fc=|Jf6NcPJ(|p6{}TRz8~*TKB^<k&WFg27bf(>kEkgN!qLaYLk#{)O0;6VnCM-rd_M}C2W z8+_k5{*hRAgz3byWf9ShMZZJ8-|;71qAa@&v-9c2lW_pq-{NI+p%9JSswtQPpd?jVdnXDV~jGoOO=PjGRbiQ&i=%wIqjjg|Q zzLNKp+x+#!SFQ%V@VS4|u;Hy8Owj%&iJ3DHll zQ)uPMUr~Sdqdu-B8l9iIn%FD9S$2HJ`xeVMfYHS`Z}Us_5ODbW>AXrhKiTtI;%H>Y z{T_boT4D-zaF2rlz&)-dmTkcWz`#A;ZyfPU?(uHpcq_5&NId}85^tnywwn(?!~Vy$ zM9z(Fg07*p#44csV=YlzvlBZw%mu=PS{>!liY){`}vt|@K+JC>UYl>aTGSk--dDg||kNkqAm(Kf9 zFG>pj*4VVtdB4wx^4AmZcNiu)>WH$2Rz8~*TKAC|@_y%M$os9%koTj$j!byJ2T^$( zGuDKPWSsxM|v@_t?IC-kRhFn{`Xu09Va(8_)Ic^sc z`}qrrKVdzYY|0Q||DdVBBd3NfD>xSpU90kDvG935j(a^>z1_>=4A1JEc}NUNLJ%HQ%VzB$~)bNoFgChMB+V1{=w`s0&m z=_j;MFtN+(!D`s|-}w~nEuHwt$N*m|%{jWeJ%=ozl}U3>GWE_?53VbcFw_W}YXN}w zzP!lbRIMKDL8OaOvfhbWc;V4T>W1@d@k#9c0%D(dP^M?f+#M&nPxwxb@TFa-dq2pD z_Kg!||K)_i^*0)R%i6hvxS9I)T!UO2;%6A&@-qj559P#Q4b!HXhR528Z^Oe8X^r(u zUxTEq_h|&`jSu}S2wY}~0a|)z!On@&nsP9Umd_)!^->MHjl-~+u0bvay-fH}u0a-% zuo|0IIv=_`lt0dKHh<}SXa(q{EHOY!Z$0ec^0tKX*ApLl1?Zh-i6}jyn?tl=b$DK7 zGA(Lsl>30gi)@3K_kd)w26;FNn8_OC3^Z0IeCT`>p8GPavH7#Og<<#q3w&t!8;Jdt zvTgqrYxvOM4bfTk=!b?U?QKnx>=Aj>I~3lp@KJ?NDeMF9%KIoX-|slFq$E?`wVVSS z!<_T_eqN*Oe1f`b&QSyvTwGb?Re?7LH~3WcrS6Ws+`}Ng!264&;2(Qw zU_2~YE~9HdHy?n8uQn`M@(w7gR3{5ul|{guGL$=j;mMq;o^f)~`(rUvn!OVXdbloS za&FFq{|xp-Zb1z8Jh|Eguvfm*Xb=vV&Tcr#56VAEegfJ)bGe5Ax;wscf2?3?#UJDv z`^Gi)U3N{KG~|oOZ*i3m~&eUSBI>!liYn+I4O>X$2|MU9!>_uLa1ULORD=F>}GzvRd35tbOBO)H&m zq%IuWZk(HJ{;mndA(wMNmJiBT24wdIOKGmiILHqkXnycLj4BQ+&XpYY zmajMv{2k{^-Jdmqu^&c5Qyc7;j!gN-^e(z>6)nd{j8tC=A7DL;4! zjmbYPqFeI{#@tS-}jKZb2B9&`U0EWI+LCS<@#u3Ci79@S$vLTee9HeFQcMa^} z{M`e3DY#i<{no=FoWJ%^{&L}G>3s%v#$o%>@P3V>ED_+e^4Y8qK+J3C5R)weXrtT* zJG@$~*HK95NQ;ERrR(bX2*PEuZn+$dmC3p#&(?QU&!Mb{)#jVXfmpX>TLvbaI_r%+ zCol&}C%ApJkWrPnS}*$KxHyn}>iI~Id}@`#8)$lwqIvn zwm-R^M45lT434A(h=-0jARuEdn{ob(7^q$t!{>GyZ~snD<#U%ZNLFMP0QlTXiDg^x zLtx-@Ij_M{mOZl~$6#Q%@o2OTu322)jNFDFu)N~|!168vaAPrP@G;i|$&SWa8KQnI ze&g=__;vH#d;l6|%w5uNE5U$D{+9RSg`sAF)Vn#_KT*}SBFUCKG9fY0ySw+y~vmZEjr_%WkRCUmJ+6JIxHOrL&Ysu1-y zIwehNN=G}Va#K?kdxqm; zPH?i|ef<0xXU=kB9(3v#wXJDvuc`)YZ#8hawSjz5d+lndl&q<0uX2j2+uE#7qN?iZ z*4j&)A_g%!DC?W*n!`92IcmfBzw8E`u6X5eM2kHpt6-+6prV0Q3%q@xu_ z_ZL&H&;o{~N#~Wj3rAkd#$h~$yNebz)^8ecYp2&ccsS~;v3}{iavbG&8i81jp4N0< z1A*<97@(z>&MR*Z)eGx~^+#A8iUX^|yV_VbYivEI^U5!QULFE5f3W)W(Bu6)!0NmX zdTb+WZ2r=D<<~>`1DoK}OXrm%Xuy;u259N6hdta6-VEihCtkS#^hzxerAKsgh&HUw zd{jgxyz&hQmkFV`GW3bV_houA=t0h!&f^Bn8RWK(7Ya?>;?;Bg@Q0pWk466|4Y8wl_k48qPp@lIbCFj(m|=cH{~GYzg4R>Ag4!zY%^*gBy1F+Q+JI zJ^&4~;4aAyt@>tHudKsD?;LuZlMS`?Kw5}k)pre{QLM?i(3Iy}uzk20UFmd|(XFYi zOJj8X)n5#WjMjbw{&qWJti!_;0J`RHZ8Ot9Ui2J@I-U;b~(-jIIoO{)F*ps#kcQ!Rd2umCV$4co0AczPvYr(>|D5o zjZ9o{Natg_3&*L<#vvVsTTP1^>o*O!wbN@G9*!<+tY11G%eCt*2-F)Ndn*WZMK7I? zoe|;_Ss%7us$sWzV4gBv^PL;w6FD7Qdg**D*L*YKW4VTG+l}*;rI*gf-VJ&w_*-N1 zp3cYCg!0!DANv&O9b$=qD6M=pD+Cbp?|30iwg{k&av$vQYO!8PWIPi-b^^j>!pByk zQZnIVsh{;A9~EzXhuAeJ5B3M@F&TqNUt zHXld?6OeGGjf6Qa8BZE!0h}rId$|2MZMfzCb2v`vHr;ca3I8a5ANIc9gSuFUhiL%p z9nZO}skSC1?A(6hGbL96?M|F!C**^(lUm8$@vD2XnOOX8bz0h6YwGLjz~LOz2v(vpmI zJ$)$dB2V8T&{=!D^9<_=4`wYH`S!iSIoKr|XgSe|43ZT&766>+E@Ighd=D7*3-E4m zIC9GJk4|xaJ-pteo4IlbTLm}?y0NUS1mEFLy6SjrnSg8ddHl7yHXvA zr2Qm*G`bb8W;4ouyLm{p;7T>=Mpj>Sd>{DA=aJ!$;Sr6x%soXM+7v{^*ybQ&RLA3* z!A=U~MFPHuyj_?vE;ag=y4opG;6W|3W)1t;kxeqwJ_(l@*IFL+u%l|;QOnA$^xr_WDZzU^&tW>y6VUt3hv4b0)&DMq4=8+G zVFMw;?**^fUfbwzW$l&MJRaM}GS$uW^k8HL(@mLxV13hZ&e<8=e&$XNzwmvO+}j$y ztNh*f-~WA1$(_5Mt+(uU@;YA0aXMZ>nBS9JkNaN3()uX&!{#OuCnvDKP2IC(2kfD) zJ0y|dxh`xA9S}O=6?fsoApP>OSGE}5{fC6YCW5e&G126h71sd_!h{ULTm(`b0Sq*d zfk-k>gJqdugObj%=oEvKh|IkNjx!`n_U8^Y+jNtf7II87hlCQz!X8UMTR?{S4fz$2=v$JP0jB`mi)WZOI`I;HkE07n=2on5yfOKPVuIRLEEZ4v8-u7{ zPGVjN%ge1;?RaBP6BIw}L3hutP;2V8YE4U>$G>s^KF* zFZ8~gThZcpcWcDlidM(FN8{yIta7}24H8dGC&~L5(JRPFj3fMt!E$pes_Pu@{yQY` zyu{s1_Nyk|u*8v!_aN)WD;S>m3&T7#L#U(@UnchLX2C`!zQFu_=aYgJCU!F3BVQ71 zY;MKMYR7xbq)-A3dH$Zs^JHMi^!H7AQxgBpl%DvC#G9IEApF6jf=$n@XaJQb4V4** zCz;+eCf?jcJ=1&EVC9K8bM|~8*if%vequhc7ao@~EOw%KjF>g}cu;j2VF*h%gy;~W zsBa$EiIOjJ;{&53fDEqb9GIvL{88A4GRDB@Z2S&p4YN;CPQz(Or_KBCI#X`_N8`!OZV1gu z^7={dWR07bJdQL@@ooht;S~%`<}&W7>RXb$kb$RpEUs5jmi!4Ta)$a&PBzf@bZ?8q zosvA2zOy_t1x-yZV!E?6@QmaZCNxKVXC_}};JMyI5_fL$4F*121D7YOh?aY76Et9w zEVS3^wMyW{N$EK&J&wpo!P8z+xRFad4z@_ab6#>Dqpk6H(QBmOH(5!Zx9~3aPDK4g z3U*{Ac_p8Bg~tt~k%B*Fp$S;qSz}n7i2D-A9I_H&Pl98Pm+dBHYK^;eV|C{;H%40x zhG()rqxE-9?Z-ik=?sh(;rEd5;%6iZp6iWtlUFfdflD`%IiF-kDH=<@L*Jv_=fpS1 ziPOSIW)07YCK){Y(ErND%DlJSOQu-Jg&to`r1o1zU!*k_P4XkgTkJ8kR}fFis65Z( zRPGgwN`8aze68)7N#4-tUEoEeddrg$#=X$HQgX65c^WA%@%ZZU3YI7NV)ZUkv?aNX zXoaGylQT)G((5l(yVgx|;oqzB4j24dH|f&9T2hV_bhycN%*j%T9x1rXO@52yY81cU zOJiPOUFC*(&sadt^If#SnBj^0F9J&a=&&Ga)= z;$f{U^u-?2bmDj6*U!l?=Wvc5cL;|!It@MlKYQ;2Cs$GBkKcQ{d#00~OeQ1)0TSrE zAQ6(8gdqtJF(d&J2snfU5DA@mCPU`MJV?S1F_Q3D1w>(8*7Y$cVis|iT@hd4;%gTl zDC+KSQE@jR#2+FmyXvZ|`}hC-o;v5=>YhnvG6|9Ollt`SZ#~bgs#~}2sXA4s#;5rP z9mm!iS|9UG@qZlu*%$D~wq@<&$4D5K9e*Nto$vC*^>E!3$PI(=Jl-L! zpMrhy=Syc+9~^%^)3h+nwUVY5X;zTjI!0^LXj2!l4o*x7fiO6WuArL#hv-c5zGm$E z8Rg;M{&x9&%(9Jgj}gZgA_wnjY3b~93oi@a7X0?ErcKTldyw4HOgwUQBWNAySN<^w zQ`PfQo95yF^o9+oiVJU!(gArQzCiohr_Uz<9ri0Kvv-AzM?*hOUY?9gXa{TY+yeBardf+%tH>IjKuf8m5WV- zLig#&Qb!{aB{|*PTtFyqI z7F^kzy1F*CF;ee__WqV+;1gIVSPzqzFccUjuDfwQ@V4GkR~4H5=h zQ0VNyzN)S!DM#@d*aGT$V=j)qnzXkzH*6(QDR$xfm8;H^2Z)&$u6ss+d3jF|9Z^td>ug4q_xJRm$6$Rl z@cqK0XldvK%UkGZ*rLq@;dsU^EzQAZ+*OD+b@kH|`|;T37>L?rZZ=D9TA|W}@z5$d zy8@T@#`aCF;YfwFp+ZXdn+oj>*c^x#S~@LMRx>hJSi7pLa|7B_3pP%oIMT>0 z$4&6r(A9&o_jmU9wlqs801Dh0$QIev4|?)S(8c?;FRW{D4FWBt(Av*RXk|k{R<%DW zbV@ZkiXdZMmXxinx0!jAs!AG{6h}(UUdR>dh+ty0f{CHly!amjeE-F8&KsYR*gS&G z0{rf9P7a@~c>cXqF2Oa7zF}ONQ*hxU#kpoN`-;c!o26ky#_RMv%(}EB-b)DJm(YyG zE0s$;#d4sKEC;zPmY4Zjjmy%&8oU8>2IRcVnDr8Pc()05p`w_c^oT~U5q3)hYp@L; zaDV>Y>iHUk`Se}{y*&I#Z!9jO$N40m-lsv2b!x`KO7{z9A^o)ck%usPx4~{{NMjEI z^R%e3up{ zGC#yR#j_NbD)K#N_&UXniaQkFq4-|Kor<4Q{G#Hw6u+;ySMjHcSv)G<=V-;5idQK% zDt0U0qn60RPl?7GP8mBFRS~%6|;DOd7onx&ry6v z@q3CdD*jrr3~h$#sugD{o~F1|@lwV0id~8~Dc-60KE;nIepd0Tiq9&(sQ4SjEIvle z$7IDC#WyIfP`pC1RqpOsF4>L%% zNV%fu$bo(w>d83}9XY<(Fe9QiDAI9)y0T)SA9Q{XElJB3OVY-au5@$Sb4(f-{FXK6 z3WBc)U&0PdX=JWXL>*x)tQfHR&J04Bw_Y1l}@by*HoLKmTaO!)8gbXvwiBA4FEm@;`Bkj9~!|57a}qZ~DlUO=*bPTTN&Yw5GuDhp2om9BfRHRwQwS1ZPa#m3{X;Wb6d2NErPQ=;&d={(K&SaGL zkOYGN!6i?UubKGp8?P-&-27vFGs)&-JpDqGyr66dg?{GJO>e}LKJ<4nVy^>VvL~f4 znJf@;@)u7c3|eX@`E$7%`Sy;2yW2h{Fo$`3=&vx*;I!#t!dTC${eu++CHZ5wbp09!1r#A`o_`PQS*t;9O(lPTCR3!TrGnT*7G4o6>e;iL3 zz1v{7G^DW@^zyW*v9RrM`}sT7%U>nJj9%%O`AX1RY(x-`R$lij0>s=60*lQ7v?LF~ z4ieoK^c3QqU=A-HhEH*uV(^a;@3XY1F?vMT54(UW6pD))_^lm}i{)Uwv#hvpZ1Q*r zL)CK}K`nM4IuFN~na?sY{@s~>ww%NqiZL?lh=zRy$H1&NGpsk66cy&ODZnV$b^F@; z^SwBnYx%Ci{kUeYL2;uZ-wpbc`y$?}_#wqd6u+$aEg~AtcNJe${}ie_=EKooSSQ2q z-Tj@SRNn0%8J6!peZh$LkF00IMU$%&NY?Zn4Bu_+@P2fwdmEMaao)~HkRkWNxg~1$ zk&%v!?bBH4YnlB_>S_R3>3^lG+<-*DO8?$@;vcMZI$Z#!evLl_y+FV6)RO?7x3gA! z!)X8--V_SdKS9v*cFMy~(^bJJAzSA4xL&sj3Vv%01|VK5J#35yG(_fObHa*GGSlg3=9h<}_|X3#z2NP}3@k@KTR*v8SZ zjlpR7Mt)HFmXV)9w;A&bhl6kI!2Qhd-ZV>bnVs&>;Nn|l#==VZ#w^OQ6OmYs{qc>Q zmLryPe@5noGIC;nQ$RByb4T_zL!X?1}ZFHlJ-lBMihQC)) z;v<~z;RyE@Z*FMovnknO_j@cjeL-Db%=)o!J#W?d*c*X6ITNC%NL)d%-gOp-lsDYh zL~Ev4E4inW(J37-X9LI@XX(^fO0J8!!;|0_{w@BDJ7ix4?r=N++~Ib*$_+Sn1`GHb z=ZSw#w6X($=U>oOo@xhRqV+*~vRe$Z;WPjZGlZkL?k ziY*~=@GPv>w&bNK8%H?9QF4Z(-yi(PJd2V1jv4DSm%_vB4Er1|zENf@tduw8S&Sp$ z4L5?o79$2UdY8cN^Irbh*ZboQcY(l2c*93M-fMrnA@`PW-q(!fuar0B*@?^-zj62^ z?vpp10eX3an=yLq#r^Vr!^>YK!i?7}ol{%}dSi_U;?c_Meno(oi^0n+HV4p>l=6n$ zwlEUj@WY6AsCh$<>CIUF%x&oV9}eCSQ@ft=@BZrWhJ4mE{1THloG32$XS|{I*We80 zi{id3h{E=FIQhb>aKEAE6oogyOYl~PqkXb%6W^}!?^7frLVvz9BjpRZNZ1&|Vdo4N zjeH+4gyJ-ZlrJoj)$fZ*!~zxDh0FB|L(d$JF(z>=nZe*+aG~B{iaEu1z$fJFzj2B; zGfF1K2LevG&%F^=XrTEvp^<;3 zD!PjfW^@8}iF|39Q_)RMEL>e4zL_|F8voI3$E5!iwz0v}_>bhQ-@_zsALVutS*wmk z>!>ZPjoy!{Zuu7MYySt|@xk))@4YmIGi|Ray5TU%anQ>nju|U2zwti*dZU-W{qe8Qf!?u31T<*nb-yA&%&+i;8VUc(z3wC7 zUoS$uk?^luP$?skiQkUG4^_{We?zaRcxM0c2lFSUidrh&@>!0fK*2<8ckvz5VxB2! zspew(tUSxa$G`il!@rK#n;HK)luX>do@8L%rY{F+eR`<$JREyKxRAyQS58js~V{-wprE_Q3DB^!l4& zzjrV5fVT2d5De^j8TxX{@&mh5@JrW1j}GGgH|S?;-?KMei}-oa290#>tzyr@o~0dh zxQ-V2-yN*qvG@C+Go;QP)vc3Cj-5=Cp@!_)`06rGYYqIVYsXWKlPz9ZJH}`1$L@=< z&lS)9R;a=nsMwJcD2orItUL)1ZG56)r^>0=3HtEHqGiE2PXA@GyT9qokYr{Wm5keaD>^iM*)9_ zt0J0KzNuwv5KZrf3kz_w|0u|CC`HIV>AA8&CjAz;$J8W4A$^e{!I%hM4(|w z!gaZJ!c>WHMNTF+rczx?cxi4HVQLHiFRyq%qfOsL$C`0C-f{+21%zwIU1!$I$Mu+X z^|+=EM49<|rm07ERw8a?Ce1sK7kUh-;yvXLG3sH@q)9WAmaoDt#E62A^8XO+d&id6 zri}-;>KE%AwC8Xm4X1;`w6}|NF(qv%GTBUEyuft*KkmJ2EROCm$!3g1=x3YU(RM%@4hX z9Ho$onFC*yyN|&@;?4FwXi!4W>)Bc*-f$y_>wCJo`nm)6A4isn^-i2h=`9uM5#d|A z{7ZNon|B=LkV_t6P4Za5xp!mlv(+oJfX%f>=HUtGiDt$jzKwgArg5L ze1GF|l#XLIAfqoJ+>FsH9mm{(PQ&Vj$oeBT;<7Zb2CERjvYD}Zz6KutIN@H<8_784 zMi3Z^uP3kO(|f?nAFOfyZiC&=-+MtX4?i;&wjCZmy@$R0?Qb0OSb1JQ~M%Vy?q zjAM{3&-iy|{!uv39E!EQeAYBCi;vv-zjEM z{mhrJe~8b%WrX7%Oiy)f9qIi2Y4aB?80or>W_E69)^!4I&2O!YdoZR5I4-H*!}Y&m z{lIRtC1{9pJ6M4Rx3VaIO?*{Fi?Gtpl#Bp!Cu!V|-eb@0Tn<4i(%#5RdxhYQ27;}*Khb=YwV zQs}UQVu``Sjw!s)3~6^5cF3M;b;ZMu^BKhrJAMV)+#ed|VF@abkGU%6S+!%$>jCFKaHETay}h;k+934YINduYS?Efpa}(SVzk% zEA9$!iFTywE2|inhW@nk+u~Z*1*p_ZV)i^Ai{5a2R?{km)zQI(f zUAA?fmz;tRPZoZYaG~MHyy+};8y~h4Zr?C2%_+E;ezN1ZjV?AKN{`O_)eaD|CNr`z#T|$@k}<_Yi1%3|4zw%~UEl2j z{~3kK!;@nQmWTC1WLZ%avH2w)!b!0!q33yt)$T*b;TTi!S<-C8g-=`2{=L#%z8Yf; z|GUY0o2q$XzBuNHKaCh<#NGPLhCoIcacAz{i4l)C#w9v(rnB5|&rz&Zl<@}q&r|m* zMHz3v|0;DiC|;{5;|+x0tZo@^!2O`QKd1OL#b=0UQ0ya!KT!V{6}i`#`4c`5;XDU} z@usQ&JVjAbig=$?I()BuT_92}w81(JXP-5cE)XcGgObLM{*jJP7St^q@t(vgz8q-Q z%tL?`ibw0pu1A*7{qf}B?iV>Wp=>4`z<32?k`%@u%k%Giz9M+{iyVt^+!8FI|7|ah z)$vJK3%~rpZjNDW%))TWRCs2=Bg;)TBR9q0%q4^6Bm0tHq>2|NrHjQGnM9USW>_&7C%>-NhF&wHH8=<7J8QMZeJ@M?cZ`ys)!I-su6slj3%ugS( z`RT=YzW%c&KSWc?OLBcRzaQ-D&<(~s$t-o-_jf1UzF}ONgW)ANIui14^p?V9b_Q^+ z(Y0oY7Kfb!C;0<2Q{cD~4whqoyyT6b_ZCY8w0o8El6|1ZIwL(IyIo=cX7 zw5W02^WZ&%H-cUj;*cIbAu+vDUh-7D(0PQLv3r&Bl6QFdt3YJSUnwuSY9I7UdC7ad z{OymIYzMt}S>}MuAFulr0b>3K@z@5;K(^HZ?XD8d@3}+X~H4@*F$b7I*ai+m_)Q-|X!A~GiY z7RD58?<3LOcrxRGN8r2~`MrgT7pi}Y;wJUyyXo_L`{M8VTA{Mpn7e#__;ok6XN-9M zc_VL%*SSu>@ps+2?j~4|H8Zu0<797B71l ze-f&zDp~e2L6^PAX(CdSj(cntyZZ}&0*r3LAC|22@sWR}UYm#-rrnSXvWqhZ<0F2P6TKb`%)=Zfc_Wf0`% zpLr5VcpV~z`S2nD4NGFnUZzNd%X5#=Z^~T8zBI>~@o>rt{;#e06ho$6LdP01%|Rtr zxtu(kzV)1*=9-%EnKX%4NfHK4AX)iCjMHGxq}Ry5^uu34j41dB|6fxpTjbr`--Pu1 zQ!bfX|M>T7Qa4=amaj;E;;&zsj6#`VJuk1Ux+}ajx+S$EExZ!C5|}rmE?5cD8;DQB zkEg}WKflE>d^xVGOZ*RfGCG-Ij^}gPf)j7L_PwITWm#u$2U95W8Df?EL9BH-xM^&C zwz|0G@Q)U7Fa;LF%kc;E8hhil@(qoRJuTP!i|N}sTf2NW7W=gL?$(|LC?K5I)6%ZX z?YsLMJK+VAiC@Wz{8wjvKF0%S$ntFk$lQkCX00Vp(|BOR#N4N7KpHgs=7P0~=k4|t z?^MLGG_VGYN4c>X3nQOzc7}0onQxvMvz`eLeD`AWdwd{Ygp1$w3@(;~`68chX4C+J>0JZ6rGYiL7Zt>^nX&r23LZYamq8CKj^vO2mOt|O zKD{SFkNt)j3)=(_pWg4i{J|R2+YY;>A&uuiFHega3wtZvKD{)UEXyCi7?!_x!)|Fv z;`gBE_m>tnpz&%M31$)q@JJvtwDS6xqWNEhhqc%oUKqcXxK+0WZAZKl%;CiYyBN1U z2H%f(U#3NkWr67WaTo9`3eU0TaN`C{nt{(vjL}PcoXz(ie%#>ag!xBFJv01z{qmw` zSNw!X&wsLXvxOukC0gNqH%A?bNl8oa-K^!rq);Q|$!VH#xjAR;tTE4QUr4gH2cmm@ zI^(19u?-OyDY8$X`#eRy({ytZkl3i$rpQJ^e_^SBH>;a{4*efg{G8&~6^C5Mg7`nv z@ZTxQIu`iL@m8pazo$PQDf@~Mt!II5KRL`q#}vcuN3C02H{x~t%iW`o#}mh5#&{CX zna$s`w+dJlz>f9xDXiV+`g``7W~wmmI2CbDeNy9NZu!h51AFpSAKaT~+NwLTAK*?| zJ70x);wl|eysQLB>q@)`gXfBqNnfs|*JbtT;R1>+fyl>9VtxYJK4X2^F?7v#t{cnFrE3m*snm@7!m_97e4TT? zFD$EJj!tpTfiTn1fkRoH>wz%S4cA=f+8LJNi3ia<=X^NiYZ*i}%t30#BVpNdbk@4i zU18aG>74JJFN8t)7~F@hEG@Yp9%!%NM{NM=T3+;V0k9PiCY#lE_l*O1TJjo49;(93@*k>?sL0)fLntL`#W*92j}*0 z2rg^s4&K<*7hKYHeXty-m?3_D0}f(BnjW#BNJ!hX5s36{?Leew>m-e>M9}HSVM?Th zL*W`*df*3|U9^F&d69l>zYKY}7;ShBj-0vzr%|oh*dLtV(-vHYL&g!tGng1Ih&a8p zAYP}l1&rS#p12p%Nj#+O?-3jH9n zXT6DW&P5BU$2COwRgBVskJ7A_j%I#Vcd%+%Va>{m&tuY2c$aCd!&BVoq zdMYk{hsc{O$F&Mq6|Ob7Y&^&M-GXZyt~+q?`|>_q1GpZ*wG-FFxE{gvD6YqGeHqs` za6OCb1za!V`VB7jDs1wzadC8B%M1RCaV^KS3fFM=XMeK_R|Vqw<6FATuxyjnLHi0^ z%PX_>m6PuZcc6n?2Dj_y{solyN*8zxSbSa?o3b5R_C^U+pN3}hCUsV)c9(RD={5_n z0SDlrTkPAIC{O1Qb~Da1W25lyA_s@L)6G2J;L1X4M_=Gba3n=Jl*?L@k~yIC4GM5pov? z*Q7mvUY#2Y_lTE2E*{O`859qGJG*>KP$lxg1lHm58*v(L8jh)bj(gkqAXoxFe$DZU z#C^^zbsM+;0NlP|T$)pGWpVlOUSWV5yKgPrmWDy3_s_Jbv9P6Zo1H=2|G~H0j9JNN z`{j5N<(P~>mVNfvN z5$^UjIu(`sBs}@OIu;kp!E&*zKE0PKgW%opGh_73 zZRq_~5_t5)hu#1O1CKbncj6|FI342CCh zLODx~X`M+Iokz#oV*fSUf;Ihm&&_^;{D(88wfA~w3@8wx=qW*Ub0A{KpVJ&wU0K)O#}W(fA7P{5W- zp3s_b6w273s`AKQ1e{4kgRBQm!G~bI`Zp_XRAgDBtm{XIofA1)*V+N+FddNJ9^!?H zS1PtD_9<>x10AIqy8CAXO$g;W7zD7HtLnoVfY_aaKVd>ngc?n0QHnUi}1F!MU;uV)06 zI95J$ild*-J;NY%Wpf+TiK`-ao)=bCS=bU}PCXA)qZyNe@#$T-SC(D=H(`+yfz#au zcN0?0%*@YiLjE!f+|B#`;~4V{=bDmxm|*&Oqdxr!B(nsGZ8aivK&`yTw=hf9f12*;=CHSVAAN7+R-(~=v*47JjS_u$FM znGJdmkYR&LRaO=nTZ7EQACQ|@{03VXH3c6!*q|a3ZfbL z+&zr>sV;HN%$>+PeCD0vnw=ZZbf5i*xK6Ds^fv~XC)^!s;Xr*<3dd2+#gXZ> z$k)O?i7CdXFU0>*tby=pWWdoCo6_xPIO`<2FH-$EJhCif+;5;oe%*Ityu-5aU@vq| zPgnmXi?=8uRWz6Ct?!8TtI^5lMS?^(;nS8M!WKNp&kDU#O9n zS2r>AA`M+peNhPKs^~FEyQ=z!jQmE8TwncL7NI`kGr9IY^fRFh^lvx*w*MNL{H6lE>rz=hTjyOiTX*+*p;cyGyJX5KTG(_ z89V~kc7`8`Oe%a9v5)RY+z%mIMW#Hgmaa7$(vQ{sKTJMG9wD?BRdb3qGd6U!p9L}A zXMB1d{*Qhfe;LrO%uElf|G?^+5z>!j9%QMX0ii&STY-;mIXAWI7`={2Gt{Uc;6 zDnI5IScULRW@A+SI#Rnl;|F?Y6Lb3*8M7_RFK{Zx5@v2Pe}gcTUY12&;QYtx1xnW;_s9=NR6s?uWzbolM`N z?nlGwzu@g!)%|!_{WGTDpzbe+L6(K!%P7@$Y>@sasx4cdWd>sJ@*w*<-+fGQ%xbt_ z$y^szf1Wq&is)vwE@XbXqegLV0WSaxJ1!wVHOR6_@)4+eGT)=;VI1y|Q$7R{nS-G2#*YpH>qcpi6AyWD%=Sm01uR+9cH)4b}A+!^SsmFh~ zZVIGrb0v7q)XuKWL0J1=2#>&%j88M>2{*G|PE0Y|VHmsWteMwx1AU3&FvBF?9Fgydq!>ctfoPWW* z`46OSm{(hKEyksICg{6x`SKr*z0B}2L*BEBOB^Zh;hdw83fj;p*n;E{F#41@NbX24 zndT4+{tAWO=Cf8_%IrT@Z%wW*T~ZLp$V)NJQ<=$ypkOo|fKzNQ*WFg|61tUWkJWTtaUb$WX-3zkLVE+GqJ@@@ zmYxkQolRSVLeuqqC<>x6JB3wmTy{}m^?A$IuD)#L<>wXFz`w1lu@~7rf90z4SZ=w4 z-2f6Z5&pFF^dL%KN1>w)q+E*54xGc=)l{@xv%syH?QP6LYbU89iO9TIKd6|Jm7a*y z(6a&Y+B&-Xds+(JkaiRrdZCTLY7+-JOAVveunZq$NwKZB8F!FHqa6S2qnQtLkTCBd z!m)X*bI5<%`f8EuHpsOKvQiS6llBYG?yg>FAvDO)6#&A2B`MVF2qHHYxJrvj?2;)Ine4{Q|am~utWu^UKUkbVsUJ= z4QUlkU0s{nQ0_)Z+0bIzyG(sTVM9YlM}ss}*aDou)Zg3ET)>h}Fxog34 zfo>;S1!cSxd>MF?rPvV2x22#K#pB7#C=`zF@`pu!N`=V8`M5a!ccj4v(AMS4V| z*9g0%ffeKbq1PH;gCL*Y640}H#;jaSuNQWo9_4F%MrJIm3m!hbdM|(EEi8Yx!ER|t z;{wpj)1t=0w!`hyyVA>FCBlr}dthf8K0lfbp!Wp^s$m$f`xVtYn0?gH^2vt~0d1w* z;;l!#6U+f5Et*pK3T+mL)Jva#D@R;?@tP)vPYoo9R&w|O~tf3jB zXKq8^|8U4B+13(638Y(RTyvXI8j{gkM%gC#4X=0upJQm zLHs9QXUg+v>1xHN2a{kvM-=3d-u4qlc&2<;hn2md%}r%I;2gy|#j_OIZ!nziF>#&Z zM#UY9?@;8VFXQc0{FLGs6~CqUeML@wG5${#vv?GAbHycbrXnXy>26f)R=i2^4#oE> z?o@nC5yNIl{~g7>ia%52UT4zhq#^M*#d8!dP+Y6X`6tG^PVvKvA5;8{;x`q4s91rQ zMd&LoR9vpOT5-K%r{ax@k1Bpq@!u3*R{U>8sC{7f*@lM6}DSk}xvx;9;d{*&A#os7q(SVun$%-|KZ%|yJc!grC z;;oABRQ!PA#}%Je{GsB@ioa7F%gH3%_gKZ*ii;G_S6r*utk|o#UGW~p4=a8`@k@%| zRotVPMhC_F)+sJiyixIX#l4CzEB;O~g^rl%Cn(NRtR#WKqDuDN(cu^$-nNz*f#-u3<$xQ?GXD?{jY zIeW>G|Cx5PUC-9hcZo}hMztlJNR?mZ~tSn7E(9hKNOyqCK3gW6lFe`=T-PVd)zPGSA4;h{u%@J8#GxBAgQ7rSkoHvMNo>Z|N70EoKSmyb0-aM9hp2l>s%#+8WN3qQF=X`Fl z%#*U6D3*CnW>}HTGb)mKMny8uD3*DS<^5urCp2XRQIX6uie;V)c)wWYDU4k#^SqgN zk7b_1R3$RcHWp%dnde;4e{IP;@#R7n6g^#i5{sV5Jike&Nj1~ePx{VmwQSR}(2D9$ zvh<0}vzAXgk$L_V(^ zCNj?xnKqGm?qJ$P=J{2IdNNO@^<__JLPDWRmX9Sri z7Y9U%%#-5wD3N*o4Pz%VPkdg{O~o?L-K>B_=6Nnd6PYJv$5A5l+{tVwGEdHSM2XDv zYjh?u&t1%hC-eLeX?Zfw4u*R&&yO%Cp3L)eB%+b?Woe+-x3nL!mTo8`liHLn2y+Kvk znYkUHSU!P*PexpY>S2}kp3R*tVxw5$%K%{(|>&h^c9-z z9^Gc4yY_^sOx!H7FFRp3BQ#&gq^sRc+L)F%xrOoC#f87|X-a#?r&+1fe~d~BPmrK6 z_+W@C2xNeCXav1(u6}ePs1ZndM17K1v*8tB}jHC2{vga z#bXpDB~sW?hz?_sWQiE4RD6}_&M6j@#qwzpJ(b9Hiv?8_c~Lah%|~=Y7dF}^L^;^< z74memOHm<|6BjbINHU$Ayh!p0`L&ZQs$4Rb*@6n>TDTo*&B?V?P~ z0x*-I50Z%&ixw$`hCEY*u)G~*&~Yh|11G^W!C{HC(+HE%t@;FSj=6!fbacNG$ z#rXKriy2Tfuy`Drnw?<-xc<)bFzZtIn;q8RQha&&r8Z+>r84Vgl;b`WlI6g(eq4^# zuv;3^_**a$AND-VN?Dg*FTaN%mE|HmBI}RXh|AKz8mz(8@p4+!SUs1@tkZZvdBh<- z7RTt7%B=4LJ+5OkWA`eRSK6xpS46DJ>J_f zXD;y5Xw3ES98PAPMSEE`1U=77tfX(|aLBCvXTqB0v)yPJkeZGis7LR`fcK%0S&vup zWO^yHHeQoc@V`ke~2JzcP{CD6O4ygmmxtD<4 z6bR8-9}(IE-}58#?jU#!jg)f0Bl2!n4@czPt{(o><=r#US+d=qs(7a2TE!;C>lELr zc#q--i1>JXNbxcC|F+^!6#q-Z|68#V-7fEYyy8N|OBMf&?<44bGA=AMdW?kgCiu59jakic9OxlNu+WbUbv$lRYps+p^^r;}bAOp(vCRD)q*5$%pM%?E!_>0eZ04m% z=AKGq?kOfrWbRGO+b}Zszr>yI4pVDg&BikKIn3S_F0<*}Uz1QQb7x*s2PAXna)WHD zB{zvFW10JO7Nu0?eiLt;$lSS+_v)0$+*7{HJ+)Kw#(l=ASmu5;ZxGAe&tr8I$=p-1 z%>9$Rc`S2Z#B{OD{V6_;SmwTku2|;IWq+wy=Kd?DE0VdVie&DoBAI(Cmbq6lT`Y5d z3-ehdb5F%GckUHW#WHtpd`rbL_v4wfSmwTgu0-bkJe(ttx!(!;uPvE-J#rMJQ%_gl z%AzMS_cyVYOsbx)zQ}iGs~=^}SZGD{Or}j_?i}Q%5}7-t`Kd(aK97+Tnfv{$$VBFT z4nq@}`x=HOGIuU_O(in-&+|r!%>7|TPGs)CXXHfYegmC}%)OD36PY{T%#-9 zWbQAqx)Pat2h$}o_X=iuKQebJ$1s_D3NrV_jGxHd|BJ*EnLF41rV^R^dl)&9xpSli z9TwA&vuMVO>c3@ZB6B~QX%m_IF{GTx+{qQD5}EsV=uBkp>q*L!xt~Q^p3MDNhI=yi zzhX{2nfsSW&Xc*no#CF${U(NcGWR>_-k;3<1BftEnR^N{_djEX6Pf#WdH(~IxudBb z%XbxzNo4NZS?E_w=KgCG5Hj~(62z|xW z*6tuYLn2>3wFP4CX^gXGYHJXlwFo&5*G{EKDm+`pBk>mFY%54|qx1>e5g&W!PYgN9 z6J8|u;(f?wh3oR1#!AIok!2N4a1Hzp(N<*6^LLF>{G<}TU#@?c0*0g7wmYIU~}Us zgJjV&nN$s*A+X2GW>&> zj4ef75``0QE;910#&~i%eMz*XgVf90?f54mk>0l)+N-^Tmqz=$ZHAFYk3#;e;$yT! z*)BVruo)#g2r=`a6cJOVXB)5G_V7}X@JM9A$(Ha#BLYsgsvl~>Z@gJ~WFp`FOL|8q z@0aeZ#wLa!@pqe(MmPsH;hYDDhJ+IJTmi^ zhUpmZ{ho(emzKo47~eg9Ai3HzJ5<)=Nt0 z4Pdh*>w)x$M(-NfnPvelnr6%gGt3O_48Km%{5K-r3UdH0O$Y3LIdGD{SOhCHwVz@y&HC)-ZP+A1wZDGGDEAE zkHF3}e9kog1A5$`V1{A5_}q;)!#;J?(DLHXAPj6-H{;O!9Pv(YR{1v?rF)#mVV?V| zL&Rfz$3nTlZtPvY8=gnQ$*FN>mE~etg&hQnLA$!x>_EG(=OtF(|8U5Q{rgiM%(jx4 zP-OWVV-L3nn!KkoE_{nQOG=e0p*H-vN_+~5;W!8}lYOqSLR>-{8i0O>B3 zFP{NF-dlFMAT_n4KnXh_e)A{aIHx^!Q*QT2D&{P6dH2=9fL4Goa1U`V{=J zADx26&UbeT8Vl&cIME5#Hxi8#1)cp>{_bTpGls(vp_eFJoOY!@Pdli4Gm_@_oeU4V-6c639 z2OHR^Zca+kU-n=FWvdQQ_Fw~dYPiUx;pR*U?7;@g z9&DiO!3N46Y@qDH2Ff06pzOg0${uW>?7;@g9&DiO!3N46Y@qDH2Ff06pzOg0${uW> z?7;@g9&BJ14VdMYJ=j3mgAJ5D*uWJUE_<-ymOa=&*@F#~J=j3mgAJ5D*g)BX4HTI) zQ1)O0We+w`_Fw~L4>nNtU;||jHc<9p17#03Q1)O0We+w`_Fw~L4>nNtU;||jHc<9p z17#03Q1)O0We+w`_Fw~L4>nNtU;||jHc<9p17#03@b`H4Sx@EoQ1HFZDQ+afzgOLx z6>n01ii_g@0N+OG50L(BzK3uxA;K;F2>uK~Qv6*P7K?_5)f;`r{P_zg86Jsj_)2^W zVTxtL=gs}`B*=wp2j0K8ZvFfB21^EZhxOQdy$v$nZpw#)mqhOS@GvzGN4_Dyal`N+?&QZZ~vq^ud8bRyt)i|KpsQn@u&##s<2m_IY}MO-r`SQ@Mk;gC3e@28s6n z3{lX{utne=;8UDK&e#a$qpjQNkH&{kx6@M$1kwKUhz`;Iml0s1{e?(vqJ35$$s? zKeyALz))YbZ(HWmIoUxQi}pW{5?WYAjzVs8jeI-(eB6}V>A#0+O19IFXBJ}7KA&q8 zi}ruYuvoPJ3eqRr>HjZXv1orcil1z!zl^R}wEtaFDHiQd!);_cJr=tL``k`Hp9vGu z{+pS%VMP1CMXqE!z0_)2|`PShU~E>L?QJC)?>i%6g1N`!!4#i}q(T53y+fTYPS@X#WQci$(hv zGOS3nKeFxgWxQW3+W!jkStQy|w$qm}EEes*jp<_1emCzPi}t@nS0dV9$&3!aojwHp z*OqAi31nQh(+eY>i1u$|O_=aLEgHpRXSR9_OK+hS)$d~I6Vd+b__Pzz{u+`>MEhK< z6D6Ykkj_N3|1mlf(f(iaMu}*DBcDhj+JA&MN<{lIR!KzrmojZ4+TY5wiD>`x3{6D) zd^7#+^czUp6YUSM5T0nC%TxUA^i${_EZV=8#qmV@Zvz?GPA?rmBHF*6w@*a-%}ll* z(f)MgPPWreX0{U1{#QvR5$&JJ(EW(^-@@qLcKTMvPel7O=}biX?_=ylwEu4mO+@?0 zGBgqG%lIr2?QddeBHG`<@+G2u8T2Qj{jam`6VX1`5cu2axrWQ%PJaQzJ<+}lsXfvD z<0R*a_Wz8J$`kE(Gu#vHzm@L&iT3YCgprE&xt;#U%y1&wmjx9ED%$6EdcLc+ot_Hn zU$yP@ub_Zo+40nQ`AJ%P!f61S0bC}|-z4JvHB);~pW&uO$Pgs=4-qys^Z&}Jrz6Aa zxMJ#OB!q;*tET>gICz8b@)Ksl?+#oiLdp0RiLe@zqiNdmpJSBYGtpfkZ!rLC6>o?& z1wr@@$->$xy|79KE}bU1d8aroKe4;5ISB6-lGg*p zD=)fe?xi8#$GS-rEi%$v2v&1q8B$Z&RPzOMB=J=F{Vmsd_% zURirr`1a`b)NScoGq;rODCannW&jt7EU&Cu!Si=-jc!TpK!dVyw%aEqd{VMT;_Avg z=SpeV;${P}um3J)mwBOKo8owUDK1nN%$;a;U3kNi8D73`1)Kn_6TW<9)D^H{yJ-|j z%iK6B$eJ3qSTp{jiju_?uicIPo4a~8;e=k~w@7dM(EI!MznVg4%$w zzt0W)!!Fv;7mFuLE=ZQE$gcPOY~R7=O0;|;Z|@oKqbM3mfm2Va~_(-8QeR|?-=LwX(;pa zzclv!DP5cKEQE#kAueU@OwV`_KLoSXEldLJ%e}7_oD!FK3NFSUE?zC-kiHqxd&=`L z>rzB8JL7WYHNU`SEUa{GMmGfapGI7kgLPo#0Q*ry?=P{(yx)j;VWn#`X3uctB0ZMR z=v|{}7656gsxTwxtn$xzBwxBVqYm-jR}zoT4qRX-VpEIz*2Bg7V%|Q!@6E7#*$$oo zz4PH`#=>rbhfi;tR}P4PVtS=(GmeJvJa5E+M(^FQ`}A%HJ=|LIx4*R+3qdc+Bm_y1 z*CUD+vKaF2#pdwBO4nv|BOV@cY%G72`KMxEoTZL4a8KY-zL*M_8u{OhAkpW~VLQS(?5);ZAfu#Mp@PRmj3(v-daN*>k zopIrux;HoJlZQ4p`RZSKZibVWcE+Wzh#x>4Ai=N3S`a60ba&@-%{#07)6IU%4Be;U z8oZH@3vk((g5m5}%rN{-<^a;&RN}rCZX0tjeNRa^-&-4dFkD9w7}F`c zJyR6-JH1a_T+-X!11U-?t+w98@kjK5!X6CkX-gPad}riPCU=Aq!VsyY^ZIz`;`7kS z5Qcr*6uclyi1>J{Ct_H`w!}3mpQalxCfg3(GNBGU8}2E2$n+JjBu>LPl!*8b6Q}DM z4#elTfa$-X_zG|;K5A@J5i*fQ+nI`Yk!^@>_VMgrWLj)rYhlm`kR*tJa};GQ4BWC7 z2DnuHWi1Tc>(sqbafjkN6yK}3Q}I)ZUsRN}Frf2&b?;UDsiM>q!euQCa3;$Kl(jHG zSqlT~R)1Lw1NR;3mWeyKcdA>~!oV$JHQ;yDU)I9FEo)(bvK9s?Yhi%076vG5VSut0 z1}JM`fK9At;B|^0R+P0c@c)duWi1TcvK9s?^UFY43j>t3FhE%g1C+He!1d^4Nnh5& z0A(!0A(!0A(!0A(!0A(!i>-5@6~?{KCry+B*l{z7Z7nD(bE82r~Vt&zg_XI z>Mx>7#N+ppdS*D+#PsBW=ssKBSE~DJb#GDkjq1Kz-S?_n`a}E~@*70DeO=JW*VYy< z>KRVo!-Cp{wRtha>wBnkj8eR&ry5^Q2nL?#`kBFNIrgQ|KUJ*JKb@SF5UgS$aH092 zTXT#!k)3sj1`$LnXu}nRCxx`rFd$r)!ffa)39b*)ZoPqgbfZA3^w4NxZKAHxq>^O< zHl9;GDXhU0z+`CYJg3byT4u?Ax?V^Li_fl{i z&W6kPm8K4t|5Wk062sQOc zx8Y*zG-F|B!UJ7oZ0-dw#A@P) zy9Rbk1FP_vd0Nz1{appOPwxc~Vc$r4^k+QM@51HN+Xx5P)Yw?qCiwXDe(B}UAFppm zJWE3&x5AO9MU90~km}R>y_Y|Kyv}hr)6{DE2jSSJb^^nAy9gccRTB_ZN;pHW}6a2d~+<#(p^T{V>_`M9QiNvHZTCY?m z+oBu)>4#gi+gTq!!f_8iFf#4|o(y^sZ~+n3vQV*2kY3zZNgbA@8{sP7fWPcrOi?bnC?k1850S{)u_>ct5Ntbs(gK9b5t7BK z)sOw4%6`$@isZU~pOgoL{swu*zAf zpQlBQg^{oF=~cjC^+Ggy>|`trNpOBGPm3C>=WF2h=}m%z-vH(hL)e&JFYG=&%9{8r z%~%-gz^6yOik3h23zomzV7D}+Q3HB;TGUwBcDQ|dr+WG0H`M682X?06^P_nq=-uP2 z^3O0{_bZAg{+>s?q4=eT5QetWZSgq2H4=VlG2(sJ5&?Nn8X|5L8_u)j;Yqm<>zm~u zvaBExn;ob;e$&kuJ#!oS{=@T2{vCKfYYmRtVE%|LH8CkXQNNF8>Bb|NJcToUZb+Xk zDKUpaxA0L)j(rFDC-xU+SdZ~1#@oE@5MVY`OileOTqkuc!0hNxm1y zN%`<6U#4k5rA@CP=b8L3@#u=-xUHlNcE=-3*B@{4X|z1oPJDat`(Mvf zc{kjjeZ@+7uB^w?uzrjOX@uRx$<8A*e6*2N_nn%_%7v{ zQ8kwL?QoM1F*DoC-~M>6OF-{kmIz3CyzW;7i1~NK8wt-vWrstRw{(t*OX^3$bFCjC z&$SH?mE#ICRxjo@^!*P9&s99@ZJ*OJ%hTo)g$k@@(-TjSRq7E@)A~<|imgvg-2)_|Fdalz3z=l9$qwXVfT|w}9 zS0(aq-_=sS>&RS}UBA| z`7bNi5vJ?#GF?aJx{l0su`4_>*AZd(b<+N&$Xhg;XRsBXcC*L7{1DD_t)U!;z}kh%eb)lMfP^cwO!KTIi) zjo?RnDnGFM=-PpaLG9bBF;<2@^any0A$16H4VdUYM4aD1pP<=)1^Y<#4-Q_No~$`f z9gSsQXXeh5rC?l(u4}+D>Yw4-u(D&qaAGdUXjr;6&P$OE5yB{Azs^ zs`XyTG07b5-2`&&SMyvz)*tTb*3|`6V1o&M7`J$ChuDLF(uVL!@OgI7-yaZ=DWArO zpMp2E0dlh#v;kg@`TR%^`g;PYOdB8$`a6TM^XKBf{DTbHhc-Z$D!qfZ%#M8w(X%+{ z?{AoRDsLFg2y$1@HGPe^(n0DG+*A+xTTjZfW+S8`o#Lds9`tuFqm+v_z|X-Y~+1TcO|aK zQ889>&>webB?tX+A6jzI-)|UphD$dk$Gv+c2mO5qw~>SXZeUn^(BD$tAvx%8Dl?O4 z1H6M&htURzC57&wKdISR8(<9y$Jzkb@usmhK<4GZ4*DzLnew2&6f+cS1N;E*vB4EO z4P8rb=ac7pYVV-GzeAh@IOy+PBpGW1oIqMd+5nS-{@%cwecauAa_)DG8EXT4H(jwd zz>hL!tPOB1?+|MP9K!+?X#*VDL4Ws=N~{g=x4c7&A2j1x6(4aHoz*B;I*X<@c*F1a?sy>EMB4wkSeRIWG)(FRz>$cZ+< z8yGp!26zcW6K#N(@tGvr0RMxL6K#OMU=b2+fPclvi8esKnf^h4+@b3q^miYLdD;NK z#&GYTzdXYSYXh9jyLj3F*;&g$f6@UY+5jgoUZM?fIi35_2FSHeLml+TeH7k7e;;C| z_M;7O7Ybq80C~{gOjdrP4e)zRo@fK4W-0HWKhDs22mMtuZK4hEO{~vE8{pH7oM;0i zE9D*ZCyHznZGd%5n`i^1usY=(^mhl{-a&u!m@iKoU^{c-X#+fw;hr|Y$C=*K26!`X z=V=4{9@Fnn8{mVewvlQBU%(hOTpb*L4HMVU z{~AfmggabfqdhgF6>Gb@6Rs#|;QwJ*!ZwPN^hP&}riO?| zsM^~a=gyxuzYZ#@)L8?srW$WKoeg+Iwi|21Lkl(4d1xrH>O9z!1N@K@`#s&Ue(^TX zZ{T>vxvOxJ--5a4pPt%sb8Tvz(}jl)GL+*N{WW=<$u+}=3;lETl{m)F{OLzd)AZ8K zg&kRg=|I!?IhqM%xmp6~aA0GL-4bmI{#^nzK{aeaW(tMg=CfAt0 zZqN(?6=V&4(9~7vZ4D9)PzmuuVRIAoR<$>__O{)Cc&L_!_P(}`mV&5%DqP>t-Y?1N zO!RSCUU568d#!-u-MU&^dt2axlfF6|+8u%9)USr-=AdAz#PnRW4MM!5u~&4?^;%|o z>K4bk#h~D#uWM7Gy`dMBTRK{LHnem$Z4C-g^(KlhoSLe^2f}r>bu~hnTdW|gNUI%` zWMHFd3)OWY3bmKDbq1Is%$phr=vRf zgg^*hqUTSljIW6mSh@;CmJXKGB%emEwY`CFg;N6Q?i}|zRAE!-m4hIU?6F#X@w|q< zzMi(m{yw~-BR50IK>SaFeJD!To!pMe$~zj-`QBbP9EP9%fxy5|3kXeihAFymR2;c?UaD4$gJ399(eBWrbz7B=4SgTwnA%9P3U{y`Bl> znQV)FSksAlHTGC>3`%n~F7C0))1ij#V~#n1bT7cgxU+FF{@Fk?3{N;$e^Zt*j5s#0 zYqRV*r^N|V;_pHc6SW+qra(YbPefa|5jYh$*aoCd9lrC!>Iy^U+FmY}gL}E^6wgv* z|3iQF2gG%X8x?mbzC-c7iaQlQrT9g~Zz+CXaj)V}6|;DxypQM#1I|>p=n8{dbcF#$ zR~S%qg#krZ7*KSD0e5OT(G>>wm(?x0!rD-0;Q!hoVH3@Ez7fTAl5D7wOcqALt2y25~>D-0;Q!hoVH3@Ez7 zfTAl5D7wOcqALt2y25~>D-0;Q!hoVH3@Ez7fTAl5D7wOcqALt2y25~>D-0;Q!hoVH z3@Ez7fTAl5D7wOcqALt2y25~>D-0;Q!hoVH3@Ez7fTAl5D7wOcqALt2y25~>D-0;Q z!hoVH3@Ez7fTAl5D7wOcqALt2y260m!^-C*y25~>D-0;Q!hoVH3@Ez7fTAl5D7wOc zqALuT&N@1xD-7;s>K0vLaEq=mpy&z%{z}97(c(J)wBiCH!e6iMa}^8fPab2aeF3NP z{lka2mI!*%f8fuMeHZ<$e=_A-!^ut;oKZJo-CAFUj1HzqcKZL}>@~~!BcGCUb)BGyd%V$F<68q1snv3y@@HL}GjyT&BCG|*`5Y_S}C zDaI6uX+;vni3P`*ptRBirNJ**t*+E~FhRh_K=T${A-_E)DC~nhok_I!w+}A}7s5`% zoP_JLm@qn@USa*1za^}ghX1i>d_f*pu28@^7(Wc@iN5VB{H0EA$A1`(dkMgMRj$Ne zE~xl1Abkw`{V)tT+ZqMT*Pr5?o%fmynsBq}G&jlC(2kik)IvP7_FO8Q_Y0XtLw&;A zpGTwH3?C22F0S$X2DV#p+1m;0(EBWy%uF0PnYcR0i590Vr&zm4@qAD`rE}nG0{c7L zn!1`>lKBvs#Yo5(%_S5$3WfG2r|(4P=!!yxjLu~UwW81?Bk<9Uz=s-t`;E_rOr_)R z8}SWd?=lG&-wVd0dzQLw{JkD--^e=zkJ9n?dOs5E7LVUKvop$iT%VvtjfJs`H9LdY zvGQ#*V_~J^?;R+|Q;5WJ@EdC7SPi?SfmQg;8J>q(OUK`w@9-pNd%U|jEyV=Vh`zgy`=^DhYlKdIH?MTC~m6>)g zfBPGMzZ3Lk84)C=mDl}>05OjuLyOG;v?LF~4ieoK^fKa&Wc-c8Vn;Oou0x^nxY=;y z?=^S`CtD`G{CQqtwS3cYIL6<6mWgruK4!-rer{NgY)OeZlsZn>cMPfH#J*zjaN0aD zi7MY((Qzf?@d)E(;b-yeSgw)iIGMwE;HTMN5Em&fQ@l{|QpGD33yNgem~M;WTNU4- z_#PrY;xcXqKCJ#SZif4F8vaf7|B0d;?uBr^zvSB|Ydk3*{tWq!E8p(cYIfD+Y5o{| zdld8SOa7$!cJ`MC$G3yPi1~KDbED(ie-lpQje-geG>-7?;4R}>H}odx+k8R!Fns&3 z50-CtlYM*~Q*hzUhOv)#GA^WV!mgvM8@%B9AbEJ#OEh`XND3j3@a;iagt^Iiy<0o_ z8XAERybEqL+nR$S%zA`xPsSBT_;!11lJN$8 zj_~cM1p9XReEZ;!*%7|Ir=i>C+DF2-&p-W)1;XIxhd;|=y>c1s<0-Kmk5SRMCkJ*{ zJbCdh43&O$=`=Hi@%{w;GiboR46NqEtMOe-xXKhM1^zhK_{h4apsAB5Y&2|-oa zgz%^^l|4Q?D~nA{G($0h9Jj`1KitS5J;~=5&*OQDUrJAia3@IUxs8L)moPOkaVCbh zkXI<>Dg1I6Pccp7VLnF85=8@h^qeQ*9N2L2$hY`&J4@h(s5~}CZwY+N&Opx5alCHE z!p??=KSxC-iTS|rUbN}69CX*?vNW&;U&FPF7Bv>O3T~esWuAHXksjYSqjxpzmIl_~ zAviehH)CO)@Gv{Wo`fS$iyG#Q=2~3-eYrfF^8~yvN0WA6zW!Fnum-z8kAf*Pb}yoP zJ6#CRq-tulh1ZVd zpN(x;$~?%omy2|RU?VcYxgYZKoa^E{$Mfd+Ea=ZR6o+dYpu4XZ%RHMl#-E+x=88^R zuwcY8-uE#xs4n~F9D`hRFPZz}V9BM=2kQrRNA=kE8VrPJhsPm*F9lWa+FJ%0@AzE< zyQ}3ag!(w<9F zn`o^c_W~nLFVL}uol{VO-6^wQPv3fU;ps&P8J|h>K2?&MK@)ff`9q9zV9%sK3-3&t zM1ybOih_^w{}6FR^6rhY%Sd*7=qv1|vE1vt(RI?wU7Z*%c-N?_Kz@~m>+Y`yir!Nhj-?VcQY-2<zNHwRUFbB+QT(IO%(<>*F*YQ37zZmC{tuGXn1KJ0>?^+7 zbWdQQ=h^?jmg6nJF&4Q#J{uU0@<^4<*hij?a5IKsX-2~`e0Sk82xH>l)M0u*)OHh0ZAk-Ot^v$^Zbtn%SBN^dRB z?ecM*c^YoU7{9CFVApqzRX)CEOnu4qnK(>?3!?4ktMR*6!|^)POhY(oI538%v@#*f zI08S7q3UEyHc=jd8=9ikc>No~?XF$2$NN7)xaUkHph=I2OCOnXT!b_n4}=S^3+qc{ zn;_rFaL&QdNQ%?5oaEHxL!tZezMTW}WA3r($vz$^mSybRnI3ysZ1x4G9jC_h2S)p# zt%e6VZnmQ_Y)A824S$uHw}vjngZCU*&IRYa+M7AwBN!eZeWMgJiiYDpN#)s!XDf1= zALG?1eo~R&a&*5^af9Ml6u+zZLq$Hb_`Sh7fyC|V{wKx%R^*%;rprFYeckxHWB5Tt zbTZyUl%@VS7-ZYgefh;T%@;;rGu?CF6DN-E@jtXddB_Cav|OMR&!hqRJ%jI<48KXv z-s$RhjZ@gR6TS7|1l(Qc?CpNxXE;^AZ%#V=zBv%zH-W=Al{<3_p)V+X^^O4ukME)F zF5=qZ5?SF;X9>qJ9>Vf_iRqbdonO5F{vZB|Z=Ih5e-CuhZ9APU2L<4ppD#mjrSj~rokYj)q&^+Lllpf2PRi$}QTPpXc#?m_DscZLJAM}R z3#aN9gx@?IvWpI&!ozS44jAVipUjRgJ5iz|z=ZmEHp_Wz_#E%nv3yot> z%kgAbAAJj*1xI`f@hupC3pGQ+w~+eXLMbl@mIJ-hB(0p=aqfD9bDsb@xu2nwdn%4z z?s^>Y|KU>u8jLIdWGacs@gxIJ1&4eF1ANYGo z9uZxCEsb!;WoDc)dg0jd3um30xeK=KlvDivGsl$83^zQ+W2wVjT|SeHVawRxO$_-EcFsBV z>{I7BSTnsmjL44~2P=3Rd-f?*gGJz2dJClmVf3)hAMB$|uVVCx6n{|3hgTP$Rm+z) zVAZZ!7ac|B_tih_!>ZH&`>y`S|C8$jJMnNJIz66+q1mNqfPOTG!}9x~yKrL= z#>By?!}K`TFvj>D2M2Rbzh@xu8_5`RdNdq3mNjM_28?{f;q}+yzdyfwOdN*g+}T%o zqQ>~mglwm`2@eF;i|OUTvRx=IfHiS&>XgD`Do@my_TzZWPVW(Qvg>w^!X{<(iX`ZMtew_1Yr?(C16~c|>!(bsw?_Y4v zI2l-)Hl&yRy-NQ(U`^T#my5yAWS*!oeqVu%OVDcEk3+a&MgW>{+21|$5$>Vggk$*d zSsZ%K$Izq@ju^x3@wwZqr#e6CTBpVKI%& zbJ{Vml7h1lXS@rbROM1CLb}jdXQUNNM25KAISZ`1F})wJN`9I{7k~QWBE}aU7rnGh#@b%~~{@x8zd3DO7ixcH4W7PP6zlb0GkNp3w<4wEou|L!B?&EE0 z-kA27ivDs71GC4QU4`R4V&X79!_DT28snEe-sJtW(F6jTaM|O{S5S#9@aK3b2bT3< zy|Txf86>bA?#7t(X2QXKd*2L!@tNM9#+&yd0lqhkG3}Q<-n<>@r4fkfF&|UD?D6I+ zS?QVbU8wN@Vm4dlj5pg5t|#NoHe4(--t4dSV7=JpNFp-a>$5nL;(ld0$*EOU zw8@`21c{66nWoJmVfC$-uskKQk<=LwxWyz;9sM1lOpdS#*=^R zz{@G)Qe3IXAq@R*Qu!9e+tq!c$}%2A6Pxj13Ed%=s=pZr8f3p>KFcqK(!yT+J3ng5 z#2$|alLL?mE)U0~EXjemL#fYxQ0A`o06OxaMWdbbcx*lR47ta#qW$N2zb^ZO%|G%( zb~kVyq7#Z@#r1vAC2-YY!XM@ACN#&ux~t%0hRz@jFjyWA=YX?yptycJ&Y`$|9iBuv zs<{3o`sC#+_-l>S=r%!;C_ZocsE)>^?v4X!Nv{78|7w2=KuOBI{{{p2EbC48% zhhub0v6%OOFDivcvRgxO{a@kk4Wx$R;LlPPQCxoyPK&%z`9G!a5ywNqANB(1==4Sp z4^zxvMlY2T`A;#3O3D0rmL!Vny)h?A8iSxPeH#);@Mrf+IO%g04tVEmgZw;fi8ns~ zRXBJPhVuvo{4X${iJ=ta=OK(&9!iP)Yw?`&jtr$_{&(5-u32&EgLDWpTm^S4T})u-^zp{#q}(UcRm})FJ6b`#laM$k+>BHsv4IDJQN&5 z|A0>Yp2cA}QcHLZ`7UEdit7(%;TI0)5gkGm*ME~4w@id%zXQ<>M?;+NeWjqP)$#6Q zQgYdsI^IT&S5S4a@gl|bR4DF6 zitDQ>MT+b1V)-J)^*b1^gW`JcdtnZlf+}dm^d1Y#JQ)%S{dic;srm8?AyQml%W`&5 zT<<*-rZPSMDdzWl7;kpI{5psf*He|b7b&ivL+Rxwq&cCuz8@oYuekm(1pAmNu1ATS zzR!KI6uU>(680SaJOe zY{*z~{UZ9titA6HZ>+dpe)7bM>p3R$V#W18XW&?I{qI=FSaJPAim~GQGZ;8lT+chx zTj8w+_{Gn8DgLwYR(ibI{Nfk9)ETUVrMRBIF+59g{Q;CaE3PkPbu7j8laWl)%X3rm zXpI%u7cl!+aeW@6?Ll!ppWX%D2sgzMv{&qI#;64MYU+F@Q=(#S>d*AugW~!WgXbOe z7Yv)XdQeDGbjXFIHUt1B$WY`jePcwMU&we(`EIRm!w1#r6Ng#4N@2cuG2+ zrMUjPOwLkVe=+?n#q}%cZz-<7n)03$*WZc&Jyl%qL25{vKg#@jtGFIrb?~QH z(I)RFxY&c6*eD;8;`-qKp@MGiA?{ts#620s#haN<7YsR;WselgkEY}d;Bnu~?Uny? zd-wCG2ioBGLNmP%@8wsa(FBj~7iogWx%>{6sl(A~cwDFGzvA~Dw`^<~zCiFgWm{7&b8UyU(EBclibpkA4_#{sA3dzB0sR2#&}V1{X&S;~G6 zwMB=Dyd%Bhq3-$)>cFdv&Tmx~E=fvxY%T1nf?CyaLwP&&QODZqjrwq-wZ4-U`i^S8 zMF+f58g5i}XDJwuRL6&^vr&UsmzR_-RD%vJ;M7rWRM>a^AzLL1@I&40p&t9)OtkKx zX1{~N`AGM-sP^xqe%|Qdr{-`>1vi@Z_wKIMU%vc=R$cI-ZQLj$x3(pS)#-Ou)-Sr^ zqmCs%h(m4s@n2*7voM;@tCod(6NmzFTa&u#6z{n6L9FjQTXDIija^l*t15F*u^uUZ z*S!kNRtWHfesz{cb^|av^;Oe-SoTQSI)lmH0->7u4x1T7TKQ#X1hZ>Hhph=riDTXJ z9dy`-I{wiqMI(QxHXjm|v^O7BUX#58LnEJbm_%O{?wO!U?xiZ>b_AVve_-iFxqPez zULRzqoOt5V=~6s!Mx`f?D<4;$E`@f8hMHv!qtc}(Vy^z#*b$(vVd*7ltjbKAg{7mM z6ZjWN7u@n^We&V2&6$4MssBfmPoT<&!t#yG|4=miH)KEm&0FCRxZ~v!nO6@C|MBvj z!}tt`7fYwP_w(Rp8-}GB4a@NIZUc4|j)Q*_2d5H_Gq#K|r_Twp%O&pv$Tktcr%yKZNb9P z9G+>Os4;$5LAKLNAU#vQ0{EHqIH+YDUO$>SNbk$0l91^~d$%G$%-@mNWFr6>hUTlV z=qs%v;4mJONQM~!Xu@UBEja@YkM1TM!-wOZ(DSks$_ht-)Q3f7y;xV%M{(*rfc|m> zPt=%vjcm|%@BUxEodff;8VU*aWKO+(P1qW|wrNwCsC7bz4`Yr!`4O5DSpNHGI~v1w zw67KAXe10Oprl?0q+q)7>gIkN*1##e4xDeFMl=uquz8>MX5RfMh6g!Ou6T?hpBZ%L zJxshnu}N`_;&qC*DQ;AJSn)~4A1VG)v0d?xiV1WI<|F^$fb!!CxL?%)$R8)Z042rSMIs1{b;UxsaWF` zt;QbKi1+lsyW0CAUIKdCO`bPn=}%GSj&?u&&TrpOdppKrFKo9G>s%_Pd zJT&2r?GKK4W4k}0ZX4~l2fVS}8&QjMtbZAQ)iyVC)wWxFZyU=}a`s*AC3SbT`xR@p zrPFKMnLf)OAirFc-)Xx#O54fY^3x!5^-pV&M^Jrrdr#}aG+7^}yJ$P)wW!peruR%y7z?!Aa?u*+KmCvL$kALHUL78h(W$ZH* zNI%oIvnX>z`-2m3Enq#!4*{818SYeI~7;KB5$1k8sUa*xnakUZDBustMIP&wDwbH3;O2?asTwuKYxPq zY(oF!Ix(!j>YD_<^#1$TJ~lpd`yt$N;PyP+(B`;j&))eA&T$Rox^6xsHIp$z6;$-YMzhV|yPEpVF&eL3n zbX)~Dw4*kVVI6ga92zPINymYXPx9U548VsT-c>Lm!@pd|_NT$c<&MpU;UA21W%xgd zCovfQegH81eGtPi{3LcPhW`r?mEk{xr(H1oVXR;!ant5q3`Y)er}FzIQ>LE=OY*?nSZ4v^_=1FgZ#pjuFEzA4n0yKbn<~82%@C z-6DoR%`_v1e+2#Zg5jqI8ZTn_2l0A$!SGLKei6g}MaGL5{u#_YV)!>wiW&ZES&8l$ z{^ODU$BW^A7X=rFpWL&>@c)6L;qZgh8@8B8ZD-3E-(*Ur;lvC-fB1MY!~Y25#ti?@ z*i7$uh50H`o6k6f|$K z%>SB?ACg<(IwW^iL0yxRJNsBRI;Qf_f+SjPN{Ju*}J= z49^Qi>saoYB(1&TLHVCSD!FGd2d}uu@%bk<_w2vIv)`S_a4PCpk$X=5`>1!Wz8;1_;z{9)guwjcAM?%T4Wy>OA#IV>SJ?!Gheb})2 z=zPe~_n6{fmf4*A$FHx&(oYS@Ft`TSvMRz06PZ26^*8y5InGCIyMEH8K58(A># zCj2MqAF!h7{%9EY05+e?XCGWnt=)ez_q3f7NlBwqS{F-r&LI}@Uh^GACI@M$E2<%v)T=*v( zG&b6(S5rmEfn$?1w6$!rj#IQX8eWcm%AGkeGbZEryK_vYdDeHwmQ5Hxx-9eV_=X8% z$4o5CjDNT+vn6rd*zse=Ot@nF>={R9CWJoaM@*>6VQ-W0C*p6^W_-bIv&bkt@b2&h&rijGH|cGglhMm-#y{Z}j`z z>Hp4YoIMLpW&ZzMK6Cu3$a8E4+v?5qCJdf<1oDFQC(iUgnMgAbXT1#JtQTlqJ8h0L z=X`LD<1?RFkQqB=%;>Qfj9db_X~oDTM_WgPJx#=M))73O6(kIfcPzr%b7@K-8^ara zdO^wbg324+>%43I&j#yq*5+Q5cXeV-AKpLGvd)3{(EE4XWD$vRJ#L69UX4qkyx6&u z64>kJMGKpj3!R97OKP})5N3DNaLkt?{Y#NYJuJt!bWh{%ogsHHeVMYgUwX%BI@uF+ zknPeH%}`%=Nh@Z3#M5=+!hL{=JJ2q%5*aisS=ng|_Ut)4n417qa+dmwXvRhNQ+c%I zvi6MU^oC^(d(t2%Hz=#gbAXDe-8Idh9=Zju0EPW$E%JXP?XyifGtq!VuEuLj#?$ zp`kvUqlI(q$HV>2VO8UbC7AZL7ZZ!ZK5gzj zsdd&wqmO=taJ;__&t&@DxLOP($MsS(O$(!P|D5sT${kA$edAKTd@P676}7x6k%MH| zP`hGbmC-)0nSL1BKX*R|$$t6aeJ6%g8(y%HsU8vPn&A+W;{t}`=yH_G=KZ)49y02L zJB>+iB+l*hDvKSN^TG5O*Q5u|MdF+EHo>C=ZpN7O$N{n(#xNXzA{b*%Plkgzr{4+q zWZ>w*7~?k$4tDvfQNHJpCd-Fe^HKTE!MTZpQ|DaFl{gxM1!IgK=QP>rm6nF}VtRCE zJ=jjQu#7VSmgeSxq0Yll3d7NV1*}P%es3Y1J$J{n%SG_B^UWY%aQLiNhq; zc9Gu08ZN^?F!v!`4L(hcVH&hgDjN61!5!PrFhkGmVoW`UVO7YQl@BQ2-tD%sj zFKm9C_U`r%ux=d$%#NSmNplYS2>W?xa=_W!#+C5=u^Sp!2IuUjp~;cw3){)a=8V{T zeWjStWEtuwwT(k5Qbac)H>RicN}Z6t7d{yMgI#ROB<8 z@{@`(mk;tURc=@OqoT~^gFk-_GM>!k0}53Il;8cpR`tJJ@p{GE6gMh9r1-Srj}0~;(LnuxUS6iV8!DUPf?UV_3*D#Sr&~!zDMP+DgL|SONwtOCebe>eZ`{`rz@VN zSgp83@iIl3%ZL1)RQXqmZ!7+nVuJkw;SN%ig`$wRs{9MZw-o=Tn2X0eW}IZ&&=9;-iYsE554umg2jL33OnVqe!t#@pwg<%Lo5+Rc=(gM)7ls zcPf5e@kPZq6yH|-Z^gbC05adfilvH^6i-&1t5~nNOz|qk&nw=e_#MTk6n~<)Q!&6x zh542%o~U@4;yT54#kUpzTd@Mq0>(dG@dCwW#pQ}uDy~=jrsCs@&k)g9f1voXy8lY? zDEw|?K1+#srQV?OZA3hu?o#;yBA#1MsQeNU&$XQ@|34!7+&e0Ba6mbSi1ZIoc{%S( zlm||ZhnF75Qj~GIcB}UdU#fVEL{k#G-5>g>$&)6e#dJR>aXJS$c;uH0lww4IU6BrO z3v&nHII>`1zK;N&i%BokDD4l2Hs>-_BZ$?$<%AlabGZW#!{l|E)^aVITliGa3YR5GjIqt;Na%vaSZ03R>Nb+GUN=$xwjGr zhSfyS2@&9;bv$Y?X6RJI?o-Wfix(}c!v{`ykyNuAuIHW&TJ*y-Uhoe#Y-x0T8CUXZ zqMJ*9XJ6;|B@J5wTM9b{mSY+ALH2^FuobY=VR_v-uBn8b13M3v98|kXTx&rHV1Yd?0nd2*m~F|*k)Lc9r#>X1$!CnYS=Zf>tL^kT@QOR z>;~A|VcTHuh204I0PH5%2Voz9-3+@0_G#GXU|)dU3i}G|tFW)bZi9Uj_AS`AVRym4 z1N$!Qd$730Fi!~ehAo0k!;+ZDz)ps(fSmzb2|EwA8ny|x6?PTuYS?wK>tQ#*w!v=xMPV7J1)3cC&VE!bVK@4`Ah@`o*i{i%UVYk7)1-lFOU05eT{;-9x951I~OJOsx zlVK}hXTVm%a(rA3+XUMRy9#zS>^j)>up408U^l{Uf_(&b3+!{STVY>?-3I#>>@L`M zVI7P)60n7^MX+huQrHaaWY`MW8L*YG^I)rCn_ydESHZ4^T?e}!b^~l1>_*s4u#doQ zfqf2kE9|SV+hE^<-39wD?1Bo|6JV#oo(MY~_9WPoVNZdb0edR!OxRhlvtcpMaRCP9 z3(kP8ggp}$AEXP;hMfaD7ZyLT7Mu$^5B5CR^I`Fkx?nym2J#Cohpj?=(FDU`N5B@t zmcWjLJq-46*izV0ut&g-h8+Vt7Iqvg|KVj|`7+{vt%N}{uyp&LV(JzMT%YQ0V-$C^qRNq1MdW&E)tB#a zR9~KbsJ?^hJE*=q2T^^|P>SlyGm+mh3t&-wry8~fwidPywjQWWG{wY1$znXrLdoZy$tr#uxNf~0U98)YBHOU z$Yvz6DT!=OBAb-RW+k#|iELgXo0!OECbBw2R*A@J5m_}Nt4CxNfm1YpY~mWqn*S8d ze~RWmMf0Dc`A^aOr)d6DH2*1@{}j!CisnB>^Pi&mPtp8qH2)gSzee+~(fn&P{~FD| zM)R-H{A)D-8qL2(^RLnTYc&5F&A&$ThmL=#Z>{EEtNGVz{#~=`PXXxwVHpe z=3lG%*J}Q?nt!e4U#t1oYW}sFf1T!Er}@`u{&kvvo#tPs`PXUwb((*j=3l4z*J=KB zntz?&H%4R25mOo}p3qo(N5XP!UKS0_dp}u0$lAT;^A17HRAs;cIJH#< zIK9~)de1Cg=o{}8y;N8{Fmqk8c`7bT-*S?DC4p=qvqA=p<#7h*jx=S z9n6YLKbqmNJohQUbQO;8=>%+d;rQ-0Y2#GVtK^9q>|^1T}8j3W;g z;C)E%4xlmgqg}6P+^6>o$4f>w`F;@&xVEjv{W63bVg#TG$8wlHK<^C*cRx?mm~ceX z#`Kzsh=p)uGxmpNJqlr2S3AAg2rvR}#+dYsY|wV^o~yD;!u;$UDYG=O>AY?~FZRTl zFFhc3;=2646r)11hs36P9lZr{V4V4AAv9}fkmdo%Z!jgMkD^kJ|8amyv7gxH96{L) zJ@jpK4d{0Z+dKN#g(fMYJ3NOfvJX=}Rk2c$V_E(iyIAElL|#Ocha5qmm{3eA@_N&M zkYbVI5XH1&iDIeZ7{!cYx#DESsfrbf(-mhZ&Q`2coTE5TalT@;V!dLMVzXka;&Mek zD_Eb)6jv**QCz2Zz2bVsn-w=G-mciDc(39{#Rn8ODL$z9h~j3&Es9SoKBxGC;#S31 z6kk<*U2&V@n~HBKzOA@R@g2o?72i|j4KCMTF`<}LEL0q%Sfn^aF|AmlSgJTiF{3CN z2hr}6Ri3I?p*US}hT?3+N<~r9iTLwWp08M~$O)RPN0VZ+VyohE#Z`)zDXvyrqqt7- zdd2mMH!E&Xyj`(P@m|G^iVrAmQhZSH5yj1lTNIyGd`|HN#jT33D88!ry5cs)Hx=Jf zd|Pps;ya4(D!!-4$EaL?#e|}8P-xFWl?N#nDGpIgE0!phDvnXiD3&WuR-CF>p(xxI z@|&UZY{g2&Ig0ZX=POn#)+;tCHY>I&E>~Qoc$wmA#WjlS6t7oYuXwZK2F2SI+Z69r z+^G0~;wHrh6(3RDthhz-X~pLhUr^kt_=@7IimxkfQ+!kLEycGLcPYN3_^#r6ihLKz z^;b+NCKU@62PqaQ4pB@imME4gj#11gmMczHoT^x%I9+juqHy2n50xr+;J)E5+&8dV z{p%H*6tlVSp`IPE(*vmRwQdnZ2d`)vOS%7YUk$6 z)7yC-I0JXGei_{-_x;M89S1=U(l@u4!woZqwvVN%Ey(VcX*--PYf!#v?c7%vIy-g* znKkV>sJGeUwh-wZhWLpP4-PU{NnUpPzlFYqLe0fqS!rrWj`AdHW`5Nx~SO_b&L>}Z|&RI$!e#F_D7@(LT zadiGMpr$=s;A~9{%2mgkEPNl&X!JFh03%L3w?o1C640fOQNb_}FCy`=zzL{ec416zJDi{(J!%Y_WhKN)! z4CP}p++^W-DT}CJ_zX^|f z)reFu+{CLGsbG-NWTb-OQRcT7Dj1$(evt}>&$66ds9=y$=kvoEzIb-1!y;0_AYZ1D z3I>@27pq`6o|Wic1;eiq?Bk_^;Y%oys9=zRc)ZC%16#=`SqM_++F~Mg39p3lO{S;} z#@b}z2)19Wf?)#V#wr+AGjNwG7}nD_R>81<-62-NFp~MkDi}y6TAM6z$+)G0;Ryzg zH(8*@RZ9g!GXr<6f`O!mt%6}CD`BZ%c!&O$3Wi@$?yQ30d{)O&!N3*cvdMxx0Advk zzhU8G6%11tttToN{>p%{3WkeWsaOR=5evNs6%2o5u9gah=?ovMVBp*|O9jK3OgvV> z@Fn`jDi}V?wBk(`zDwU&1;cCfja4wnRvKNZVE7ldWvqgsnMqa0n=G8fa#$)DM$+F> z!BEM(EENn_F*!>GgKQdPsbJu5e_I8^X_WV*f?)vy^hO1P{OgESFl=D?_GXg>-m69h z!{=D(4@(8Z!>AxsFswyG=S~=huc<>$z_7>tG-P*_I~=|=55hu+!S!@KOmrAj4sC43 zxdc9k>IIHqSohpva2?GJaNN1j9zgvIhpc6S3(ykoY)O!bl{17UI75{pV7}Z8No201 zJwwu-;~erR<5RbV`&Eh0xEzbQ7Ys#|`y|TQ66HRLa+Y&w4swe(h>$xj+?sdaY!E^9 z|f96N5|k@qzDhc^0`%seu)_9~o?^B=on<{5teOux@ey7~jh z`TY`8%a0geHhMIc@n^ z`~90=m_@|hY<>}4mXGTy`MtY|w@Jr%pS5h~tNLWX$R5aIw>?Oo#PidaR#GuNLPf4o;n| zm`hO46EzG+!?C}e-n?`;--YSn|6!EgGMwA#m1C{~{-a06__e^rPH$a0E+6MenDVW~ zxru{QXED-C^F)pD20HJEc9!VNP5kZI9?Gl=>W<@*utQJ$zV;fQwEd}T2D790^==IF4fD6-Vm z^ihaTJ^DSbr71Y{tk8 z&$(;HNLiw>2^Lz*bRjcZ#ztl}%~0)wq4MH}#a!7OFOH5!(HLDXTC!-l)7aR&Vp&r( zl<2V6M+q|IULVtmn8Q_19Ef!ZsKXF+q*sY34Cj;#0jDxb_i6P6J9-yoz2DYoetS5#nb8vvN zo){?WiGi}77%1zBfwG<$SjTn-%D+_LJu1t3V#uqXSx*dE<`@9~OWhMen2)R{hP$jM1`3A_l=Z|w;i!SK zo){?WiGi}77%1zBfwG<$I1R)l%P;GRfz>L@dSb}3o){?WiGi}77%1zBfwG<$DC>!V zTwlZVxW0zS^)*CUPYjgx#6Ve343zc6Kv_==l=Z|wSx*d<^~69~PYjgx#6Ve343zc6 zKv_==l=Z|wSx*d<^~69~PYjgx#6Ve343zc6Kv_==l=Z|wSx*eS3iAS4epycpyhmkO zPYn4fm1R9K!V?_nUo{POVPFHmo{&Q58=MN4B z`P^hUsDD_rj`1F8#kzl@n z3!d5mmrcIhby{V7~te|Ww&oakRVUkZBpZ8x8=35dv<#Zf*1xnk$*nl0};DD)$;2(yG9Bq0kb2y0-x3bQEg`P3H{aL2k4ZBTM$+E$Kv~0v~AH{?tc3TD?5xdQ@^p4%0 zi)%`D+hKtscKgfBW8rY=9sxLpYuQ2GU=?C^o2t5d!ESG0k`cSjF=JQk_L0o?>tW_a z`7$FlVz)(ye8g^VV91Ew&SMS{yPeAl?FGBdov>qe`}fSD3wFDdA)gP+IXiy^Lq_cO zORQhSZhw(d%x=$T(C*poeyG96i`~8wH5PXJ7WT84-M)}5VfgDH#d$Z8m`IJ|l`y`^ z)OZGtHyHRi8zW}7FJ|DF-CoMTF}sbhxW&A%%_pbsVc?kE?#I9}yL}-8$L#i8`oTy_IK5YTQ&4Ze_ysTZSte$&+vMtOb~{b~ z&g^y{CS$SN_aT_D+wuU2*=>*EVs`sjihE$UIp;?<82BxV9kbhaF<#7Wf1ZWf1G_Ds z3l_UQoTJI z1$u$^5M7H~Q^zoF%x;gQv&C+InzF@iAIfrB?6y$n7Q0IB zYqBSHn_pqQVYi=RhB3Q+BFnQk>^ARJ!*0)FAwMj3dp1hw<{ok^M(6G@Wa>_EhocTO z9PfaECe7iN2?GtygkMKAu|F=J8Z)A$h<`}+i?F9Sej`f1|zMIQO`RT-z8b)W$!mnr2ZK9d6pbvZi^3M4}jP?;dVt9`0OUh5gkHF=^S{#;EtHBcu306;=(tHi_T~Vp zXPlMb9mC6TiIghrKd4wk1A1F{hia)?ppr9smQ>X?Ul`ure zzI0LTiseu*-ea>n9@Tyqm^VZ=k9s>6weY{&AXvQ1BmRuTHp&>Nh`CJB0R3pPdDO1L zWf0cHVLXQWlI37dr)7m3h8G~;e#V$^9KTx5&I7CmD#?2AeKdPI|6EzV6GoH}iIp^xE-8q>}TAlv188tIvK#xKz*Jziovy%&&P z8g9lIzib}$6{~z4Q<(Ct#kq;YG~Vtay{q77m+y6}e0$&}z6uBQsaE6uH-sBz1fU5=hR^gpdZ)l|^@K;Q0MC^{BA~ydy;)SYJL_tv z*NXl!3U0=je2r|-cK;}NRQ}S7jVqk?^vJ<34eP_66q|j)qq5y;`0OCBiEa@YwqtQ5 zh3#sMk(KC-Un}966Ta{fkK{;^nxc`9=Q^ohrM66z4Ln2 zaUC|rj!7)PBWo2H9l<%V`rzDnt*dM{z;?pxT%PnCc+hY#;erIl-&3A(?unc0@|=dD z+zX_^agwv1QX-ch6G4vXGV~;|ee}x)&A({LLhC}vj}r6mWAHd!B>X9o z=ezySgU@?oSoq!#w| zHuR%89G3CB3pWN~OdOnwPSf*vqQ>~~+rymG>lRq{Tw{#i(Qv?{Ei$j;7M=%*|Iab( ziN@^w_Aqg9DteSx@}5 z*~;|jZqnnohbaS2WgZp34~;Q?$74M%=k_J?J=u-#c#(?@aYY{o_1UB2|Qjmd{@-G8IlC1HMcj+9OB2y^H> z_cKqP=W+ga?u>6=G0GjkX#7~qnj}HJYqs&FC1MvJGipr;_HBNX#4mnqYJ+WTIzFm< z_+5dQkbGAF`Fx-bwh2Tu&ryoUs{5IW?BDd~b)ycR?#3thVUGV`W^|J7cHe?Y6DEJ4 zc}&!|F@*Xywm{zob!=cRQxfx-IERUIm#A}t;};a)=}p+q?aE{X7aEduf4*)Pn=^WhBUafl?!Uq3_SZ0n= zFd~n?-GcN9IOctUKEwI{$w^#=!?mz|c!Ebj7%RApStk1OnU)BO^Zx`4qB%;pQ5rD^ zN6^cT|1dHQLJb_8UmVzTl>ATw$IT29&Qapj)FOXW{&=8o&r$Mq9#WA11A3_x&QUT_ zGJlfgCv%kiF(;w!*!3K9W4574iMbG8!im%fTb^%&%rSC_KR$mE%I8NKI6eg*KhnUl zlz!11rCR0_%~3iOk49hUP_MW!pYx>rXpR#9W%|(^CC*3iqd7`%)34(kr5_-hgzKM} zPn{2bhdD}qJVz7x4dfTE zbJ2jDHj%g$hYhgOfQLE1mcFnxoX8<&5Si$pv}&32ByjPH;a@x}T#& zMK~YFIZFPEDK5qGJI+z^%`BuKRYPARCQ_q#C5#x(QS#$CN{6w9<2g!~GH}N^N`A*V zN`5>?=_?Ez&r#y!cR!w^#DC0w$2m%VJV)vC%r~B+G@fESN9hl&LOe(5HTuSLlz3%hZ=Q&E8HsxD$l>UlfNk7j`$)h!%qjV<2 z#dDO_P~5{DrN5z-3j7gn>d$Phc#hI<7%!fqw1b7(!yKhoQ3<1g!*B9ZLzr4TM`c2>N`5>?sUPEZoTKE&8aRH;xE<#x`5osd`PLkz7nrd% zM`;Puw&o}`Gc{|DQWgEJIZE#_e%2f%-lQrD}mkm!d1{U*_sPfBA zzKL-^erbg|I!>ljN&+$v2S+C0Kn*zbNml<*U*=KOO^ixCrzoC5f4UN!Gflg%fTAL(l1wmy&;zrlF)6I70KLV5irV`iq|KT!*#dLVdTlJjY zB!Zy}qy}J^n|s(|a1}je?so#;*kqc6!xT z`4A;aZ!OME9H#L{c&2%x#`s+Y*-ozs>G5AW%eSX_O#MJ0^kg2>7EFklta%blzF);T z`bxwRyo+$V`&ZBTG^S56{(%E}K97m(*Ex>~QKVgV#}RBozpsG5F{XS*HfXzd&k@)q zX8BET2vh6K39zTerYn6ArBM)9`py_jCZ99MlA}|cd>Heb*p@Ub133jWV`S(zJd(ox zG!`<$n(#+v`Nt#ha2k{uJ%)%sTvgTxD0&m?3A}OJi|z)tk%!JZo$`TUn^0y8cdM%b zM2T=3K;C=YFQ#1a7)3sp=uXa&c!6S*;u=MMd()qPd5IepA69%)@kffkRBTuLqhbOb zkMR#wEKw9)4REhjnSGt%L{|gwdX+_21LTb=Kcx7yqUdUXKUeTF{+|?Ot`ua^)c_P- z4Z!2PFx)AMa}`Bb1N=o-15k7|07X{=P;@l_MOOn*7GD9AxK)_1=xPAU$}phlY5{$vgm36imnEr=xP9pt_Gm!Y5P;@l_MOOn*bTt4)R|8OVH2_6d15k7|07X{=P;@l_ zMOOn*bTt4)R|7CegzYH08X$|V2B7F_0E(^#py+A<{-=iL%ZwajpeVW;;6IEqaFn`_ zRV-KcX^JD*{}CUL4B<5ST%pY87CFw0%JMwH!62V`3>QAHqA69~a+XI;Ir1n>w1Vkg z_d*3eeoa5t^BF^zKrV??E^5%&+ zM_CpdbBc6BAy>;zgX}-Aw4bo5U}X&$4*uvw@UzWV#9V6ux*hadM7y z>i1(DDv%oWBJfwY*GL!UaWD&SagOXzzAQ*?ISHrzhNCv;A!ei(K_ilL^lZ-2i#W&A znZZ{Xk$XLyNc>tT6% z@TDS^yeA)$coq4d zB0fb8cV6*{1z5!Cc+Z5XOwWIv`9+-La>o0?a4BbH{$Q5u#ff+gc*S$_AE5N|3*raP zaSS8o448&gT}Bwl+6|;QkRtm144el)M=)}Z|9+_$&@(D4pm<_!9#byL4kR-)1r;D(0s8vd|;lpNntON$`YLo*JGLEN1Y$ zgZ>Az=eA1=75gsX>f8-@9H)GA~ublrQj}kc^sA7;QP;0u@_RFH@{iaaC#oldASo(zL7H z)M}?HSbiepsH}xcwt5^8}H+32P8&rPKO?{gFjVf<;Q`b{o zsPfaUlVBxyGfJ}!c7i()0GuNW5IN^Li6d?KAm^Y9An$_ig4FXYaEnKo&B{ra(2KBG z#8pm$Cwy>8@rLJ(GyNp#HibyY_;Hbi$?XOUHcxbqCKDxeG%@ z2WU9n0QS6pev=rJ#tHbt8RQS~%MOi8GX_Ia(JdeSHlb_mkM5x+ZBBrDP$3^KF4l$k z5htfBrDJ{ay`SD6Q&L%Lo3mGE$2tKzF8q$vEXaClEFiZv6LegCZ5GzYNpV4ky|i9v z-YU^v9xkd5SH3f%EW{5rJ#<(7Bi#4lhu9D^K9mvgS&An*W=%o6==)vHM{e~L+ zBMkM%hl&NbMBl97w-k9qcZS8lcGi0#surR`_D)~CrHJ5TtU4ZRO_sM@Sk+v!4D{`O zrSX&IOh4^ZC)dOO)^W=&S-iZa7KkPiY%*s{vApM>e}&NQI70he7355577G2xDb zgXQeJje7J%*THM}%QL|wf;7x2|NYzPy@#)8(=J4|AF&qJ#KEakh!=V(Pt=%pUI5un zFF?cde!a)eDiM;x5H^6$hfZna*%U**y?)gUX8)Kc)Ct#V;s+S@AoHPbmIK@eRdYihozkLkDKQ z2P%$KJXP^5#cD;-CyVf0io$r`P<%-7X+`R3d`$5r#a}7@NwGg(B+UPK#nTnn zDt=yZm*TsMhL20&#Y9e_KN0B+RV-%zhCAPRJzE>NY*8y#&o6Hb*9Uf|yI|6!@(f5e znC^MD+gS*_Ci$%48=E@LE1~0jzV5|c53cP?KWf|QRJ85%urIe$9q!G&dCQBkKew}G z+s=MiKj>84&|V0efE@(;82q`G(8=7S0UYG`^uW7Hx+QLes7aciLpE}cLKFovr zuQP2)6KVG>-K!;Cqi=n;JRr1=ABUGn$2Ex5v4HzCUZR+*OBBI-fr5(YGXzQ~eTL1k zG2(DRtnsApaOc#4W$@0AcsB@8eB>8|8);9*pr#-F{7~&Vd<)>K+REwM-za)0)L=P` ziMu}K9F9&iAce@J=J5Q;L1ySShY6%&K99*9Xk~)?b}x89cc9UWzB?vRHwC9|bxYNH zwr=%KD-?II&r9D5(CZy%i<~>o`EYd4A4K>EdFsQ=z9cR@XM3bVK6#OKS);5OQl5eBF0rIndIL?BMEgFj5$lvAa%%@ zGJQw^yoM905qcMQuDuJkBp9Fk21_=<)Z^RCXQIjV4f>UbQX=^S)Fe1El#)qu0l`tB zRG6%!G%1t@C9h*DlS8Q}=~J2#N<)&QU4o-SDeV*n}i#jm`pRj>2yK^peI8* zi4v*9?)M4`1C}8lAY&Twbqq|=1il#OgBYWKKn`yJTfqG#@(9zFGfnqO z`m;^qd=ZP4?87=n&kgj*S8W;JQmo5Dln4)k7gKkz>XW>%woZyA45oVPq`EX2i|-~{!}q)wtZ&0}>*9g-^!rmOGd)Liir`c)d<0dbCNkfd8hE;pJi#pWosoKqfoFS9N!;0~#~Jtx4O}T?Ur_1s znvgo2$iPdzD_frHH>X7tFaJhF1+Q%n# z_*;g*!rLzXLLIWTa|f|HzRO4Tfmb4I2^^CFmMhAmHQ~|?cW3HNCf7$UA)ePMF6a&V zx?$^+I%GcmgJW$o;2c$N@1&k(^mDbvf>d87J`WT$^Gc++C3tWi7T!}V5ryl) z`P$kuQm@eW6JDVNu1x)c^_%bAC?%OED*1y8yr)nNuQ;R*g9R$KrrOw+RVuC$h5bRb zcMy`|b2s%rOsmE_Tx3v(zh^OPC1=05%}p(!f1N}Z>hLBeSFbXt!_(;Bpfae#+4OHz z8Pwq?C@)kQ)L|c1f;Xcy+hE6QMu0?K9~K~T&U5-qvSm<*RgiZDpbp#Ea4jBXUZh)@ zf2-Fb;wq;PPx#=HP}3zds_AMHX{9n5W)j{w*(TzK;d^ze^?i?^s0 z$3qrjIOJ06y;~~%6>bh&1e~Jm9bO^<&KcUc7`oL<CzRUg9&RDqSDNQn;1F z8Xflt`RKq^>L2jtJmlvLHWCfu9w!+v@hy_UP|@T*g%ty5DY;FN+@RK-xlNJW&XU}w z*ts1a=T>2IJCy$ffN1Q5b;aQ$QT6C?2ekYWvz2jG{g#i1MYXu7yY3A;ZWmT>A`;uS%0K{mAZUqvwqlWxYcYiil+Iz|#BpB4J zS1nw!q7EHdJ68`F*I3*C|3#iPB;@}AY-`*pMBRMWZrywL@Rz4DmUx?|7^b>Zg3|As9aHPr@5sG<7(E!8JjE2SFF5+;z3dc`269=cFlks}X!JJOZ3bz_BP`*8l zG2yZ~+|8&*1uDsUVDuK%19Qzf3`mWplVCNY9iHRf@{D7Uw1o)3^@lrFo*p z_+16ruJ0J6R|q$j4^g7@vN_zZ!SmOqk_gB2Xzx}8h`AO&VJ8~_X!89k&e5k@jn|V1 zhpZ!G!hy1l`V>94AzV*5+$1_Pml328hiR~=tQYHQ`Z7+P`RFev^F)ow*T@EK_m6_Z zW!uNbl{z#<4x#>fjx|GLmyY#g&x(zorCHLKD{K3+Wnx3!khbAI;Oq}H%#$21pEJfV z_821oDf5~$>>OCpE!pAa02&y3cgIc`0XHgbg8{I;q%(VH%zJDI);qB+JoJS&m3gms z%NwIng*OI{V0hpt#bXtjKHbkyJV)`9iYpZH6)E91DBh>|Z;DSV{z&n4MgG2F`v0NG zUzC(nxP(OEyMW_WUZ~ij_-V!K6u+o=pW?qMKBf4w;;$9|L-D^A`{23Ce2WwhSDd9d zN3mA1Rq=8~{?1~2{#_$JqxhQQ?-d8*rlbGiiYF?bsmR~_^k1y_DaFq!@;4U!f28;a z#lI`co|y2L{Z4`W|HbgL6yH$%jpBbQLVdS{179RKLUFueh2j~C3ltYCUZ!}R;%$oe zD?Xz5tm4lU+ZF#)F$W!(RrSA=_XFbdIp={<#Op)kjLPLIquCt% z9FVaEkZ=;gb&~SymLrP@8_LKdVd7GGqvTpJ9%S# z0|)TVKZS#r#XD2;pz_Xx7%Inm0=EQsXU_D==AEepKzZlyB5+r{bC{i1jub53`5A~Y z@B9*_5jDL1Kn3~-Pz-tJTk&X*c;|@_ly~NSbytA}y#5>=_0!6&@N+uNX&MZss zc<1>@jlA=A#*BF911V+m&c9*CG4Fga#9r{uqgc?0cV5Wm=z@2?ftg3VbHI2J?>vrW zhttcjm{A#XEB`oy9xf z%D^%2{2m)J=AFMn-w)0niyJ73RASiEzRsad@9pBcV0?_9?sS-dmXA`9;<4}h3==42L&cb>**d*Gc* zkel$%Nfs;Sov&mvG4DK%zI))Ek412scRrutW8S%lV$3_wXW}vM%y}FZ?|c&*B<7u8 zrfp3uy|*Fm4kO)hjRNN z?>q@EHt(Edh)%roRzz_34e$I()U_MlS#tXTyz@|AhlqEUndMG1-1gZnRiI+KQnLF` z$~)^f+&`3d?zFy_-=fCwpIT3O=dlQj4hv)P&S4EB+Bp>Wf_08Qc*!DNiY23FS8lUk z@@^RCj{7a|=bwAF*7qajpFbe~7u`Qqoz@9|03Q3}%UoM)diO1f9o=61AO103F8mLp zvAI=x7I(d$avnz-JKSfmbw%xxn#Ir-ZMoIp*}RZWVGv9{aK_cOEMD9IwFl!)*vlQ# z_nvdU{eKDP{9rFQXZ{2-#+;rG2mFSP%scy-b0&wKM(X^HOlA-xYvGKS0Zkcj>X36D z&l5GqFPn27(nHSqvq&#(5(Ap_uEM!pUvk*|kIwQTN>o06{W1>!!PDFi&(~RaHT0vs zTTz{ztHBFSHiG5H&n}F*TaDNE5UwYj^J@s#6V5q-fm%;E=XvNa(@Y_(@>x!D%DNfz zQE<-vOlE?vT$85A&6OPnIsOcdUAhm4b4Ig^VV>lW$=w>m{xZr4K+2qZ%dm4`4d)yU zNFvHv2f$#Qqp@!`;T(B{b2|3(&6q!e%T1nbKi?d-!+yRwY=`}PGui$GjpNfVvE0oF0g9;t;`&x~;NqfCDf=LxKDZq@b8)kr_B>!=yl ztwtE6S%7dkOc!yg5f<@(k0x_=yKXtLyLHQ0u&nEubL<7nx%PtPym%2ZhDK(=av!r` zxv#xoIX@1|wZzGAUGzWwx@BvjGS@BZl58q8?snbsgPcRbi{g;@0s+Va%qehmMLDak zQGNmrs@_;AvYg;s2nO}WR3!`b#==S5i!{v6s?c)GrOJN#1cb}`7JU3Jc2*5z1yomI zc2EV!c2*@P=Y>0~J}YJEcRb(9d=grqMcQ5W`56y<(!?*TOrnR%%#d+w6p3FEcMGzFy&%sIsPNX?sr!G z9MUIcJQQUZP>+Mlyav9&1I2+9v1IR)I3IK@4&f5#0iR>g7m-I8RL(RgNyq^tkm95e z>lQd9xR{iexzANNV2SAuZ5f{trFe01`h-I*$Lm=2Sj+J+goT#lPaz1`&QeuaB!)|s zBQcpOW87HF@e#}}-dR& zR(+U(XW)2e)kzfNomIIO5~^dDa*kc`ycF+DXgOXDkfqAUGHGjP)iRda+FA8I z`dd4zZl~ONXVnC&W9_U;7FM(z%L5?ZS@lg8F4l7VTb5=IJFAXBZldM*n@m66S(Vco zpyhb8T(#WP%kWqXgQw5s-q8ZsWP-2Gc=bfe}c~O z&Z=u!gILQk`x>+y`_jDOQe|j4{)`lCUTOqWj(1i~vhm`bRd1tc?X1eAs=dBQDq5-x zEyo9ojHSx5-HD~;cpgh)?W}qole2bK<=g>iIerMveleCRpG<#iXVtls_q4NWBLehv zXH{xBCiMy}$7e}fgiDp7<+xTvXgTHyAGUIvLd!9`Bu57-7u^h5v>fwZg_h%=pb-ai z9tP4r0)9^7UL5(fkQi91ya}>9kheD;1@!D6@L6{7bK*W6&Tx52+&ANxcoT>!NkY@@0BI2iJt5T|X?_u698}?FFao ztTf+Ay;r`BMQ!1-V>CF1r?|GbISzDZPB>!1tg?n#v&NRqD)akXnVHeFaI6JhB+x<*!51CrSg#VMS7tZEct3LSR;4an$o6aljCKrHqp_Ta` zzDBsQW$EG?ES862?1q{pE3nXcam}iW>v4fa{Xo3gYhB9U_2^B|2yQ(tS;zdj1Tbj}9L$%f1L-(IbBXiw~rAt95hRb{# zx|$!<&D%g16vq$mP{!&rsx0qHoIed~ z8-}Ifdkuper@L@`ADTEgmGrK+9L(votZ6Yfn=M_6EzG+v*7<{?_0p5s;>Rd znLU9ai8u%m!~g>X2$0O2KtNQqBM*fn=m-JPViU+)L&$|h(TflgP^3nKXltuLe6_T- z_u{Kk#2Vk0VoQCCwoPW3O0C{vwXIbu|KD$)b!JW?D7L-*`rYq;zHjDt*53Q9{aSnN zeI9FV{M`Ji!7qR?^20N@1iuwHck{ak{6YwG4kxbXJKGJe@^PKwlunR`F>7x|?eCO)!8@40IyK|7vcL*TqsrZ%RXW_@|X9Asr@rgMxSZ3I-aNX-* zS_day*4nETt|+)_06L3|ZU)6*Ntw;;XUkhADlm&Qb+rsd>_DYy*DhdOlZ9~END8GWc&{Ve=Ml?hDEsE8y2Ydh6VD`EYnXG zoFS;62_U>wXnH_px>bS?2|g*PAC@3q?+pv2kqp!OpbUru1@+#rp!W%__l5<1Q0Tu1 z>b+qRuJ?uoW_oF=s18y0k_(0XrJ(0XrJpxzr6sP~2i>b+rsyCl8d8y2+Q z8y2Ydh6U=qVSzpfF!R-W!vgi*ut2>xEO3^@UnHpahDEsENDQd=h6U=qVS##YSfJh; z7O3}z1?s(Ffu9H;y*Dgqy*DgS?+pvod&2_t-mpNuH!M)^4GUbsr)WUEH!N_o(0XrJ z&<_f&_l5=ilF)i@SkPXdeZAfr7W8zX_1>_c_1>^Ry*DgS+Y|$}O);<-w?tZZk>wWfOA@Oea6nL@r^WCnsDQ+0^Vtl`=@UGQst>qIB4B_@Jzr3T>?|ZHG zn4#m>#eLSg_@D7U_Rs~nznk~#IZ^I4YZHeD93>eMVE%=RYSp zD5W(XnA952#4ii{eg4+Cx4pf~sK+m`Kc3nIG>mu5z{lV@H#W+c+y9dzM+W;Mmvmyy zlIo3I7tb8E1w6LI%|LTB#cF|h`rMe&be-nwtG_OqIjS{&w_)tbf^TldlP~ikKhui| zwWB?j-9frD#(V-eAB0~f>Kc0Hh4_&+Pt?ieac2yiXvdbH2@9Nju8Z`^sW8U`G&dkW|@vPF@gzl| z`p`3bx-0|VHK6}qwu4~Jza}tw8kU&l^3_hYs*{X3lFr$OP_9y&jRZ4!?J`i z#-PT1?(&5@`A&0hSwAn*&G`+=^k!@H&;^ej9C{?w zb>Yy~DC_6*uZ{Ml?|AV28|pV_HOdINor`g43jfhK&&IbH{y=jqJJ1@>MtK9s z+q>?;IPHZtOhFj)O-24}FAL++3{=OD7H8r*ek)=a3u1pba%7{4`u8#B$KJ)cWv!2z zR&{({ur=zjsyi2!PLE=J_0GL{?OoRnZRz^X@b<3WR!Y0?pCd<74eRx|h5A^i?OQ zXo_V+KafYj=ohQvb>Pw4YW_?=ux@z6w~PI82d<~AF|A>3j(gEIZ07*_BnSOE87{31 zs|>ov?qljIuhkOE2L0BjkcYPY2gVr}$KFSN7W7dcTnkx@VW@2M4qw;V9Js!dX`DDK zJT3askt5$Wtj?G+in~;}{r=2wYy4;6Mc(5@KAs^BKA*=Ufa@MZI@X!jHc8w4$Q5Qv z*!>6#P5PCVIiyVqSS_9d><3);eWpkKXPmlCxA_3H{{xVxW63e|OUkH;)&9Jg2W{!` zukDAv%b1Ba#a70#8__0?yzjW>g?J%k81e=A|5bcY1iIf?(A6u_ekZRtBkND%+=%fI z_h8=gfM&n0GyKtX^y{w>7eKydxS|tZqsHFAQr!=Hf`~TrTAW|D=()!ax#Qf!d92}# zZE=okJqIC;Grs-d8G0V#xQ1-+Kk3sWzvnpTm}l7AXdAy}k5TBP4CQa{hp}@ibVyeg z%0+!*z;o7nXgkBO^;Ib4g}AqA^8q}O&~x+Q>$j!!Ds5L!g4aB>2kMu~`uY8t(Nowq z7$+QqKJfFQ{qmb^eU=HDPuq-{F`(*)^u!Ye|-sV_T2qw(etDuUWCKWO?7icpi$nxW{uE>O|fLj~v24z|gSxd(A8DVDKDFD2d3j5_uXlSLW4(JX+JUm=g=_`U4gtucA-Zgwv;!WS zeXcIsKI!;$*>4Vaulrt56X(uj+no?)qM|mQYZZwyx4Bkfm$CM z^Rd2YYB!Ch9h8$S$mt5`YQ5i1xIJd~!Q5EpOzE4$M^Zh0tPOBI$20frId~Z31GER@ za|Lx1eJ^DS&8`SNTIo)4an-%EwM@!Uq44GSk{&&mu?NauQC_815WuiQ? z|1N=C1Omug`eFgDWm{c=`p>xKpDUAB_2`#M>6b4flffQ!E0?;>125K#bsDAT-?_0{ z{sz5=`ohy;4C}{}xYp|3wBe-J@?Xekh5jkuye)nv(z@F!BK*GM;uqkThASqc^bm0OO60=J*tm-!RGuot^@no&p{o z#HZ{<8&S_6B43o7b)p`>RQNLQiLSg^4|o25ByTAr^#*zMEF;H{GnaVLhFoLq$a*23 zgLa&P{&Ch5e>r?a-ydayAIBcYb7tw5lyCp-h+ZogrPZA#)?~Q;iCd*DSts6SB>1Ba zyl-b6c34k#{q>XXc{9&($TN{1!9@)%OD(H|Y5<6MfBkV9oa+)-?~~S;WJ@d*4Jk-Q~Fg*W(UaJDVq3`0?2kpL75J z@A3Zy`-qK3LuUr{hG#upx_!akVZ2CoAWLz3f(yu}``D9>PacQM4rD@(z?NhD&R@up z$sNd;I4enFf5&7}!x-&Fc4=w65*|FW!6XxpNwZUJGl7(TSPYE?p;?m{Hw5YP`u8(W z0x>?t$it|}NrTA->D+wK%rBURRP<*V>fQu_G>Br-1OYawQVYGE+yp6@CMHUeHIc8) zHBiDy$%=d>eJbDH48-F;tmJWcQ35D_DZMG) z*KrODh3|Qj779LGQLHIAwY!j{ZK1&DfZkErh)MS1kzXa5dSc{Aql{qY@ShzaW={g+eZ=goVOWx z777?xhDur}@ST|Y0to{Efi?&ppq5}y)YZAq=fp-z6@6`3k7Z5=dw_^kL+9)3b(POE(?Vc#=9&O z>PUZ{g~A#nI9>|{1q+1*l&z$N0v_BM>dRUvKvYlRSVcE!3x!8n>HjSYg%PM=$}6}z z#QcV``^J9^v4^q3ZxLelN}=bGl$qMbQay#v@Jyh2gW^XPeX@VVtIo%tuZAWLCtQr@ zw0Q4?1{;+2JW}*Ng&|y`yiIEG0VJXk<%!-Bgr9oCH}O9m>C<~>rhNl!dJka;(_e=w z_Z~VNVMw2rgF^HkW>eg5&_XKj)d=)?z1nA@*PFw#dow>kOcf%`{U($12;*m7I;0Zj z5w9`Yj0|an2Rie$zmg~(if?NT^G&8UBjC-gq)+sg;(ypjSOl7vpycL8Q?nzh0ayf@ zmj?JXin-pTeTHX~HJseno0|Ps1Jh6zP!xQ#csNZo)|;ci(6cFLgx(15>n80q%u7a; zRU76FnzecH2-s}2+ULb1mL|^Uk0=9!8|^C=j?@?4WU`&ii$;D2&1AOei#(gMv!=5W zn{?7q=NsnDIwETdi?dmuk62!Tedz9x3$jLDz*=k(GB9!wOSM(V%#mFrx0$quQJeld zbtJvcn>$QeBK4ZT*}Gt~cQiMAHqHCZF&9k7`g6>TnbQq(%&eK%a?}|4Df7MG9Kj@W zM}~Rv1HyaINPfX(KB!4^{>ZO0r-y86!N^A$_pq*pXVZWYy0;!N*(GYzZK)$_mR(_( zJ5BbE+Vpy#5!?dI{IQAcqe1WJGh*3F!`x*K(&Y9&BWb*5J}%t+BhO_yo-?N)It2xU z@Apki@Kf_F9m2cVY;9b)*ZVYdW%jR_evfwszWmC*lr^gKEW!oZ&$7sSJmoyUlg)UF zH-Mn*x0$}bmrXggx&lQ>_wucB_NmNeftQ|W#@&gcPeXR;;Mb1d_<114e~o|D{9A#) z949jO8c=3&?goI`^t>;3vwebs2A>Bb9wX{k80I4i?=c}{Q$}1#k=dzsAfabdz7gy~ zvVfE9QxB7=O&!SNHdOa%{6--Chf2#<1mlQJ$uXv_n0gyNwq?R9YK-B_cGITeV`I`7 zQKvuA7{GY_7utriKd^QFXm_slOA_yK*yM4{yvHGvrw7G*94~nsE$?x#OwgkG!Eh9N zVw7$AAxGu}-PwO4Tf@itZNy1_3;vEM4BHm8_k;2}95mF!&o0xf&WWf4*SxB(Do|GitWiIl296E7wv3f~aw>RhZYJUWWC)Sy-*QuGxx2RiT^-cZbTYiR$Wte5?9;w1;*1*oieE zbwY5?6D_`TLTc^mO6A|08(P0jrTH3Elc#bVOxaZP8sEYy)wS9eD6(du9_Oq3&8_RP zHD+FDd?-hKu(}|3PLBE&OpJ3f3Vm63U8eFp)u!*ORi4s}c2qm3D5nU`_Q;xos-oPG zXY|SB8p4YHGP6a!ZM>@bpcUh*UsVGOaznEV3v(>>(lrHYqv@N9cKxkU;9I4xUE>Q> zsirl%7~F=2eA{SN>ro`MLfovZt)4j6$_<6o?Z`y^1w1#c*@`q<)n?#Bo>$e6SM5^2 zFq?gsst-)G`hUK9?YIjnRJ*4@ZT(N*RG8>h=XhwM7wB)+S;-1xO1jWpE2`X#!;oa?E(2cpmT(A zGNZ5WMsuAfv3C-~UdHS+qi@!XzAvZF==*x=jpo-q8`bsR4Jp_4y0-UvAGa?_*bPz< zTAEMNZZH?L9z({d(3?k)yxZ1Fk3y{`wpv0``{A#B0mh;n&f_tXSy&_RW2|>kFlJZ_ zY{$Q7G!`S5&i)&Y0ZD2AfSzK3Ey$qjnJNruhgQkdB zfs}C7QBu34(l*wsp9EX3rAuI9b!8b$t-#+{Szc3xz$?odmMvW(VcPy^MMW7jT3uB@ z|M8I_oKV(Plm~2kuH)Upbj9U0^>*fE%a&bUQ(>@F%PUsYz~rlBMHTJG5*c)JO;%aE zm<6j@QBt;YF$zdCv=aLRc-o__Xsm50x!fpU*0`h=CTL|>H0V85#dh)Pisj4T`w?|r zp)0#WYNqus`vHwmTTv&W_C}^9n!&$=RpXU4bkiO$E(lxn?)_q9A&16?-!7Ew8JBE@Hd#BoD#~|JbN=htRjg0Fsh$^?Zl;{9+ZWh#{v&3bFnvTrEva2xcR2>FQ=>BIr>bSkuQE#P zja9YsL^s!Pz@vATHKH-K1|bELQc-wiY~`HP(qExvO_qd;29E~gGS&P`j(m(^7m zm5VR0FzS}+cCeKXO7$O&i>bvZnExk?HJ53X6I`w_2R zi3lTIk&_5WevH3L5TK76kgmZYfK11u5kGhN4utKsAIryerc*xNMLT7{DHf=xvp%u^ zoVaU2y7>(_Cs|)Mx5JO`fShZ{ArJflJdwkR`!;AdzfADM;|Sd!M2FuGaqe7$Q{zJL z<2MJ+;l$}DM+l_c@VFl7`mtl>U^@Pu6_jA(+rgvr)9)v-Qgzb3h;&08!o`CtSeJMh zhmh_!M@h%L9T{NsPJ9^ChJZmh=le(2m-S|wxcSYR+}$?XsV|asJKW*_N;}dpO5s7v zV%WJ3cWGFk)Wkgq>&Q=9hXZ-;(5{P-KFt`1fQAGcoB!*H1~hg2;l%BO9naeh`>^A~ zF4~D9etA3A1S8Ex8TdZIbtrAQl?+g54c=Ed2kYpTS<K!Rg|P#Y<{R8f(jIu2{MZafvl2R_jQ3<%)_1xY4MrtZiJu zWz~wBx*FU^HSpdeVY$1sVkwgG77Vv4xCg_Paznx;co}bCuo^@#5|&lF*R}5ZC8!J| z6N8a*=Yg!P6kH|PB)Cp+gP^v9Mfx_OZxQ4xDDt^OuwC#T!R>~ z!qey_;=?YV(CLDH37-laf^t)jd$R3ynkU6xzj#na>LvCopOXw((79;of>fu)j8+t-8E_Vqw* zUk}vw^+0W34}4eBYx{c8+P)q*5OT`=w0%8rpU~RA9<;Wv2mVFEdqHNHUfb6LvxL_6 z^`NH-t?lbUmkO=z>p^S#dZ4zi2WtCz;149-Ew((79(YLN|0byS>_)gBdWC#W6&x)%N$@PeLct2brGoz{c)j3O!FvVo6MRJQNg`zX zS-}+ODCXafi0}--ObMSNc#Gg&g7*tPCm0ocUl7Y&&DSsZ6~Q@ziv%wdTq*dh;46YK z?A3boZJ|FD`maLshL7b=A)+4XLiZDTkkCVf&Jud8(3a4Xgytu*{=XEAOE?`1@wyWP+o%tbPR|cm zvg`Q)bPn}0Xp0DXk&`O@yO%+*b-*5y?~J0YTzxyV_v{3uWLDEM#~#yk1|JDqs&qE3Sd8D)?XL%gkduz zJVt>>*cfQr%yirue||S*{4FiZlw-8ldA_J+ z|9zAL_Uc+LbC56BzY+ZQLJ>sJ<}62PCj1Y;e#wvVH6Q@LB(8G30oz07 z56bKV7MsRkFR+|8(Xj2I{gY$spNVqrD1EByFR)p{Sd3T0Cd$NW1a@@FTYp{uQ^0G( zncJXC+G8VDUuTyIx`n!i_G8tE)3!@!r*fRr)(&;(pNjOl{F3$?NE=2xZ2#Yxaw_-* zVAs1!_(^*`h&Yy^)+qz@5!(ayrtkQePY<4JCA|k}{(v-n@~-b}vDS5xht)Pc`i|7e zkNCIsc_;K_Yr@}!yFW_NAGF6Z;lp4wY_4c;rFOJ;joC4~c}!b-3+?&SQJ2ZrTo=o3 zZ;hg$@EriT4ZjGV1v8>^a1H&i96%qg!`zaMb%BFC--obUKIgXsar`muv3~W4KicnD z>Ay_)%UDl+QTn6h&9E=J?s(#vKik-7>r`gP!07v!4=BSI^Fd%I+WE&E$G?WG!EcJp zN9pzOBZPFeez?)r4{aCg@tl~OU=NC6no9k0bB}SI-bvpB{j@)h-lf-ePS!GFmw|b2 z=XKB_)E^6mwMJE7ZKto_Ts>wncf|@nmAMc)MC+!{$vaKw{aHTn1v1z$E{efUF_mS= zkTRHU^nWri+JG|n>jy?LZc~)M-Sqm`dW`nXDVcuUX|&Tn%EhqbZH==$XI-vEVwLZS!E2u}ub)6>s8E8G~xBVSh=M=>;)}k4GZGDpQ^VTSB zv{RvDV22MMBG6G7^VDCoC;SC@W1P-L`};(X8UBqaKI#^E~0(oAovb|9`<1ElJW}d2R-QnW4N79Wxgi-m%v|B7sPBZ{akofJr^5* zahL+#VTSh{(0va(Y4Y)+eyHy=u*ZMWu+~4b4sC9tPX-__6Fk2QJ!pn6i7$j6#~P#m zV{F^N!07iRuk;So*ILq<4jXob@;`vGxOK!n=m_=|@h0?>)}^dF{ieV!8+{TtN}r0~ zgXRO^cVA5WYXWtt?}L+EuEBMhfnYD zy3RgrRh=K`G8D&_QT9;A>uGP4T8xVwBI3U&<}* zg0VKm{DQVJZjEO@40-L`hc>(&bM3F+&T4Nx$p~DG@zmb`&f!mDUWD%~$Pd=MsXo~1 z8`d3KwnMBx+KJry@btm`_RwSfV-wz{V4`S{Do^(i9P_;xe}w+5-~Gqwkwuq688 z6UzM2<-E(0bIj#>Eu+^Fs2}UrvtE0SF$N54V@iLQ3_*8j8TudUhQOXU$0hvCLVqvbWt?(^$8@&d#hUC`as-v0kfSLHIqJTy z;ynUoCeCz);6L$%F|rGtNB9zcI`F6fK=)3rRUf9C2>yRXBq zKweiOU#)WkHJyE+cO4zl2RfHJ)9EVaab_<=u%K z97}%eHTVPYP3|@LAgK|>$dYDq3N|f<>@|1~`Z=-JAbQY{y#~+JWzm-W&{le{!S`7o zwQl0V9PCfc06X&!P; zSn|Kg!cTH?or5YS_Zs{)xOq;q;|8R0*R|wcgKsnC>2_RZ+N0#s-I5;<9gkzL!9Kh& zX~};nF8ZRq25Hl&_ZrkKo3P}!SiFnu0(sMZK}HEnewM}ar7Zd1M<(2B@Gu)PVafkf z^66>G{|qxuTJmGX^kw!MTtJoyOa9B)9NjGWlY0$*gGKq_a4jE$(#G?;geAXrf03}{ ze~tZ?u;hP*JQJ4uIgIOO$$xx%4gQ(=CM@}XNS@s+`ICDM>NkErwaZzQrr(q9v8hPf zT;`sz2y-7WcDdks$EwMk3ld(xl{%^3Ela~A|m~YaOA2*!t zy$1FB-=rn~L|&V;CI3Q}CTYq4EHC>aOMVY5`G3#mN?P*&H`ydD`3JJlpJT~? z8Iy}8KQ^(;xRmLWmi&jwJZZ^)JyRzw`JZLtq$NM@OrWPc!`W^lXJz04f#KR~a1O6c zTJr0iEW2CsyY?FVF?l2{`8Sf4%aZ>Z@^V@7XEEMo$^R%z;=Tai1v0Y`G1X;fhGTg zsDNY1&uve8*_Qkd{cq)ti z17BotFR_9TXdC-proLc)=6ci>aeO^w&K*L#-dxTT@rPIb|+t>oQLsG;?i0UuG?dbxPm9F)%NucJJh1`T@+ zEnyC@Q!W^GFR2WP91yscFR(4_6KXHym^WIf1ypLM@v*fOR&#V%B2*qLZZ zbFgV!QSb8%^RUR7ribsXH~ELb@04Kn)>znrtH8;j2@;-JCvCW zw+lXR=n4=c%xqkSy&P*mj5LFq7+zTmD$C3VHN3VQ=cCMXc+S(&=J_}s$`oVFuj=$e zYe|hY`2yaYJM3&0KG$3YDg~!lsq+gR^9An?p5rMN8rpmsbr?~@@EUV3!`HErKlScL z(1`Cde6LPFa@pmExj`L9_l)3&HD;?m&$C6TRn=7zx4$g5NlJuR#-$m}n=)zwb(f^Vg>Zl;0RYZUd?iF!mStGt((4 zN3^_g0Ik%6Xj}zDKc-2%Sv;Ob@gLhGXuKXJAL{|MU_1xV$D>dw^CDxcAMIhLvx`2^ z+{kIW=B63^!DcW{55YgU82mvqm}iW=kPI#(gWqWeyqGsd=B1iJTr)svmcm^`Tr-%j zOAyx#78p4NxHhpTXfAKk`;5`)%-jNWda7RFo2EhEVID(&!}fo5x6otkJNgBC)rr|X z4Qp5E&q=hMyki^>kw_TF<6I2lah5QXha_sdI@rLYiE*0Pb<{D9M{rrgRrM8#6ty)= z>~m-Wu!4Tt=rL7lP+bw^|B#@%IH>v+sAa*B8WWt5PeXTWKdiOyPz}2@rEZ3e`^PH_ ztitgsEm-9F*gU1E9oE*rH7X~ly+&{;tk-{3WsT3Zawn+ttuSeSbwVgtofuU0LG=eC zs2)mrRsHO$trJ2yAvF|P7Qp7a5mxK4Q7{KwRrMuB>I zbwOcKs9l{JR7-*r)Zn1139c&)c1yvSs3|kQK5nn^UN6^EB@cb#I;sS^rRUV&9LPT-e*^ zsJqt`RKsh+I<<98hu_HUv#KR|6>0se3eWbQ?r>_EUi z1H^yh1@Uia{QqVVbFi3GJjXf>L1r1y3iiyh+6e zdFjRp_>AmCsBkR&@pIebXLIDpK`jou`&oUP;Ar9~Huv}jOCL-Z!P$(y17>kA-|IZr zs`cJ=DSYb1gZkS7&gh%8$#<@$YF?z{1|%;Nw;qA#m{BFbVA^iM! zgF6e@4#rR8$4Pq?eupse79n$f08olzI!6c2y?C6*YpU^c4yK=i^iDo*{`?rBCx7R< zsfc5|bDb0ZkN6b$j0b_b#Vc&{WTUpGpP5%>?&Dwamn=b*Z zduqX|yGMa9?@ORWEBq2|bABwp0*O9{FjN{P%j!xhR@T5}!g4wZ5Z3~T(&oUf8t5|D zEUj-`USab;id%ssYumCn=~keouD-FMq;hdhEv`p4-JJ{^r*{EZ{alTUE9+2D+m0I3 z9^H49OslEV<*Qn}bm?LphcnnE+vYz;Sy?4*?Hdr}6cGcYdv~C*tCyf;waZr61*Bz> z?z`^kmgi5wzS!EMK%KTnclj9j``rqBjz0m{m_?zr1^dyR3VeAF0*h;FOSDn8+m%2M z-vPAAudG>VZz~LW`5f;7i>nsHb{r;FY`UJV1nQPt)j&rQpJ)1yJ(J6-6H=0BciT@! zva#Vhp|ZiKgTIgRqk02Ci`k9<9CLpy#xztH4*-qWX1K0O|8dM6k2iqiR?dIla!;?- zLdmt>ac&6B*6!v%;PbbFcDoLszmQ{W16`{X#Nu+=;LR^WQ^5Ma0xQUd3bMy=scl%y zu^@XgC*232u^7t28`>YqaeEZ7-BSGXdM40-PsX|iALgBmAlxkSF6F2`0;b5jIOj^Hf!98I z_JJQ(mAZUf4Lba`;@r6gr^aL8x05GwIC1xZ<~ikoN8=bQJ<)H@!8raN5p=>Uav?Jg z;fm|Pxx$LliQ0m6LmdL>fM{G_+1F96=_bmC_pwyi!NJ32JuS0*ZM z$J4&S9nbeU4o&{N9dT%0e<*PqVPDT%0eAd8E}GZ#-pUo}V40P0U3yjP@c{aBmS|12gSGdc(9GaLd)`kWqgQ4e~451RLs z&cW-KI0TUN(jN3xJ?M2k=o@>`xA&mG3);C4X8j)Q5&tM?=RTP6&-I9Z3AA%B%y`#> zGg+g;zd+Vv@hsq4=VR5k97|ZX9nE?k_ zbVvmM0u9TsMy3k_*PWFPZq&hc3Z1~UG_o&*i$6wmFNyYBfO0sY-F6vI1m1$W(nh-z z$kz)81P=T@Suv)NIuwJl1aHZfX!6w0Vf*S;H5Ns2?MesJkI|SPW?-ATC zc%R@7!G{EQ3hox{5ahhZcGcfH0GotfC%6O1@$SVUfIb<*nCD3A?-!8%HqgBO4#9Ro zeig>>?Sl6S?ht%PaHrsI!4AQv1)mq(E4WYaWx>}4-xBN;JRo>b@LfT!yI8Id1wRrz zEXaj40+39b{|Ab5jdo8T>iw+Y@M*e-aF;C8|L z1a}BNB)C&>w_u0h(}K?n7UPB_Gk`@eaX4%{u^6Qs-X_>7n1kgI)6F6xT`h40)~Q6K zpMl4>^Z{~!2%5_!Vh%COek@G7O~M!Au`PXrOu;gW;Twp&UXbfL&uGXKaSVJZ5VPUi zg2;su7A$z6Z}@?k<4_*p5G<eTx9KZxNvOEdtcOMS$A32vGYL0czhOKBOQt$m9CwQmui_ALU`zD0oAw+K-C76EGC zBEWZrkM=DBTKg6OYTqJ2?OOz>eTx9KZxNvOEdtcOMS$A32(SfXjpf$9MSyn;t$mAt zeoAQVTLg4WXzg1BbUwyDuh+gsfZDeRQ2Q1E#wA|+76Gk&ivYE65uo-h0@S`mfZDeR zFc12Ue9sY_Lxdi?ky0d)-fY1s7)h3%lWUxMA8q2t%Zeb%}-?R@B8Wa+Qx zMAKofWA1>h5O^$ty;iAV+X9zrdpg(-!JeOXd$cv33R|mLi08iPw8O*<8>9W0h3mLy zEYxXgX=F=$inigJ7kd-*?#P?41luP%l?TncQ1$+sBw zAiwn9c$gJ#k1Y&?j&#PDPXy;v@GFY6#$P-4h4_&+GitVPj0WIaU?J*4KLNGyfzk;< zp%00K9|<{k!W`s!nQKJS)ZIC9J^p#Ho!$pn9{T^Z)&PqPar{b9tV z8IEmU1ajEfAJ54KQ`Q{0s(~zgYP|^=nHT#>`|BM4pLdqVKM~sWZ0pYqT$( z74=2dM|Zcc@5+Q-VrJ>>@vQpW<2yTBqlH^xPv3<2&hw+*KzrBDj`dw;A!HshS_+%J zMUa_3uw#3AMr(X0etXMX<1aTrW)HN+pMM%Qpg`Mp5akPFd>Y2CKJGGyJNqw%O}@`) zite=9y298m8vE_`!~VbhvHvgj(`xT}1U@ayH({f9fjyQl$2eiVIYvJH)ZW{-7i@^D zR@?hy7hzndNFD*4FT@!3``5-6`di}*VV4+yFCcu;pSmavTW)I|Z2zA^T{a)|VP9yD zeKTN>_17l95HCU+cwvey?AUTIWxlCn@7)VKTJN0#p1rW&HFN^}7|>4v{G6c7RX1Y% zqOHB~^D_<)hE3Ra<5_F!Rm#{yTW>7yQ{TECepH+`C~fb;*n5Y28?(&RF{#L(ZD!HF zGf*8rTAYdNj0ng6g4iF99NB21-}@NzW3XA@Xj$uF7g`-(igscf;k>iFbb1u}=AC=< z+PkhD+S2u%;k12BiF&|?wvra=-YbCpyKx=t4hJtpznbU^+AkXx{EeVa++Q4fnGeSA zsBQWu)c06z%5vh9(OqoY@9}!bj^AjCEi}+4Xv+ZnRP5*V=%3#3iQx1J^{&$|-@((DKtiuk2uL#In zYkWJxUYqTjKeC z)HS@glVhtt{8;#bpTLHmJ}|r%<|fQnoVWbgGo16*j>+5N9QVEHF9Gq+`1glrMD_fL zIgE1|$&7k#h8(FXJ_ z;^m&>7NM)I+vtb90G1Aoe4rIFs{bm{wgh8JnKiIWn1-c-%5@jME(|@h@ zx4`^zjMlit`bqn+T;y3DXpMTYwqg1l@T2|n$_UDWIx@Z&_+uaA!8uJRH{_w0_59oL zU-S;g>gSD9u1kIe8*=s!$4FCTeQY6kzRED<#jvpGoL?f0x?R^T(yp+UNr4_nJrC_# zWnA1J^VHy?4z}B(nAw4N^cD3K{pmnQWni48Ku?{7vF4$!QfRk9m_x#-#~@?TRx811Z(_Jhz((R9Q+ak7NaGyD;Wy zYG13G+BYeTzoBdg)T0*R9KU|dIUKtf-ziv|r33=a3i>YPTc{u9Nb4EMVQv3y@Egz) z^*{#DZ!r(_jt4TbvJHMj{Lr5k>WB6V%NU4E7rlb8-@zY&o%JY4m%6+dx6Fri{|$JeZZRX$h_K&AIR{YQ#~|DrPL6e4)A{@~_}IdD zHxSOT&av&RQK5TY!7^%pxB36D%>R%>j(O@Qrl(%I7yXI3S?iPCC&Lefe{CoA%F-a$ zJT1}Q$fq~j(FnNK!dP#AAF|zqx%2^CuXSCxQtPP@^%L~eSs zddt1mW;v<9w9djh{8%~*bL{@TsE1o;y@)m^Z_KrO*hX%?Y$u1OyM3@s?AA7qNZULP zUe4M`&+F;^WA{V8y`|mx_5xqt7dY+C`vSHl7BPD`ro7O3XoJ)U#zj8HQ+l{mx63$b z7re_)v_nt*eaJd~{e69pwzx^!0($(YZE;I@n=UhD#+eH+mbbt5noQInA{rw31q$j{a+6qs*Jf^9^AKZ4B*R(*qP`vx89;Iq0XZ0%|gHGvDv|~Wy=fR zckUq{Gdw-Y_0D){cNop@-|$b?BfCE7u17llc6@pSz7(KA zHNR@waMB9QOYcC&U%zl$d_VNITjsVPPtNxf&@S{1=8pS@#BD`693Av~T(8>$?e0Mv znAYnDf|wIH20R!G{YHJcG0+8l?aZks1-s9w>oAV%ImWGXqIzA4zTXWQK!0`Oehu@$ zG>j|sKlENgm!kjg0?(;o$O&``(^FEwuKsk9I`Bk(@J^BFW zUC=|jyhe9DZ8-YhU1rGIeJ+{xgv&Z9Yp02B{x9&%jBJZzU59>79>q9ah~FaoO7Wv^ z`e)5)1AEBgkmHoaL_eTTJ?Au!$Wy9Ip13xlU(WgPb#%1({@uVZ@WK5##wq7|JZrP% zPsZaq8ILcbt$Y{$bM@e>A9o**Z$U1OHLn|3BRF%ryA9wMtecL10z5h1ehOaBn3{+2 z`!ve_UC5tve{u!%9@l_+ErvB9*J954@0m}K4sm|m`{3IqJ6)LVgLIhBoOHbZew1k= z_B~I5lUBE7lIJtaAlr~(_t^iYlyjS_obXks*QH)V@-mWn&Byh;Pc`v;=C9E4iN3_x zQy8zD52;&qKSK5&1}`thpnGkEID2g*W5dzGZ(%$q_??_w3;IT)zfqS4w1qRjLf>^J z+8^t|r*UmP*797ddje&hUdWJpex~lg9F2T0OzHw$w?pnb!qBDYhZMAJ3g#UT*3BvR zLsznI4sosQZ;7(~7GWL!5Zk(gZJimrP1?HH4_$zMVVm(ehv9FIulX41pd*gPd%f`1 z>u~Va>u~U%CH)x29JWz-yVvUMYs$!1kj~wYqof~mUHy0(N*U5! zWf+SxxYx!{BR|f=&KTl&DncJP>jEdwrKtPitYPuP`6wUmvF=4#kG4J-lrij>>w~{S zCMYw!&%oMXFy}M}TqkPtxjdeSpo0S@E2aB5cylZV#b+#)n>NOK-u}wG?=NP*lMovrb7 z2KsDSr#R1c z9ob}hJTK~3jeBb^{K8`X8)pVuqLv@)SFA%#|1_?Vy6_A|%R2n=ok89K=m=$%b{f{& zxbqCdXln0j!1FH5`GbMbAN6>SY3xTE#67s@scLI~31eYD%RaNMy?+IK@^UR*NnL4# zA&-$5?%N;4bI!Z*yua(z_gWvo?=GXG^nssFe&J#K?oI8y@d5nq>Vx|xtQB8sK>eTp z#tT?){rqJ<8&iQB@c96qAq9T^^4ZAiBdm9C&3vkJZ>YU%`tT*4o_@`pYyCx?7W%3W zbh`)nnEp~egWhA|Ik0J!Vq6t>;lA_RrnT*YMdKWm5Yj zlxK7+(T_&hmUBM8WFCB`%IAwmz?X7@e%j|LZF$iwUHjw<;6wdHeK;1fhp`pgjkWO> zrp0~>e3y`oXK3)_oT0+&{J5VQyf0v{+k1|O><*^8BLnXxJlTHuhz_r#jHd*V$350f zc-FT0U@qn@6&cm(Egjuy1fGcZMI6h7_b&U3L@%?<)YE((X5v}ZJt%)sgyVXBr&-z( zZO1k4_NkWk`32G~L%H2;Sr6Ko(=eVA_e+=q)s5r}S@M*wjecF10}JZp(NtAgS;;lF zo;%^YlxWurDc-am@yRjsZI|S+T#7ku`#mEDXP#R?EBt%;IpqY7|WPmK@DVbP=@{MShxl_GWS)toL@(Px=J`ko z2bl+v3=T3=P(8;%=1j119AtV&^nQb6;2fmuJ(s7)aFA(V#}GEnSPuOQe)GuVXWIh zrW$Ya_on?B3?0gs=D`IHm7ca7^>rxiAXDYcM386X0Qd^(L|(r6AhB$<-T&aDSIln) z9du@?ytG#lt|kn}KkHG)B22U?Z(3iZQ~5UKOKU|<)FhiqPrDC|uOL9Y&Yu<_b(&2L zz`y}D#ij?^Zc~|Q=aS3O9Av8LX?R~{s2O8XGL{8|p=Od&Bb&^$HZn~*$h^!1 zS-@JUk?TB$?{uWw3rf2<8fN&LKtGI9wV7(Z-LeS>nXj=x7uf~!ru~tOx;e;HU&=uy z{iyj=MH;_#RS5@~?~>~2Aaf?GkaUpw7_MBTzSFm)-ca9t&aQP|nC7VMQntP&R~qVj zHsMPvBg=$?%s-GgFI*J!a=%^)11sr|KtmnWun4p&z&No2uQas)U2gDeUiV4l>oVHkTP`70mCa z_H{*R_p+P`2bp+fWvGOM%-@qrI>=myN*srS%u?|G_i~W=DGF|Q)e9LHv+79)nToCC zxWM#g{E4v+>C5o3_70hz@glphyMs*i70)er0f#Z4!EbR@(n021Oq_I(xrZH|bddQj zW0MXtf60uJ4l~7gG_t~Vknn`%yY@Dhl5P@SqGWgYq2t42iuby!QyXdi*(i7%+RVe z=^*n)=9_eoxtgu;MGi6*9AsX}woN+7{4?1k9c13c*w1m0c`uSX4l)%SWYXiXN;=4F zA(?cL`81g)9b{g}7D+nD9K_h9gUoL-_NyMHWgwDqHDi+wGM{1nx;w~JU-SG3ZSEOa zpYc4~KItGcgRDwDsbEFDn?c(l<#Leu-z=ufLFP;B8kd922g%OmAafVvT@ErU8DFV$ zS0i_u8I7br&q3z3NZ{-3!-i5x7kO}rG|o*AGzQKEeMrGUCS3rlq=U>HmjBB-$b_h# z!m)~OdI{}u%Gqp`e}RL{Hk94xILQ1nDsJ{te?bGLojC_Y%Fl4>_{!{sq#oN>=3!K^ zkL@dSJ{wE>$~=KaGRsj1U++O_X-M4r6oznS9Y<>L0W=uhd7tRL4B@Aqa2NjXLHhLG znQ2?VruPtrFnua&-+SnAgdu&}R1~83Fq`t>YPxvxZbYEZ>wN{By)0#7&D?L2<`KrvymVM4Tn)a) zXfrabv1S>F(@7Ku=p4j+ld0jH@kB2@V4mo`9RI^_?u)QZ#(300dqjge%(-qifRI^ydnHYmO5D;`NFhwDxHb5xt&GP1P$!LQp6GB3$0t2WFV zbXm=dv)~Q1)jluIf-6ZmpPy9*4ma9YEF8rxjm?`(Hm`ZnsIh2WvrS*5Hob0)p3Zt~ z(rL$>Z`sD)Qed^j>4s91K}=n@I4rIO*35;5#~8Jcx!rI63AvkdN9`uF2PCg4 zqxc@*d{D^zQSHq7Ax)YKMm@>Mhjpzzo2)D?L64Xe6SZmQ30XDEt}x7<=3Tm6AEjq$ z|ENDUAJFt|saeZb8s;wZDNVMej^cM#=HtRGXVjA{$a7{4(J5$6G!y;Wnm;uU>JUCy z7$0Xd@AYP*rsGRl>pkAvhT!}=46pR8!v*6fkk1~^4Ltu1i+_r@6g3`y8PoUovi3RE z6(~x&mme9AAJ1GCczOSk+lV{J_mEva_;unJ{1im6&x!c!&%dGg3ptTiHYl^$ng~#v zcJ#5%wokw>??y1{y;#9(-;4DD?Lb5Jqz}Kv=5h7MKKy7M5+Za9y2uG6E zTD=S(1%xV4)0meiA&j5gg4B3n?0d<50cgs|We$TAjRB0;f2S3o+*2qFf3#(G$^a7Y zWuv1{r*?Xe%IS2iecq#HI-PpyJ*uTMv`YA3II=vmf}-*vmEaj#hW|vihL4@I5huD_ z*umjM?_z`u=!R!|TsXv778{I$b_3h2=QAVkJ_Zmcm9kYXV!+J|Bb7sXE0N)Yv{7 zeLfPIXQhyz;aiXYL>G@ShQA8h{1%J9+MY!?gYZ#=d8wW?uC`~5`Sz@FwLNPr(6h$X zde$)Kjs6ez${JlrBYY8BNDWhLUDGrk2WO8FLzw5^#uu&e_qh`j@3Em3SFJb}hnhOL zJ*%w^Evcys1%n|te+^ZYm4y~BUz%IDtga%rV)2ri(8OSVFhAt@qW#CpvUG7-bxmCb z9dn2kly+(Bc&UZ-INog`BMI-eI7f=|ib~rxt$4acXyp}GE{BUn1f#={#P)9sd2{^R zf*~AcR8&+{*4v2^JkigX9uSY-f5SBM&YPH@sinQyu zsWe}M`WqT38}3w5lbi{6hsv#q@UEM073Emhqh+ki$4;yXsS|>8o@nu%6H>psrqU`5 z&4NSSpsFoEwbU6~3ujwZ*A}8a`_G+F^=Q#-GT~(k0m6NJGOEPw&fpUs+ib7TD zku|=ys-oPGXY|SA;8r-*Q)?E!?%VX5uMtjjJ#)<#b;x*Ct$0;6`U3EDYvqP~jj#D` z4Z%yX?>;rKU^Y4ees9(5M#0i5-^HG*`&TKyZ>lFUK>cF1?|JpDHNL6nu|L82?d{4p z72b2vz}w7MRcfWG_XT{Hyb_v?e*XO`aD!{{wkq{L^21ea=&(P-H}RiWA!BR2ikn+& zt0#_yBjOj}rgooE0IuJ=2H&gCR&RI;e48Fci9fo=6E>@!gooy>zM;NT)w9?57OG7u zNKe7hRY86FhgFpt`&Q;oLd)hCO*l7SrTf}cLjhWT8+vQvYel}Z)sI&-s~c2-`VbCr z?;IbxtWf4Xxi_7s_0mWokc@rk)Pnvw%l+zb4DTB_ThRCjiqn@#b zQBzlG%s&5ISDJICO`kFIT&4-)SGTy%IRBjUwSO_Jo4ff09>7F$gn={q`ffDwv^2*R zwjFaBdNvw&`Yz~ez{m1e{-P1150u7zwxi)WdfN*$6M zj_S?Vd8*I&CajL1#xD~q;~e~)BOUWSmk!k^!bCX9S9qQ_yE?H1F*t# z4zBpB@$1M0fBbgfw;R7(5Ox^9TKu>obdG<-J1@L6)vmbOz(TELaa~#UvgHPrB3z4o z#%(XWyTX+dTr}ApZI9PUFYaARc)wE8%~@{`H@z#%Yv?-n$})Ebblkb3q71HLmo>t{ zXo>AgR{L3{r&`;GaKQF#dMr=9J-zd4kDJ;BuDI!C@!)Bjz#qwoz0QPGIum@#R~GMov2Py<%}~BfRv|qwmsX<#gL64XV8We;HT45Ev|m z&?Cq6>B|QH`yKn%H7;FJ0WV;66<0!vmX)EIS5(0n@lv!oUF9~=>1u=R))$giq7~KA z{rfUnd)8eFFS+dTCHCkyzP#gKEhf_6SXY(Q)Rp62*Y?p`QdQSjR+1P&brmZcDvjmz z_N*JcWa%;#AEk!VXc3u`MtDM|gXI~mn^j4%o#s9X*(DhSLR zU{o~I5mC7eIwE)r8|Dg=12Zv$LZK4iT?@s^igYad=k<%y%*=|^N=-}CugI(hhAAsc zOG`7;|MR^2U3;x_V1_f?GQU~B-#O2I_gd>+Yp=cb+H3D;zwfFQ2WQ#NfAQi77iUXT zeXE@7U7Keb7rN2pvMXQ0IH#?iG$cArLu-re9^v(d4u@;Hc_}YX@hTji-mvfBx?NFQ zwZcOZxX(47gj@I)qq4Fqhr;Obw!@<}sdx#lO5;HnC%&qY9k!;iu4)N5o$lTLva_?^ zl{gLT=s2M8%4w;qy8yH3mWvv~E|BdVSXvh~S=fpWf<|A`D{WZaSheH=RMs494LZldrll(~eFO6tT5%!3 z5g!@?=dx)T3KK8mlu#udY-@Ni?m0)n;@`Ty>Vi6NNs}~BINo^}${H{)td0+OC zWmOzT(W37yf5J`lRbGsypIBV#6)%0)xfk~Mr2(GsJUpXI;2S4*qJlY!1kM@wF2aNt zXJYP#$3eXLlKj~8nD$VW@dzoQLO*3tQPOgo^C_m^Svt5j(^_c#hphrIzla^!Ka4a{-O!M4eRO|N<~{NTuwEhQVrH!7~a)LG$i zQ6G=b==+f73FnY#r(--Xg?%QNvN$Q`_9Ts%j&!vq5s>;Azd{ip;cldBH3E?77|1)h z^&5lwu}xV&&ZABJ_|DAK0h?axSiD8$h6WRNIb>JgInMFo4PT`1W^9{0RB<}=rMRKN z#C;C3t8W4H@wBmiL{q zXbg)gBI*LUfyC)Yv#5Ohc6?zk#9c&}Fk5WE0D;}3m6d1n{zcT#z z{Cfaeyan4PF#ZxF04clI6y;B5#eXJCzBx<&e_1lGTN9}70V4n@Kb$4=dNYCX|7!#w zbv{ig%TUlGP zxEaq5u2}bxNLIYBT`Q)b_4SR*TI4xGrtFv@@Zkc> z4%F4*eS-0kY@VAjbJGVoY~hhlo~B!nu%U%7PLRB25e2>_sjO{nszOxsKEiz%h36`~ zbUkfz#YYt%Q+!hKX~pLhH!HrN*si!u@kPa#6kkz% zP4NxIw-n>JCk!n@|0RyXI77r_bSQ49Ll47CFyi6x-AEh>VpeeqCTYWPQLF^1gfEc77CE`A@3b%lv(03CswjZu9#Wo_++@|vF zigzn+RJ@N!T^Q_!rZ6u!AjC498By_pF4K8yv-SAetRXk1ce8okIYZb3i{G8(Lir-XxSdsS!mixS7r{bR#^Ee(LUVO0vi&Pe0 ztdOf!ZdMdutk};_5tvVWu>xiM1Bx$Jpp0w4pJ}>I#lI-ZIE46QEYu^uSRsoqR^X|+ zUwpAbu2EThu|ocm%6BP>FIMaqU#vj!#R?Q(tiXfOzgb`L#R{CJviM?!yg+5~#R^$` zu>$YY{SPaOFIMaqU#!44b-(yxg*+J73ClTNQGBsN7GJDD@x=;!UE|^3N75H6@-rFc z7hkNvsVa*vR>=H#mGMoA;)@mXbt-RAyi4&xMSlOue47>dy$$6z6!Xx5Dbt@HQGBri z#TP4Zy6zWWtdQ$f=65`&ro@u;(Xn|LhlJTQ6yK^y zf1k>aC_by$p?ClWNS2dQEKxjOkxMT!{&R|VDBe#*9lx#eV=6zT@^eJA!!K2CSGiN= zmsI|%%5SLrZvg^2 zL%M&H;`55XQ9OwEF{Gz&ah5k_BT*#mY~x|4=of6>Mn53O6sb_zm z2RqP%urHqa6#Plim&d0%z0_wB|8!@pfbsix_?uR3r448t{%8HvN$@9oS!XEk8gwQYF?_O-_5m}%WI;bZXNvcbb_ za@bAB;p_D$s0R$W!nq#qLo(-k7a-@t*>$1uN%lU1fzxYS>bHE`ONlf$iG?3XW9I5zWsue?@`@e2ju7AtxlZG|p)oD>`Cjuwhpnhe1b~ zH@E}S=7YUWpXz*a1N-<3(wEtf*|($qi!$L8b1VC8)Q>k^_Jfz<(}vfDmwExd-F_y0 z|F5iv_RH}ocP{R0^qpId-(wgI=A+$Nm&T#+!3w+KF}TLYr(m=1)NM1a4VGoDkLPfG zq&Lx?d45Me_Vc^fb5TF)83H~1pojU5F8H97xH80h*#CXVZyj<=X93d1R$h^jb_?R3 zem{<#{ylIEk71j>Y@mB!zfGzaV+6;HuOe+6`tAYJujIk~Lw|}=&MJ%>i2HwtTL&HR z3H!$@fd$Yp>Jlwe^}v55{MHTbfWJ$aI}GmlG<_|ElmWLEoMm z7d*1%m#}e1uY%t}*m`4@hucO!9{<0ve-P`RRaf}bk@Sl+J$zjRaU9djswalLFJU`5 z@tXEE>9y_Do!)rT*57M<0pjV86K#z#^Sa3QuX|q3$9cI4<@o7YThAVFW`_qK34?Gx zQ~3Go+P0iMV%F-jzt^^A5RS*+c+G0R;KbFQ_rZ?g7vsF)xQ60a)^^?2wR{oEep&W2 z_;j7N^(5G2(}(rPF#fGX2fZDgkyxwS#{u8MbK%Z@%-7X#yy`OXTvNnscZK;`dAdrM z%l=(0KWb~(^apI?Tf#P$_FXqa+P4V(>?pJ`+ZHDjH~(W z@U@LG=`Xn6`YyP z&`sHAN!i=$LD`tip53t-x>$#AXdV2G^uIlL>-SKHg66?nF@7b2f;K;1@bQ?}wmwl> zfG63uHe5L$>?ml4Z-wTzjw6t^_As{74KS8Cd&?E@8|JZoWzTMt`&0U|&O1-QacsJx z-G>hhxsPFN;r(LK)bdV@ds~mtvG<6dT(@-!=1ToA9@F1z-!$$I7^`{jps$Q(>c$v& zBig?Jej%hy3a(BRaEwJ;^H}_iv$n?Du8y&8=KhE};uXsWJ8kFfUgtTuk7ABD5bt#Q6{H4leND?M+JxgxSGVWGhhl*G z&p}<>artTV6P_z#8e_QJQ+Vv~cY*V=73ZYWTkuHdG~_e)*u!uyVjqIj;Xfvh>$}xY z!iPG_8_IS{&%yDv4LtnFf$axkACG$|&T|Uw;o+PF=|*n|d}1e$>Hnz0bvK z>~X`dCfhHL^D4)lUh^>9T;{{+%YN`C`yAT(V$=b8rLFyyKSG~5wplJV$QP7hp480egR{5rynq9^ll{BzrZw%n-c6hLEnC~3+_y7W<&-Uot;Szp#z{iDj{TKmEiuwjI;(Jp4cQ?JmX( z%$*L7H=oBk;F_dQu_rpy=mT<{U_O#YnfIf9=33`9PM>Ocj!MY&?R~0q)eX3|+n>g{ z{w(H&zxn-fZPy*(r9OzUr)}V^BOk{6Z4RGlI`DkfZ~ns^2R6t!aG8!%9K-kwC1X|k zigvwD;CBtz|JIXa-q@2dpb2_82EZ~Vf!CG&c+S`!cqlUv2IEV z<9jvg%JU!2QP+gmueZ80U4Xub>zV$e-+-Pt&NchL-!@bHeE*fYah_jUhc+(2+#ctH zbIZVc=J#IP4HyenW8H^>4vq)xN8s?odla4@y6Q)m#z*~VR@9F&p8@zh%RbXDT`S`g zeXy}FvG1@y9meYh_X@lV-|n~$#dT!bXdd*$z4Nx5hc(v80Un3PdxZA=*Ws^?bN2UZ-LvQF z_)4aeb7FHYsMjz1XeY<0pQBEu{u@zm`cE8+b4}l2`J1ZRhitm86JsdObK_PsPGQ}I zer21k+d2qo3Xi{bYk;xG$9)F=R&OXge$5S7JK%;v>FYlAV!?>cL0;$&`7x9;2zuG4 z{DNz@_CwpV+#%56rK;NDJ4)^eUfFu-|8fjGZX6@W6uiPZIEjALFKX|#otvPO&nUyp zaYMh{PcWz8*tpSqgy-pxeVsh?#p)vu9{c1xmuBVh7Od&~652C{G+)f>3-o{W2-a(0 z-{hJNpG7(!V|t{E$Ku}4yfvN2qI~LF3tg{G93j_H;LYE117!F5l5?HL*bX0ieE-9> zgT^5*ec|`RxH|0Zcb+f4_(vTDs6TyBANTNx&ef>TTj}+fhn*?+b*x?V#6ZU5nC2fa zqVrnB{}u7f$NRpIxEStL?_lg<8a}(?*)za%V=x|bBHqUiy!b~0U&lSF2xWxhH?9-h z^NMf|Wb9iv;{eR-F}!2E)Hy?c=r{9*zy3S(Ir+~h>o2&cuR!J_x9)x;H892woKhSsU@cqv07>T&yi1XK7wG|69;GCV?F%h}-bXu4`Sgp-dEpyK-!IhNORKlIClruEm&i0bQmD>~rQtsn0N z=!;wEZ_cFu=bO}hUZk7v2nS>Adj)H7@%|Ra8d_c%#{UYu%Ul2-$Iaq%t>2V1*3Uw} z<+WqRr9LUHKZAM7)7Nc%1#5KST*%nOHMtf*UnF3$?i1GTvJ>Jy8^FD)n4|G9~__=fH!1p`s7d&q2?)9VQ_1uqIS02w` zKkj-w8)hAK#rom%yHfQ;HbcCOjezL5N26CY6~Ugk9?V9$9?V7?-(*GBH`$?~OR~cX z;oOW~(GDkhFvfT#8|&0I>H23oLTd}BW31jdt*wgVZGA#7ViR-+;?=F#XgrLe?;*r7 z?ZdYL`f(n=!SE~bbYt9#T^%4v=vItwl;BqEhe!^$V)r4DaVypjxr|$}U{qgzKoX=* zM7q9%x!HwVu`pMh{xOVOv0!xa+t3>f8;Q&@INo@Kl65N~wdn|#?L&qQ;+=?9q zAr`t7n;>-&w_@$6@Q~Qpq|aE_typYas6U?kG87sqFDVSZ#^oo^L3R@-ZpC7`xD`vF z{G!;zpjw_-8tR_q{Vv~I;JkSVqkw_>w#%GUX@d11>& zZpE;0nHM`dtWZ4p6ct5o#aNeEkKBs=1BK+p>XQFrLq=}JendUlZpHqW1zWdbSm?@| z9}~A?G1skF%ylakyCbYk ziao;f7P%FR^9)CB#fCF3!>w2>!>w2>!>w2>ax3yhrHbSC$Zm~|^w$-LIB*s)A(-HOd)%UQQ#^B8O0imhX#Teo88`w*>Lu}|^1tXnax$LGbY zTd_l#*SZzEig~SDG4Uj4-HP$bj5%(_rct%yR_p;DgyUB1Fluw$iX|y;?^f*JRO`4E zy8&wQV{j`bL#uTwHj{O=ZpD7gY&&x+24nKVf3dl&Td_N+#<~@o$VzwPR%||#_Z|Ey zUJ^eYgIh5=DT`URV&pSp)~(pbnA*A(!;~AtRE!=XW21`-UnE+$VxxKGTDM{+Ft2qh zHk#GWbSoCKZpFUJwzqD@Zeu|UtXr`r>T=wQ9nW~jt=P9%6UVJs8`U{(#o8F}xD}hn zc*m_+E#>aqiY-HeT-}Pr;8u(tL}J#h*y}96r*6e!a4W`Z6{ktuiv5BIy${@q9fG>| zHEzY8!-4yK5?{js7++%irmj!uOYE!I%nN;q9fyQ{#g|xoAriyAR}1vOz1ILhUOeCz zaQ-joxap9)@o|m61c`i1?nWXX!wZ8TpFi}w(CGIOKU=Zurwpry`;|VvWSBSf7Bm1P z8ARs{qdS{EKD`RXt}h)fes1zZe>CR|htH1vM6*A4#2M7s-`|Fk{SOXDrU7B9^M=Fy zRzaBR>=6%B_x>skr(c)@!enzt{12lBN)%i{jd%ga;|~f`o;Bi5N`)FZKDCD8fg%pS z2(=jO(`OkxTR}q6L;SDv*v}hL&vXZcm8uv~%(gh#rx%{!`nJRfPB;Cb{v${WM@A#g zVFiZyk3&RsFkBq<4EOm>6Mbr>MlpVbRChQ_85!36%;7B%M)`kak!KEXfH2yBB^2r# zAr<-mpfq=QV=bgZ{kJI18BXCapI^yBV7kNoJPKzHZ=^KV?=Mj!=orqQ;E#orz$T{i zeYoeT_(pEe#-D$#|0oV+fFJ_X8_;T>7qw1OFw0JAFNB;wV3?uqs)bXDWCSyBxeQLyKss2|g4ju7Nsxsn` z5ruXkev%5_ zqrA~v4g4k~8xE69IF5^_aT5ESw?6*C_3;s3r2gyUteZc_8@&KYH!*3;GI)Edj!BoC z>y2KH{hK2dUxC{eq_6ObZovM0Fn;Cu4PWZ{7l%12yhAxd9Pv3O`(AJ|3#?clKZE|N z2E_U0;ea@M-C^uM)O9#^Jb>*y_83kvWOe}W9_$&E$E-mr+-L{H4-_42f&uZPMbq)} z&!ZY32QnajEMoJDaMt+~RR!K4W*jsKJI1cWpU)|b|BhS-ys*a?LOlP7v)QlT+4$dtO z_MaIv!Q;!}#gj^dj~17vpKlwV-Vn4tC{l0(+#J2Rd}eyqIJj3TkG<(1RNe;fL%;Lt zCk0P>#f#w^=6?9Wfd`&RLH^Bfzw@_AB@==H#X)m%@G=|?-Iw@z@Z%LXPbwK-5)4O? zGvUqW{Fx==O5ic)Iru*sS2A%tHt&URnS8i4N(UdB8BCP;AYB~Hn^}H(`7Oa)m(08} zD49teuR!PTFPYgeF}SEcIB;h0p$CIo;g07=iQ?e874^a8iJOCqW|pUqf-9T}r7WfV z^x&3DV(WY#PL4{BDw#1UXeowA9qzyB(%5ajkJ8h0aTBa~@W>-@C=1iG9tzf9Iuq`f z@@EDYKFF3@Q7jRseJA)8y!4q2-O9T_+BJJ{`Nc zJ^3_KL%ZummH&)A9_}vL`#xy?odN8v*c==;DFA9#VUmFap zM|7V&C7nTHXt(+NrI#|7S!sH8XSp$W^$iKm#(}Y}1)x=Th|lpLzJZ1KsfF*qAUe_~6au!54fKF<|Bw;SOnfc`$wE z?2-u+CY2l!96NJ1YWyKYZbElB?dL}YkFT6bZ(QR`rGxy#&uc~LKfZWo(2fLGUo!KS z;QMge^nibJ-NK-${tGyk;NDAaUKrdPs}D9Vhcm9?HEY()m=LtgESa$o*VnR{C3VFM zxht0E`F=mo$DkVEv&95#Y2Yvs7QOvo&zkS;2P@G5Voy_dXk#s}aoo%@{2B3mmkGQH z!Ee#@{!b@%=(7ml=SpC@3T#d5KWKXYA)oNCh+Q6B7GIm-t40Rie$qhKr;*9aJIj2D z8)P$9^dB+<`(zOE4#%6s3f$OWzo=s&3=E5LgMt$z85$w-_G#li-v2ZbYVd(+qzr?e z2J=FaB0r3L3^&*XIFN_%tV__=^9aojrg(7 z&*5hR^=`v&NA=)GS=se4`CdWY7;o~K{k!9_DRL_lI*>_wjd1a|w5pLdrMu#wDbq0% z=8=t11@}XAOQc?jx^T=SE^s1uN$NgG{lmx|v9cNNN?^`f)3l5pNpf}4RH?q1&=JMC zN$7AYD#$g3t)x>OI8JG3sjOLEg(j$l5V|LE+%dTwzF|r8vewG_s)oj8OW{QYu0+MH zQd50BYmkC~Q;MoZ7UQnnwMxh%PdU&p!3hy&K7gtFfwyg7|nwok#`+@JJ zU3a_GrMD$G@oG(F>Sg8Ns6~#ns->p2VR4-Z=GxXKLzOV8aXl^V(8LTy`J0v4OLxO8DCeeIPBag0G;c&qPfdc6D)o zbWuZX>ms<8s&Dm{Nd6u9LqY}R40P!OX&KyGEml&$~rDiFsT+&>% ztg&QLI(_7XGbW!{(z3Ls1jmKx>4b^J6HDQFNJV-!ttpXdZi(tEhGqTYs^xk;(Yx10 z=+Kokn%ApY9V^LcxQOnaD(jn@T9_hduSs%ZaLr(>$#$L8$e{x#fFsaS=RucoH4wW=Cd^|GZ)QRm9YkCOO(%k-wyjT@!Vi&x}8X-QQ}IJn7GURl3vNe#M_ zj63L6H5c%hm&lo2wq#jLo%%p(XsM+yC~+JRU2r_2s@e}PV~lvBf-@^PZdzDr9K!W_ zPik>pELAP7TCxzAX>n~GoKjY1N_2)*T+_68F}r8+iF0NbSGBe-ZKz(x3p>{UQ)$fd z@Df8almgu;jhX1c{7n40Xfp4~4`2&Z449Egex}2W#XD4GJRnMV3G*^Huq=jg_%Z#? z(xs8c8Qs9 z>SO#0MYI2Dq~n_~6PS)+8Gdg42BCgs*vI;D#%bzzHMY$$VbfbQ-t%U2LxYLC9I~r# zu5-No5oh$>jBS&LD!u`IDQ;*maeR;F>YERJn8`~0h(_N%*fx2v>HRPCjd6CE&2MWu z_8W$OPk`@Lo>&b`$KMYXb+3tGNV6^bid_> z22($xIoFJ$Z>&`)fX_H7{CK=PZnlZJHn8bEb{y($lt6Yi865?8|Gw~@6cvmO`bJ9X z4)$%DQ@DY?kTQn@Uyi#yN)-Ao;%n*vOkD>O3o^YO{ZY}Y~H+l@vq?#%*c%AYhNQX{+y`NVflR4bmQ-HWD`T&7rvD^E}Ot=AFjd+gF;_P=!Q{X zJjXv1D4%QuAm#Eb`Rpv2dcqwM}e9)|H!JI8}m1G_}m*Tl-VO=ZcpfWkEMVa_Y)KU(?R^<0#+&@JT_Fp2GDNa+Iu2`;Ep*UCZ9L4#H3lwV=7b!L>HY>I& zE>~QsxJq%Y;+2ZmDy~z!QSm0l4T^1ww<+GPc(>w4#rqT=P<%*nlj5U_k10N>__X44 ziklT*P;6J+rud@bONy^3zNYww;#-QmG0OQ@%u~!)EKnSzI7D%%VoI?{ag5@4Mc5#T z{!+y$ikwff+%iS^@(A10RW4VoP@JoHj-q_lf$aq<*D5YjY*cJkY*k#YxKeSI;#$Qk z6|YrXr+A~{O^O>7+Z1n8yj}5b#f^&hDL$b1km4pq-f!6+;%^7IO69eRS1R5Io#DX%K3@~ih~rz-wx6ZRXL?tq&P-#ykc6hRB?*paf*DtVENM&rz@5#Rw&L@ zJV$Z9;sV85#YKvZip`3xipv#ODy~vot9Yg2wTkN$Z&bWVaf4!;;%$nzE8eZRQSm;- z2NWMt+@$!ZBIjdlk0FXf6;p~uisE+&>Bg&^RxDMVqIjHQnc_6X>5Aow6^e5e&rzJO zxIj_-8KK-oDmN-NE4C^wS6r#MN^z~?m5SFYu2Z~G@g~I$ifxLwDc-Jlx8g>{`xGBg zd`NMV;-iX>DL$$AwBmD$n-yPBY**Z-_@d%VimxcXruc^9TZ(*8mFr9~PcdJyKyi@b z5XGU2Da9g1F26>7;}z42;vWk8>GzKD$0?R6PE(w&_#7Ulh8Drbfp{q9CwMI3I5h+h zE5w(Ghk4@vi2n7i%@6l)-Vca;uMv@N2p(|h7w<|U^1VVtK2kW8A5&~sSqs#Ch=lG6e0M2#i@#?DW0#mNO7&=HHv(9Ks~oB zepB&b#h)s2j?Z+Rik#C^&f~lTc%WjDqWIav{%Vz*6~)gU_RD+>D1P>UGS33uujyp| z1X;e)2X^Xy@v{e6<~u;~vj-GEdqDBC2NXYhK=HE&tciv76hC{A_?011{OkdrR$2V)L4Hx?*A@Gq&oI6C*#j1-EPnPNPgPky?t#2OW%08I`4W}I z&mQCrD&M8}prZKML%hr@fHHpo$~*y>hYrko3{ez6dyvJ?9&ozu7e9ND#m^p4{Oke6 z&mK_x>;c8k9#H)30e`LeUs4o5d)VKP<0er2>;cE9EPnPNi=RE9_}K&2YJ7|08pZXB zUsAkR@e##m6+0B;7;9LrjH5vDvj-GEdqDBC2kg{z;%5)C_}K%BpFLm!##8DMKYKv& zvj-GEd%!6ge}dvEisEk%@zs>kSL+oQYy4G;-&5>V%K0Do-S$KH^^w@gGoms>aVy`81X1seGQwRVp_senj{4`$_7(Smm`U zuT%Ui5#JWvtnv3KKBV|##pe}YRQwl_-y~q*Qk<##S1Vqp`>$8LP4_>d_!Hg#GsSmw|9-e{Qvbn<{A`rv;5OvN z4#IUvgj}ZbG?f>qT&wa*l~<{Z%WKDe>Kb&x7j;y(Ge31lPcEI3lCX0>b)~qsBE)$w z!xiiu=neD=jP2zn*j|>=cLRLV!6q^eTgkkF4PrA}0Ncyq@D0FR@%9Oww9TZ=r7vmL zNgCR9#@oNJjp=%AC~<9<#=NL8~OdG|+(U%YD$|`YarWxX} zY%@gfGLASrHS#VBGa=c=n?LOI$MLqv&l}>2fM#!r(CRRbUJR?luOTU{4!@2>eX9N0 zRKfQy#_BLWs&6Us#6zpY?=YqdtHUr?d@GC0>vuoZ#z!Z=1-)@j(qIJQCBIK;6l=%j z!Gj?bL#xB9aF2~2ItDSYIy?+Q5Lz8_4fuFpu{yj4n?r)J$pm9vtHU6&I{Xq88YwUN z5o9n@esYW>iPd3{i`C&>$W;_fOx})~1(DSuP3VHi>hKqgi>wYGWc7|5DaV+fO}0@>rq$u^pfb-7LaW0d!|E`wR)<5F(OMm*Q2$^j zR)_bXR_pv=Uf8mc)gfP>1d-KYBNatfhpbD`Bdf!H(3Tg}C7)r=$m+13TC=SVf60Qa z)!}G}^8>Lu3|yb3lH5|9WG%j8N0%G z;R098D_q02FtPcCmol%lIy{2yZLJR9&%D;^@G2&@R)^nULt3lD&ob6p9gb(LwK|-@ za;??jhM@5wpNF{G6Toz@B>usSRG!eaSRKx0dTVu4^HdtV-4hOOxj@4l?;~lHRb6A#Rb$AWcIaY_K zGTyN|JcaR&)!{tK-B}&hBSEfKhXJe(zrYGxtHUp{{GM7JqN^UnYZa$StPXGDLGLZA z!%whZjC&amK>6`FeE-3sFE|nqYuJW;hw$mm|09mVztJCw-3)liL_0yT*STKoaOMuB z#nAO{AcudZcgRPX=^|!olT6IO=?OCNi#C75m_86HLJb>4!x^GsgK8MIAKT4X{CFoq zig}~>zYpws_W6S6TzuWT&^(@)#m++$8=M_urh^_4ndx9#&2+GZZx%x{9VCvdZPxpK zdV2Yq;C=Or7RLJEs}W3vGrr9q#KanSg3MaOW~FPE_sqp}c`(j5v)g@~?VKi1{yBZ9y_?@?n-VjZ#@+R$aGf=9!!NTdFItMP z|M7_e*IccuTDl7h*=Buk9errcWjuHMb+s&T)!4vqSiAUodPko~@6s31yY(fr9ahjY zoQ|>Ei_4ltWy4Q+cjpV}@Y9p*kDt5w+IhP#o3U~*zd4o>qr0VHceEZXtS5T*`LZ19 zdt-6e-CD(Uk9>IyBWm0caAz0(h&P8){M;LbxqW1Rdt8bagnUQH`xWyu9p)d~eS3T* z_PK#+8F)WqdfY%Ibd^qKJDP^Tbo88Hg4vvk9cG(x|A4?dr3ogE-`+X9y>cAH7*w9e zfoV~69CNU3@?g`uG>Px@oE>J9JejMn6?a}97xfWMyHsP_{JG zH=5bs$d1u?0^7M1Kc+3hFZ`y{-a5liIqgK|!g`J4$CA$HknSWn1wBJi3ARBD{J=Do zd5!OsCr3vHHR8p9V-;CH%EFTar>cCK;`xe;6xS;9k(l{}CkNiHvhd`PA68j-a>&Ay z13Pv9pB3}ap{VCTMd8UI3r`Ldo*XDVIZ$|Vpz!2C;mLuwYySHcg(t^;;mLu*lLLh( z2MSLP6rLO?JULK!a-i_!K;g-O!jl7qCkF~o4iugoC_Fh(cygfd<@$$`R?1BE9C3QrCco*XDVIZ$|Vpz!2C;mLu*lLLh(2MSLP z6rLO?JULK!a-i_!K;g-O!jl7qCkF~o4iugoC_Fh(cygfd<@$$`R?1BE9C3QrCco*XDVIZ$|Vpz!2C;mLu*lLLh(2MSLP6rLO? zJULK!a-i_!K;g-Of5T0e{o|jC@52C2c@Pl;{t!iab>aRQD$iE@nC>s(^?~%fuf=fh z=Uj)fj3x;68XD z3C^Iup*a8Zd?&v!_K(D$;XCPMO8L$K=%wI0A3~=C-}x0p7{2qXjOp8l)5JLV&Lfat z`Ob$J(*@rd=86x8B8Tt%ABdLkyr0sjx$NiUJLggi`OZr)zl-?JLm(*M$$N|PomXR% zd?$zFF8I!y7^UoIUUDTe7%4wF*^zSRJMTm;@}2jh&X(`|6U&MC&aI4#_|9*#@)6(J zj>fZmCtulGzVlIPiTKXrC`EiH9a3iToqt6!JLfz1V@At&j^k19gzx+VY9)N9v~0w8 zu3&{CzLPJ7E#Jwy^o;L31=`4WzQCLj-zk)IHsARZ7Hs*>N{Bt+J2|_teCO$Gj-2?; zcUZBA?<5s(`OYhN-Xgy9yNrwY&PQ0@F7TZ{XL%9dc?Ij)1>d=qF}MCkTD0o^VdlB?&3S!P$S_xf6ha`QG9-}w^z*!FzqY#xrocb*S5!gtC5VEN9Msm}79p|7db{h6@8s(jm+zd)^p@}B@}0kAg)QHC zE6d*%zLVFg;XAM6LGLZTQ(TlAzVit*-wycBuc89}$NZ6qW#CNP@SV#YzH@m7-^u4} z{|d>(44j@AzH^Pscdl{x&NYVb9Kv>s_|7s&F>fUQ-@|;Tg5^7<%7*R~;lGgW)CWVpx-zE5p>wI8d${^< zB0l#G*_q*xYBxE~-Q)etDNguWI;ylPbaDoNO`)Hr9#fn; zM1+)jFV#tcdiR|y;ZCxvTxS|D|M>oo?*cI^h&Zl8RmS8=!j*~!n3iE2es~?}?JS+l zbeKT{_3cTnb2<(pSFUrKsXXdnHc!JgUXMnh+2Im-e3-Y%aaIFO9wyF}>s$_fDWqpR zlaVs|_!7(2N3L@M_L*SfvboNiociS>vC)^!bxwr7lu-sW`qp6EJ>E9xE5JV153i0R zec4>+8PNA63)4V-{N1XkyS-uHr=}ReiMtcq=qt@8Y97+%!gaPFT`pW_TaH}kE8sfG zmz!YP#mENT{riIJ#Orq__;N1zUOo)I_&?&cWMs2N+#6h{VLw?Wxl5Q&MS=b0@JI^# z&t%9(9_Fx_Hv!QTqm9xF);UXooELy(y_xX$;pdR=gxtV_?h&OB(_ z-nMgxT<1C#Y`M;n5PQINX4-b{&vwj->wJxe6mgx;^K3-6ohMR?xXx9q-)?iAKW2Fm z*Exgr?1JmOjpapLXQpjuCfCW&8XT_kHHbNIowq>$yNm0rMva8)l#drI*Lf&g$*`I6 z!ojY%9oNZE-n!;G|HfEr+gV1@a-ICV&fz*M7~3V+*}ZKi7oh8!>&&w4%;GwEWp>AP z9>oUexosy`&~v%Y5l|ysrwjmHa-Dx+ZF1o{`ALhzb-thZtZnCJ#&%=dnay>^d61Ut z*N=w4%a!J1$D!9c2b$cb)Lh4*x@=!u(@34KDX^$&$F@z zxK3WHhU=6sOZFDmDJ~=p*V%<_=lwV+EK0~bECb&P7_KwraGj|Pu9FT1{1VB;40FRw zV%s^+U<36mfb%w{&%+30YIdxGnvooEV$@}29R;5u(~>bEDjPTGl*yJG$RuW+5m;aE*D z{lLfu-Tl2>=k{DDzlkt`{bwS6d`Kz6FXTF-Az!)9Q0A%^c1o3D)EVtgK}Rpo*~@eG z@|<{R@8vmrY}2{hJZJcohB4{Pf#;k&DOa9z3`jbJoPF5#+I0Rm^PGH_>C^F{;W>T0 zlvJLRUMOJG`8Hx<)A>b27@qSL##o!q3!p@8I{(d>E^Io(T=9dT$l*EffM|KnuTdJs z7l~ric{;_A=Uju=#u3k%;ydKfhb>(Ls!b=oKhmaCJS6Uz=UfkkhRe)L(&Mg?@{_HO zlsnJ)C*-0{=igCh%X9vYe_AIxnR3%=hK`I>(Do zKt*%lIY~UdyLiseqejAWKEtNAJm(^|lI1zYL9r3@3dOqCi1~$0%xi5rC-MARAGSwQ zmE}3bfZ6h#FR>x5P3KiqWqD3IA8~9tSMZEjo6cuhko95vIul!)PC7VoY&zF4ueIr< zI}^vIlUJt8b6!o=jt|=vJP3#9oK9_yO($m}JFw}T&cktRI!O)+&nW|dco>TnnS|7G&QMtA0{4x_; zp7U8YfVJuTE@Q1t=b_ANZ90Xq>yqdEJ=@;ebT(0y!*kB0F2|;mAHcgj=WVQs!*gz? zI>(3Ydd538o$DFz_^|yVv^qr)=*zmb0d*>4FCMCEebS z?QSs^rjakKstkFms@A&Y4XtTd_th+IZNd_;kvS(_!@@zV?htpg@)x-#fp|J$-n`+)nIzoP zu%y1pl^YwD)VXr~(yGN7JDQhOFTpOTv`VTl1TW;SJxFoxsx4>HdxYOSt_S=k{nMCW zHnaK7T8BT}6Z|Im(i95Kh2NxotO=%m*|wb5I`!+0-z>?|mXmyGF8t={(DyhV8BAdP z_`6ln>>rY&EoViJwwz0HwB@`hM_bMpVas`}sccr=o!xS5M&1|vCb@4Ld=Jf?;kTCY zq32?mx)z7owA1;!OcQrLf(jz8`X`AsuHRC+U-XI)q?o4k9ubFAo| z7G5vC{AMq|*~@R@IkA`D>@mMdyN=zm<7_cLw?m3^r*@o2P0873?Q%{8@b0)&AY7v} zg*7_QN#D}xwXg47fOR)x-*4~mD%!Si9nL|UuIu!<4kxg`*S5vm)ZVfB<+hIf3fi_5 zR9x5jQ2SF`Jm7aXJ+`T`v^hkZ$A0}se{=wKWR zULjJK1tsCxx9>=Hx(fFj1_~-JbZ?l|; zQsv9`ctoi_%<4sy>Z`2(QDMG<cwcFGrN>?bMPY)X}DLB=hm%GLVj$7Na2xVtQ9++7wlen;5GdC9S?Xhf-!EsAGQs_|%9 z(Cb+EJz>5f$vE>xlzUY6 zs&R^zQoWU;rBumW$E};(53pQIseYOTSxR*P^IA%EIP+RJxu-I(rBrDi7q@P5d1c0( zWkF|CwL_`WxpLg0R7o_&9ZHqntmE6e$z8xIIh1NM)a1vpET{~vmQp>5#al}C1ZL}o zQYC5KKaOQV`?6Y=QvD>=SW0y)W4obLNlqF{HNGe&&XD7lQXRxt2BB{+m7l5rPk0?ya-;-qIFAg`lEGAv5gebYNfh{DfVJQit~(~b+~_2 zuzY4|@X_Lm^!W6Iag)YPC`p%;EDHLq=FZ~M@(JTg!d2{njUQ0)T9Y*~8UKT6w z55dH7e?=HKz5k+5_`DNLfGkz;+R^R$<9DGsOpkrMG7`ICh}k<$=w^jeS(P)=2b;qs zaDPl{vvlEU46NQy<=E?gOUteNQ;xSzwezbF=j61D_ zmlO>!j)B}J)9)-DIV6(@n;!LD?Cda`Q?t_XnSggp6HGe#ZFP2gH{v+BTndkaYn7Sf zn1gMT2b@b_zeDR~`PdqN_BN~0x*fx2v>Ae9$Z#p+LFdf5(@N?_;B=n`Q zkNU{@8GS9-cJ-Bk7obg{2_`O^FMi3XUw3@*N1!idlmU&tHQ09R_ZsvSU?1y;EK&XV z1k5}ZYt#oQ8$D9rG z`XX=4cHmm48&u|X-n-VR=iQG^NWcdgT~oqE?g4cp@di!77XSO8u*rTjH@`Y4awHTmiU^ibyl@X#ptk4)do8}A}-9P}q6e0cth zf&2Rh_+^+M4o!IB&X6V^2GM1Wi?N353HjS+8v#1mNtfD=U4Da?0?(C4j?D8m@(RXCDLC7xu5HUd)>~feZ z{tAm!b~zZGTm`*B#4cY+Y1CX4DF(ZTQ4HDTn=$ze47>b(2(ge|enIN8A07VPh~JRd z*yOXw6?56;Si~-Wm{BU_B`-$?BjqP2I+C!@vC5*iP8xZ=+W0{Mfv(Wg~WZ7BxleGO4>*#4fWgu^zF@L!d1$R+oI9IU{zN z9{|L%+2uACY}sXguP{F*>~hRymt!uw9J^yA6_3tKj-twlU8Y@KEQ4K+MeOqB%n`B6 z|E3hN%YWpVirD3IDMjou9Vf>kcKIomm%%Q_GT7x<2D==K*yZO~Uc@ech4su}mtzsT z{B4%^czAr}$>}UFVwYc~6tT-Eu%4D(CP$hByG%c_?=E(k9~5};*i(gHRmrrIs%Py05 zjdjB=^G;^ixG!ZE?2Q84!e9K)j8}k-)_VlcKLM1JM1#w zJjJ?Wmz$6vS9UoDcA37nW0qaMi{ zfnv%c-uTZ{&3AkLWKm7EoUcK(Xe$wI^FnQ*5Naz4DQPctAWv1qJl{&myMX`ufO&3N zT2r#5?xMzq>IoBzCzduZty8fCyJ|{Y#GOJ`ldcvd$B~=s0r9nOi4XaCLEL=Dt7WaHP-|o7yJpU%J zZ^5ib0=JjrH?9AmPxx2It_UuVUzV8Oe>vafGpxdo&$ZL~=YPV#Ja!qXCGYA{ZG^Yb zwb=K`IvcAE_GBYUA{G@UmjjV~=6QjF%RomNVI|wzbWx2l67Hp*_nd*TX=9STLh*yx z&ykGojzoSp@Wypb@QYkkJJIVUkiiXOgxQk>vT+npw{+=}Ca-2u75Yzg;{{A$)U&&lsv|QBLK&a#-Yhl?&@IZnoA{qHg$RVcF89 z7;-CXuxDY@(iL9ivL(w}>T2b~6@13hKvo?Jo0fq!7qfm!to)u>mA2PI^By!`-r-ub z?#;v8QnLBz{DVDj3~nxi@WV_c;vuv7=xvB|1Jg2O^U+5*_DXRad~)P*@I5j%Wp0?wN3X#R{>w%Q(wNQDu=An za~4y-E3j?yP{+N{m*R#76SoGktM5_hE5JV14_P98*?jb~h}>ol66vUqzgran621xE zFc&`hWu!yVQ84w(=A-vR#rQ_l1e1;!PMX4)DVUJ0!cIOTLbV(RkBi63IhhF$fR8@I z2tcFH*(ICq{(ZqmoB1dETnx41aoFI?w<9Z~9bx<`N9KI=Zbyzbv9UM!YK|wY>vH_a zKhr0V32gUbBLFEMhu<2OR=h+} zUdti<=TyF3@qR_&w-GP=Hcr|u;THGrz*}|ja$z&d(-h|@%F96PU!w9##rqT=R{V{k*hM4#n=0pFT%+E> zipMKHttc<45dWgeuPX|_js1n_JIr6CI9YM3;u(qy6q^(;QM^uZgW_F^4=O&cxLNT< z#Wxi5(1BV05XBP36BMT_o~>A~DC^rI-zQbRS@9mlrxbs!_>$tk6#L;?VY$L@1IMU* zwBjj>^Au|pTNKwQu2=k$;=PKGC_by$p%}-&!*WX%Pf}c|c%@>e;@=eisVMw5@(;w# zfqI4$(FaEoQ){)bfFr1%%zzns?*^vU>v4~=B}fLz4u7V;P(`p$@0<@$Pf1Bw(C^Zd%TMurR7iu5(yioqn^{TRE;*L5W(VT# zNjqn+?2N6na}K~iuLcKB{(Cw&YJbzTt?^B5et~ygr-vWyt7!x6dFwmLfBWFA$$dw* z&)(b)*i;vKDSUyJdZdsx)yDprC5C0qk+P^e0M||ZER$Tj;oTR(F58r4?5%Stqn9h+ zMXr2Dv^UvuhxR60E{wXhv36p~kux?i0~Gpkytf9J0HfO@grxYBvh8{G*y+n4ttQuW zU8yG5`=hgh6#p)gf)roI5qk%uc%M;yk3pV3mK5*PJtc7R!l9@okKYNbzS_y@(Y5A2dfIBE{!ZI(noW|Dfaz)Dn^6{U}AG z_&2E~lN5gy+4B6vNy!w;%OJ%QmJ}~xMoWs*<3wU7r1&>ct95>2Uf8k`DSj#|baq(T zc(R3xB2t`nN%V*m9|UcAiMr%(m@^{9@r>yuvPtm`EZCCb^u;_sA*6W1CB+jiDW13^ ztY}{HFjh1o#ko{km8Am6yMC!BU1bh)-!_?Pei2nMwa(@czor_a@I406i-B?_%znjlHzd1WRX zQhX*=JEZuhc@PdM{yu7RNb$cg{r05zAv_$16u%T|@)ID%WoXSL#S@kkf0MQ8h7{*p zmi`Hl;z?G^lH#WDB z|6hK#7u@P!eSTMVjE1cBMwH1iHIM+ z2U5&i%>RABkMDDKd)N3Im#4?Ou;_u$m}W=D))4`Yt{|jOw`STqFwOp{=ZgvUq|?UF zm{mTZWJU??vXf$$&4|+RFwCAfzI?(g>=)zgeDo5RE9dj93G6{)o4qy$8|?5|mvP*` z06#a5BQI)=&=*ev2ch5C1NC?b;7y-7aN46F48_O`Cz|qh6}I;A+v6GbxX4Mvg05R-t*4A zahKSUe{c5&Vs0zh{CIng_SzXQQ&ApfH4?J<@hC#$O}aE>vn^2&$j_KyHm72T*=F3e zxGVB5YJ!P79y@R+jlvr^j_Ei^zUJloWgai4k6t!EzCPdczGjpl-fWV~a`lygv}Jzk zBN~0x*fx2viTi$T_S(~-FNO5f$HOuD_?+PCyB7K;W1k5oE}I`;D`C*lX(}paZHW0*-=od~KGHy#EAE+pt zHuejr4HQlrD4aG>IBlSC+Cbs7fwyb^`xS-L#{OQL?XZ1?(?)v;rwx1^V;9eJug!MY z4)1oG?N{=`dj4C{*lZ8L&5P$zY_@?%P{#FMtTiXY|mgZ#Wd z({@|N4ajMgWxRka;|=}{n(+qnab2iAM_=GaA9GZ$-1XC}6mH3^LoauoOdgN(lQ=M9 zU2!r7!+trLq|q~Gi~B`vEr(ge%)tHPeIvaY14|IyZ=jPlY12-@tSoc%3U9d7tP9D565nB*FQ$*1b6*I zL>TUx@3f3TH@NFnynsUPdOvPJ&19;z+H20X}RnF z$9i_bUHgoCd?eDxMwchgWj!PAnijy8yS|2!<*v^_MRVY;-$Jr?7kB+V)JV8%dP;Y= z>(y)t%U!p+VqW1jY#9@qU$~xmyX3A$`c- z`+&RtE$SX|*T2MpgS-9=_I1Twql*4meZGiRK2a^+mE8(vjw-Lr>Q){cAi|7I$D=eFU!v^DsF z_dIRAtDN<7?-9=Wr5cHs4O6iOXV7_ZAC4!0WHCJz(m%2^)=eJP~p z>*t+u))SG&1XETvXFcDkAKsKk^~>h0zk~PrDWeQ%^sT|Rd%U&K$M^57AF@RHvN`Kt zBeDa}6DCj}f43@{{hRQzmi(m&rrbNR1M~i7v;PgGL(x$%>9RTN15vSDIO{Ty4Y_dE z>(F1OMy1+zadye3sSkyH!CAx9&k3QA@kP;|(8oBRV#46oZtrl`I6V?rCOK$wzb3H1 zj5Pv~@{#y4?E?G^XC2LEBFb7P!SFF2&405Nrq&07UcMUFTQ6UY=P0y;*kA+21{)|g z*ucRUj~FjD*g&zt2KMsR+HN3N**;=}4HO$}U@u=Cw#y0(qr1mf>j;;t@A0FK&Y7=n zGC{wX1u%X~zq>V>vx6)4O=?Yge!5D^~e(OUY;-(=#QbNrQllej9xcWb_vi zVb-qx6Jyl7IM%MFHMXu@{RU#XTDv;T6+Z}y3>l5JtM7nl*RK8=B}+zgx#mPjMt_2@ zu@4=C%H+p`aS(Lv>i#HP*RK8{3g_C@PdBD8VsYWW5tgN)v8?P{)Y?yOyX9>gB3U0u(rMPzg(n^Qe)mUHuFX-5OH2u$2tm951YM#k|7r zvSmzceqj^yS~5CKmDZ5DjCm~?y@H7?8BKQ(&f3*iG1ijNA7ZQ}qxngkvv&2fEXb14 zuQRbFqx(>_Wb|6*wPbW7V=WoYE7M)O`f93n45`=hARID!2DLec)WwvyC!?qHa2zsv zG1SP~)iMBBGI|_~w`BC;%+`$|HAin*yZT>DXbq_^q8dv^AI3^|V@N#-$qgCJwX13J z?yOxc3u9X{`V1lyEm(O;z8ogwwTNRTTT&9$rPQ^i@k z`qwPKr(`tOuI9CB)~@C!WqWPy>K~xOG2>l4AJqi|eKGdw+SRLZ{O;P-!%!E0@2p+T z^;-7w+STXrbVMxk9gy~&2l4+-3+d=Z6xyn1Hql5OSyS)8KDx(CSMRa4tH-fR;}@>P z$!`-bY|*!Cx^#8)hK-4KWE=eeBQ)e{8@&Ug=-s0{qf>KXRb@!yg=}BCmz0K$ddpHe zZf`N>w~MRk(b7mclhS*KOkUKqv^ABvj5XKbu4=3li{h%5n%0KJb)m4du4P#xjf$}z zHf?P$f_vzunhUTBGk5no7~k^_#=AG9hVz7Ic-T3UY!dhS36K3>pptLslp8C4ul*{n0zXWMaFlA+P z%G;d!;gF*GWpm0+(3djGfJWaMY`e$Hb+E|^vVO=C>C5JnKZ(faOlLwm>f`TLMSz4F zkdaf205s)hbIPAbx?DKrZy{YSobtB8xpB&+=r1SipnlFS*);X0urD}eo=Y2iZvcea zXooLz(M66NZDM0@*g?beSOUu=N6hiV1ooH1jR2%P89%12z)v~lXu4=9^g{9CjUjg?W$u7zFvS5|Jg>A6P-$8^~v-)nv*fp#9mS5Mb z{uW}oTC+OL6)%M%!zyFV>PI2kHLIVbG-@u26ccAIF|BJ>e;yOhXw7OmaMd-de=2nm z6Xz?i$u+CxJ0sV`*{n+)PyP=S8YwR+ACyF_avIr9T<&XDe+9X?X7xtaIbxONlc$JP z{w?Do6Xz#c`N+iiA8h=HRlbc<#410}+D;iMtuZ7iOJYQ<^4F;)lU4o;63Uv@2QxKr zz`T}K{t**fR`~>qmQ}ulnk}o$E7M)G`U6z$u*%o-ARJaXPHhgW{0FAro>i`4l^j-? z45_SHEdzjMm0zMd%PP~~d3S48k3wm(W;NX*J8M?+TN-E0YVxh!ty%pxOYJ-O)xP+I zlxtS=!w_f9YO;mSn$^Ro+_K8wVXS49KS^DdRsK0+EvvkRv6fZ7n8%mNDm!adf01oz zS>-FJ%3+oFXFVJf=Q74Stnvbu<*>@vP@TgnpU!xPRX&CB4y!zma(Aq9Jrd-~Ds#>1 zmsw$J;(Rm9?txr%JkE%YgY4g{-D_gx_0L6Z<>;P!I-da`EqSfod1M{w4xmLrDQM!00PNRnhn%rob< zCUnC*|A!Z<*0V?=y0vL>wV_>UmfBKRgEhyOEKJECKcFS`Sy!71ZA_O516p0xg0*p( zd{NUfyo#)BsrM?ImQ>a)Z)mL)PvidqOJ?Kg{6D!!HD1b^-qNzmEOHkY`%Z=n;|tnc zpWAWK(Rz}-r1YLArH$c!w@$uy&PVrJHvgZXp?AnbySEO^{Ul`b&~d!47=swT3dIdL z;vWxH8B;O|+Y}8jEkiaB-Br3Y(waQX$8>vgz3TBejtU$kkE1&tdJS&ww>cFto2Mb4 z%ge3=Im-Jz^%0?3uo`IcU^D0Ss=59(+kpDIVq2I?@{P{(q5*Q!>(-e}-U(4o0D@3o4;YeN=Z8z{Us zP4;;^YOkVgi(l5Z1=a31C4B?-pV@&Id;K0tKeuH_>P9RJKCmM%wYC#}cKQ`SWq z=;syO*f}VDBZiRbcI4UePDNttNGw&5$9?IOw&tbRcKQ|H-xj7>wKe$v?0pM-RmHXb zew>pWazco}K|~%W1S%*b2Z(@3H3}#qV&tKSNJt<7DkL!pBG#)YsMM^I9N2^vXwzaiZEfCULwY~QCd0YSG|9vxS_MUTck{lkQw#@Ih_nI}2HIF@e z_P1xv!>QWg6mRN?itGYs0nWN^>*uC?Bt4It4`UnSwjKZ6z56YozIJ>Q2Sve0a0Yg& z^3gYj?k)#J3H>pbYmmxMmVCUnd-t<;SU{UW%4?|#!08Q+H;YX{nYttha^A#QPA zU))C)^^5xeMBWH&0j~E6_hF4`YecpTSDSYq+&>)Kl;?8xbx&)wXYd8n?G>*WKJM!7 zINW>H{WzM2M|dB}_w`ck$USh+%U7=(m57n3_Z1K*)n_9tl7!<0q1vq`Cg_ zRg^MWa|7e-LHuJhH#q(ulrlwgNvC);JYPpLG1s3KC%p92wCR3$*fqCU_CswtR|5Mz zXw$EQ@atWFfv(v=n?971&eBLpiO69{5?AC`Yj|9^XuZzFlL}l=Ync~g`^?c z^hgU6Zk&REy$7&afL-jX!>)b%uxo#d#4D;^=lEaIOe}r~MF!gRNvy{-ZMq*EcDnyMC7GJ)`5zj#K~YKdZT_`0M0?HQH43`hhmx`#D&nO=pCD&+*18=|>jz z{ZZJxryxIFn;r({;j1R_$6)Wz7=0qMaPRvm+}!7phL)>rB6ltQxzB(bh(fGS!y)z^ z+&F2X*GAktC-y^|$Nvydg`I&M;kiGb_%4e+$)gaj)JdF*u)fikM-t3Sz{V1U7Xe$C z;BFEAaT2#UL2bGpYSRZY?g`?XN|Z8is7?P2D{{K{PEJgqZ>UW_l)j-heI(PJC4r|W zE@48UHvJ9;4z=lzG4SaUxGFJ;Y^Y7=l6ybYrt{78t;4RVG4w5M`eGKs(x(53{+2eK zQ&;@X+VuaWSWBDEgP99`9Cod`)=-u%ru)#QAIU6Jh_+rS%)9c znTb2-8*0;kLEliDUP#I5+H^lW?D|I5WvET(%5mS)rgIK}Z)wwc;J06^Qua&R+{8lq zTiW!E6lZDEPo}@6O+SwQmNuQ^GJZGObZ-d)<3*s ziV+qJu5W@}1)V>n!EujJ&Q(b3EhI2Bitv7*n*J|vo^uZG9~jlNvv-=R_eQbpsDCcA z+xDtP90-l)VN}#;3e~Oao9bHhInlx5XS4!Y{EQGln23T}AL&l0DLWmfL65~D(0m{caTT&uZS}GXT9q2RvA({g4r_ON zSdIKaP%Q7gHo21?c)zKC8|p4>h2FoL&8+`*x3J#3o=@xOrK9R$9dk=v9Y)bv$2ilu z6|3dXt6p8x0;aw}bz}#ZEdP5fS?S06ms zxwo)w44bJd?kZdgkxd-RVYpn@Ec367Up-@t4B|`6*(rqXkBbCY4nj1R7az(_YnBHT zIu5stF~(Tuz`>T+-&zw)IYwSB>?RInY{fXRtq(KxOgL-H8*Hr!?oLv>ev&>p<^+5_vw!wb*% z-GgF*??IR6H{-ox-l?}4E;J>S?SSql3Oz;Wxk6V8-6ZsrLT?qiMJWI9DCcpZ99Sj) ziqHQ#@C`yQ7W#nD$A!Kwlyk}{SM7%lsuqWVs>KwbYCmjHwSE~??S~Ee2Kp_=`>Rl; z=LMfY+oAgip%a9jDD(`WONBNHy+r7>LO(C`9-$8leMacZLf;VjH=!{!V5UD%Xt~hi zh0YXume6{kR|@@<&@TwRPw4YP)%s<~SL>HS)%s;nwI4R9(({6j!U7QHW0KI5gf0-e zTxg5XjY4k{`X!;?5c-7Bp9pOi8bK$=bSi{S6MC`G%|fAkRN>wh`mWG?bmr8v#)TeB z3VAEpuHjA$;Nc_7e`@lmhV1&+WdO`;Y6BH)kNVf6bJxF)VJ7hTsZd0(L#F=Kan5LW zD%*DSr|xxYTYF)$&Fx*>hTSFG4)LLjrT)`(n%d#F1Nu?_>SUW=2tOxvMbt@diuSkk zp-UkznSwrdJM_8K<1U3BH`TVI2s+Maaodi(WZRCV(49i&o6JU59j7QZeOs{^33Z?N#K+FwYsq&1_H(lka zJ95T8Wu80|MWemkY4FCab?$@Hx9ZQH zM6Q&|Q`Kys^4!P_ouxAriE}kosPbf9_Dtnj1!+`ydW;#UJby=SMTu%2!2)7#lkA5J zh^ZOQuJV+4TIH#kSbP>m1}e|9Ssh)dJim%${rhyhf$@=y7pOdkGY^5v^T&K{fy(n~ z`UNV_r>RJC9^RC#hKXjdvvA{74_9dCAg9rGD1Ag*KTfy(o1zkRGwd;Z>aKI;(`qq5EHmtD$hK|4ON~eF>bhkxRG%~mFKHtEO=Xp#%TtH03-JQyFG;*g@o=T}1 zsyx3%F`>#c$xL^x^2AohcqFobm@3cN3?H76TtGHddEP+bp~~}a`i3gcBKn34h^bz; zRGv%e8>&3dXZgBRdH#@fAF4cgKDTeFJk{J5OXWG1{?-EGTlgp}mFFWAXQ@0drN5=} zTt|OP<#{FfZd9I;&mzE{s65+Q_)z7^h1fl*JWoRsom8HDSB=W^vn=%9sXR*{8(l=# zDo=kn0(dVm57FyUS>6nncAt||@&;esYqombq8 zYFBsu;1O(<Q8O1xhGgRt)0!A*2mG8PQsPk`Hpd2<&Jr2@w-zKB@s2Ilo2 z2p_u|Y@pcf@CKbYCJP79ft%%4eU)U zr&G=Qe$&9NURB$b67@i@?JaLv-_liHdRTfW3SEo{$#0j@!Uh{mccF$2Rj=4Rx274o zSv)H=DKr<qQ(_@AcQ!*~Wa} z(6?%3>+GT={~KxOp2DU4uJo?JYopG6QwcjSquKPv6&xPi?674?=@1lyRJe3tm1E_$ zLEZJOXVomViq%l(G}kmNubAvq*R82*UQySuY`t^xoCV2g$q8i@WfjR$&2_8mu-bNX za@4fO<#qG0+;&-A^ZMiob5Bc-Po<7Nf5O;tqs=+8|Aso<=DOAkYF0Zvs&rNRVs)o& zG`-haJiNE%VPnS#=S5f#{V%g?HT2=F*sGk?C52QcX*aKGl~v#C>uRv-``=mr`!B1! zHJzMR>o2cauX`x1h;~k%Hf>6B6gsHUd(=Oj!14K-x|-Tmm}doR6y4XP`O{B3#mW2k zP~v7g%XowSQmDK6h-B(;2SWGBZx)9f0X)>_ksxZM@ceGkJfKN%XIPp{9d1|Q_$@SX z7?0toi!jDmPlSW9)2|ZWKz=QaF@Bjk+!V^eo#esK_hamMCM{x2J!k50n;^y@8AExz?htC+ z564?L*)W#h-LRugH5spY2$xM~ow?rke1ywIhx_?M(PogL1QK9*m{n4i)wE?;ombK5 zr_dsXWyof1_XDBBrOq}qu6h<12M%^_SRS^d(D+J=Y4d!Nq48Bs*gR`FG(NPp#-$3* z)Zr3_8pC@02rl}iaM8aE)EN333|qF$5w)%Tf!CYCG@C$9n#$H0f#}rPUI;n_!dPw( z&zII*TZ|IqkRV-SiY}m zI$H4k&}q|sC@FBjaG__5`}IOUC+@ckeOBDLZj15wO|x~n?7PUT{sI1~f5FXA_G65P z(}R}Pv<52P9@p58pE$lE*EP2Np}&U-bi4`lrcUbm4z6c)pnFB~1(DR(760z;-GiLe z4V;ScW+Zj_u1M-@%Kab8y$x$&FYn+Q*KT#Rp<33gLxn;SK)I|79VI3>*jmW^bfsjh zj}uqxSbKfMp%~{iT*xzw)=5?>yW^|?b@`bxI!OYfNYt+aiADYIlFK*bKf$>%zg;`x zj&9$7T|06>*30+53=+$ayi0C|I}s$xsWR@Lc{|yqou(3(dv0FKILDo?{HyX>#>4&+ z-OtF!vWS_=d2assj(dt&n;mzS4uEMP4G0;F{1W$Gv^vk@@|>^pzP|?NnpZWf=xRW0 zF9zpKd+jtfhB{J@#(y5gPF?w(*=XDt*6Os5fH=~aN>~7?<(ck)?IK+IjesTl_*A9x z(KkJxoQmkZ9Rp$YU<^dPgPB{#1$)Qs`A}AH?3UVZF5HPOaA%&=m@HG{!?p zgZ~%!6a}UUOdB}%mr-0S2lGWdYU04^ya?t+TErN?S>SDX#pqWVpYkw0Dv-x6*2IC; z;YQ|3TEv+8TLj*gHxTmp?V~)poBTDxZp(WT^6m?UyNN>~ z{MaRF5o7!=1#insS@{Dj2;|)eJL9Bq(eN~O{S^|PZn$m}s$KC6kfCh7?{O;XmIQg(gzpoh4s#|+VU2|fnkg>@(gdN z?cVc0s+|+2XQxP>xe1N0TB^hsJmK}HfyzpeZ^*~1pWt$;CNhsfK@-u|a7CKKT-x>PX2wf?Z z?+D#D2>m1}s`^tx9}~*w>7j}+{Gj{|<}{S0H`sG!^B!Q&qbE(w6?^W|k2nK+V$Ps* z6EJ4g4zvioX;tl!)W)6v2aHK<>0@5t`;9T5V%^{}Z}%u=$J|p;_q(_mjLD88k{`L9 zPBUD3`@`rI_4&#IcIp5=A13hTz4YTI@(3PP2osLikjwY^d}I01Z-FQn>&|d#r%}lQ zV><4MkAiip@_@WfET>f=%#)PsJfKLr#UfAO-iub}Ib0tCEQ$8lHJ1E=NFH7(>Tx{B&Q2NniV#%(;jX_uwhw&IL7cBWQ!to6;#>kig2YfaHQwgRG zTu)f?4hYy5#0v8?3vRZ&?O|p*yG#z;}_24uRARHBIM0^g z_|Q;g4_5@2#oSZ9`d{uV<=~xoumyy&ByBz1n4({ED`W&S2Wb*Qzz>u!(_qW}< zG0u5NhvO{U{+{DYGiVu;K})`1c)wxvE6xW;Q-UiEP!g>JJ)+Mbdc2Taz9IZG0A9RP zJK|0ddAoMJhFrd11A;+Im7EM(ew6{P;O#V*$IU-h&u2#E|R*0t~4-Siz9^B<(AP{2-1;Hm+VB zfXJTKJCC0@F6aHGAJH8^fFTEI7hbMw(Ef7L*gyGyD<9oB@Cn~ z!R6kDn;CG-0Uz!{@Nkgv7D|Zu1b`tv{3kiVhxanTUwA7E@F7zHKCE%vBb9emUaheb z9a1-~(c!bOdCoU@{~+tC*`B(FhhyDS%d_uyXZJy@lj%i~=|!>Y+(D|?xH%8ux(FBX z7E+;8)&&)eZOjJ(Aa;ce_Zk1`x>nG)lg64gWX3QLJVc~A`NOZa9)@N_oWOpcrUIAU zx^x%kIGOXWspI44mu;Hy8IJr&;SH9Y4c;~elN<#{hVLm{3Smqf%Ave$Sn|Y-aNh>c zx5*eIgP0Rp56p5fZQxiA)`2O0uMqNx)tEn619>g5+wxXIUN&q+%xTLTY~`=el6O^xyelCu2{&U* zS{vbD%Nt?kuLypoyq|%carpdb?t;8LBLqCHyzUSRqRhQrV9C4T3$G>#=IjEKt-P7K zZRmNj{!=h*WGOHlk1U2G=U?~1#d5ITSym(!n5l5chS`GvVxfFvde&{*DKI_L8nlGY zx@_~d8vj^^w%Sge^4M}hvp?or^I6lduOOBjpg4VFy_ruKK9mA3b#HCPJ@{@6M!*j` z-rS0OQm@VTFIW9{)A|5z<}mj%mCAL@@?G650=%i`UUDAgh7QiNG;=V~nlLu`!JKc& z|8f1^X=qvjo~8tsdkt>cp(%f1fkK7whZ`vLP3?#~hb~ckI;sSW{yS~H<&zAcMm?vw zw9_zo8M>@g{(8P;<+F5G+VJVhS7= zs?@IVZ|B6{KfwCo2dij0+2&Z{W^8)A&{n*s+LM=b=?2DhHZG#`e57mYAbBX1V$wmgpU@f%Bd-RZ?S z2AM<{V@&x0rZ20KB40-k((C)@GIR=?TTw_dmGsiUTIiTH* zY5o@Sav9V79U9JLlPIW3_b%As)nvT530N*TbQ;1vXd+qiC>L1@%yd>N9Q%WGheN01 zAux;r-^P1Pj}?8HamgN`vDL*DlkW41Ik z1R%4=G0jO8Ij`?&imGRwhB1q|hof2Jv%PHx-me0ul6Z4|y9=E;>bJnziZwvMpuV$s z2SfyGfc}non31jbBkbb#|K++Lr(t`g+qR=v&bQmcwLe+TpzCTOP=5MCpji4spk4)f zcS3dcRDn^j$3?-ulTSofgnEG%E4%(u42n)eFq?hU+6a~nWtm=pKhd`#Y~RNhPSc~FBe zXT-2TXu5K*ieZ7!3}v0$iytd@{%poCh-}9_u5cQCKLo?AZ0cRZ*2ghzzNpM^o`w6& z(G!->Uiq<8WpXDmtBqmp{*v{m246RMoa7--``55tfs1Go$-{MEDv`iEdvHm-S( z^z_RcvC<`!od#ml7?b%u$E5o_TB{$`fgg+g@I%{dxYllEfDg));La||e3`G;&cWS$ z?=x|2SK%^oEyH~#kfzfjn~7^bf`s_C7-Q0%0tXv6ZUe({*q(50A-dbwjWAFnFB8{p zMqil=u6-NwMp^Pq{Vjrkij)UvciEXbi2qsO__y9qyEw3$Fb7n;#?T{H?WgigWTHU=0u+`tE4+^%u z2>Ik((N79xA3{uftI!{bJJ%`GeXCHmhaAUMSKEu)d&IoQjL&&obvpnnOn`Z*$4|q& zm2Eq?H@OGw>pHlSZ9DK!UEmha*@@Qk9h@`IR&$aT1*O&1zrxfeu+uFV4QiQ*z<3xAUc7v1E zd;({~cHrqZ-#5%GJ9;Y+-U%~v%Va!QR-}48KCkS0S0IIA4Q3v}AW>|-j-EDZ!15+K z=KIwkz|4Qs9PY%-f7FiK$z{XLsPF(Y|A}E==520(nVAz{=H)me%AKPE%+JThjbQ#x zpQ?NSH!y^I?vmJY3=*qAi(^39^Hq?!n4jP-Pyx>9#V*i2Q-Q;R2!S;AdPNR2rv451 z4?d<=uTs~T`bEc`=wCRieC+IsSjlOAuQGpK*__mAV^XtIV^TQqZ&uIq8(8O^@ijGo zg0GncgvpMtP1~V=Cw#qpbzOr6gb(;is(nStQu%=Cst)!XrXP5G{jWRM!ER}QGRkDm zb=V-7u0MR)wJ{vw%t+z!4NzvAP(v7&<|teY-&430!k9R)s`XF&jv8b9PK1N8)2|*( zrf!|?#OyXQA$GnWZY&3JgDFSmT!+=@#@~X!F($1!aIob~2Fzi(D38?0tA*Xffz?@v zf{&s_jH%}(;B9%8kVh;|dB|!YuLX8n-Ui6ahE0jtZFyBz{x}w3@^@8+ye~jr5^lzr zv^K)QmbcK#UlII_JU%1F;q#;UF63py;&;H$$Ywa6)sqd2-wi*AXkr+e7=S~z@@8W3 zk09K`I*PiRv`F=rS$kHYP`S)?Sc->`Z7knPA}t*yi&2_j4`RNX;|5p6BlA_`8easo7TazDp z#ORZb&UvowX0&aX0Hdq956;|n&bM_0m!r8BxLfD$L{N-BU%!i(I+D6>7v6oiFIIa3 zU}sHW@3wwU>N?H^H2qgT3|$wh<*!zD z-NCxwr)SooX^ty&nm}=$TTX#Fn0@&KWsI0tv{Kqzd;^ge|Q$M!CUnh{d(^@jVd&aPWXBI`S<8vQ`OE-gm zz;*>Lg(th2fMFU6f_BE#;kfbvhtqqGe@#jE9f+$Zb>QLjhkv*_>pTp*g%KOkl;C1} zHDCQU*lnZwFgP56%f`rUb|BbIxG|QULE3PAf)+6*+;QNIonE8C@J%ts_)URBFXITx z_5WKydm67EftPQm70<|<1vgtB$Cp_y%FD;adLh3Amx%)_4xP%5kr%_5D`=el}H=*e~KRCY!jBK|k%1cMo`!Zh5KERAu zuf~kLVE!)|_z}(bxF>R<{_h}09nJ8dDWUsoeOXT!cq`MxW7reyTNh5r=y~4n9-OQB zwtn2{*w@U*z*sc03B1cW7W3LQmaSD-b}!bQ?Z5dInYi^aRwypKO6r{(rRBJWQ2TQNDTwW{6A<%+=*M?){Zxk%lFw4rcbHxk)FY=+yl#H(r#sdTNSIOR2-+g z=W-Us3Cdap6#6JaYy9~fY#;p13-Hs~&2)(;F)L)kCcSk5UaPeE5#)_wr5uJ!Ke8ua zGZ<6<(`H?kW}Yd9bQ-qp0%FQ<^82(O>OMnARoUTW|pX2EWMz3sgLy2FK5H8G0Rg^Lov#eJ;j+wf z#$Z!^MKE=Nzz90Q*N(p=m+v=$q+`=4-W-EX`3Z5=?|)hE&JH{ubTO$j5N$Niv=a%zCN{v4k^!XN$ENqpUh?FrG^Atnutm zVf)~Zr>dsk^<0H*7*Ab4YeH)CW#zHqv(?PsOk8XCpRCZ?oyJiA3fC)e0gN&^*s{+{ zFb#wLodB+h+y&4*5D0f);jGm4o)5_$gt&VSakGx0+AWOOi>3q@zp$!P0i_<&Hski{Cg1lVDP*LKdPJXXp|Tn6JxkE}tie49QjICm?`v4>-*4cHbl_jPR( zD{`LWJCGd_nqY+@qp;5hU@7JbI2b=IblP0*@5+5&xyNhf-mmab^9TMy4C}PDb6j;F z_I}+59BT$u&FNLop)@vdovBI(90RJLqyer3i2$xkK>%D|AeV2*SHSfETsaupHE?~B z0v7T%+bsd1VNL|N&Q$($6>!yd1zhz+fW_EN;aP<3r8N9Mh3&(DNW0x1_Ibx0Gj8no zD_71g_t%%{sj{8)`oyTlu&&UsUeEsWo88ouA?4}1fW3+r`Ms+ER$BS%4vYR1@^ZnVaTG8YEXw^7vXwUzi`F1qE?9Ia zD;0(835zbpLpX>qI)uzbz<&k4^(8sqFDE(=cZyWudTAD zg6!#qf29I7zM8sbSETr|oo1aF*NA@c_Z7I)Fed^>Po^6eePJB+ZO$jby8Z*wsZfvf;K&oI2miUw1h5?-}_s z<;}#Yi>>^1hf@ckLF9r{k3a!)!Ku{yu{^0vk87?b9+UHVtCd-CD)#xpJX4OFqF=!t2q(xM2zvf$ z<{k)+)5BcUqImo`bO8Pc$B$`iWPsxrO^F}7596fR`b#8u=ofmWZ~fJ2=K>Ao(15bR z)?dKcV{h-~d9@@l^hj`udc>pvqk6fOcN4fszNe=Kco&0<<$L_PM55v++k8!jTl8Vv zfLCeve!xKa-s2!{EboUT3cXgkD`2N#<0g7_+>a{nxv@67e3bs~8NE1NRk>GTF2;*+ zi#OxuaFq8$fKYRouNoVk^I2OVKIK>P8eD{!vJf-tq*WU|WW}e9{2t-cmQ^bn>Xs+N z`J*bGv`M6C%$k}DnVT$QqGns!P*hsPeTJ<1DIHYv?}eH_tDfI(b$|xSl;BQ$^Il@s zTXa(DZm?7)W{trk8^+AUtZl#`4?$8-nDtkX_v0+-&Vn1Uq%jLEOqdTx)(hd#5?m&) zusRQ9U_w)WnV6O9*K@(FKZU$(816izW#_NS%3mCQCVv}YxAXVE8Tm7QnV9uLD}UW# z*1l*ENh3tkBAYpvbv!bZ3ugTo!euLOCT87?aJgXC%{gM$%?B|n-t8_htL|V$&(BVN z&&O7WBTjc~re=u$Y@zdn^1Wfa8lfwNwg_drrT>*eZxqV*NB#aCLcbyITZQL8Opf~o zG}Shrw+9$D_k9D#WWlg%UaPF1!h2WXZ0CH|CG9RSEylCc_Od0J*ml;XorcNtOa-9QXKBTe3f!VrGwMtQ zeUL&`J_cA%QbFco7CMIcNiV+5C4S^UgZ0j5VcICHPAeP+&?3gP1H&6?yB~Es1D%I z0|yNHHvNKW0Kd_W&w&7g)_?$ma&oHsPu^y_w9{1L(in8cqqNS=14f%cT&Yj>Iz_ow z1+eo8_-NR<4Ym(H>{RWtYuNdmEVjoAV5=i*Nxo zG8H;y9XG91KKd47%@7P8@QtMQ6+=p$_5@WsW6YqYPM$VxN^%qydW}v_D61%|NRGnB zsdY6ib)%D`rZq0Fo7cFud0Aca`Xsd9$?>Vw(dSPXJ8rad0z1T-x|-Tmj;pW1?Un~)9E2TnaG5x;I^PEKQ(D9rKYsgc zc^H)luv~Xo^Lli`Nh1u@)Zd~Ed0dyz?=$nqbWHvlVK;ez)wv(?vSF|D;AiJ=pp`!& z4kK?P?6$lYGV*8qGRH=fR{pxfn!ksnJY17Hg(H-4RRST!Xe-I-L7&>4XI;l^9etH+jVT&jq`Fv&f?kV|B+l~?2uHE_0>5sm_xv+)F+d8i1 zT-wy-#L}3ju(<>4w%&}iZAM-WGtMfu-rnIgcy@N>%==$+5(T{k&SBY~DV}_B7C0JAkJ0#&80kqgRfyhS`GR=Nbq>0~Uy#sAR(n5|YW`LCleo_t% zvIS;fP#!Rch4BD4wRD{4+13BY;Pn5GA?g1gL%~`zJch;H1?Uly;)<*tUpSSJcM)=k zF9eJXjZ43OB3#`6z|H)Y48=zvnqR_zpFo&MG%^k(7L7gz53klejXskgDw2rNadyX@yKOgSO@x}<9+FSBwZk~sQNs| zKT6Aw#P5ed!^PqeL@-=o{60i5TyatLg^oXFhLX|W=@Z$Gv|G+)mcq z!1#P}$7pVF{1Hl-qPe6~JQ@+tbCE~apB7Id7yfiQF)v^oe+D_fbb}k`NuB=5ECyIF z{$GgX&(iEB&xsv_aL>V0m2sF;ya7BHlwa@q3v|t%Nhb=vff+hWXCV^bO+ja0sr+Jb z=EYyc3i3-gyQo0QjeQ0;?wBOP4{`fM=+yfMxGjOSm|qt^lX2?l!ZiMm+=>!p$SaLN z3>%dHYbM+{0oL9FP?~jM7yEY=RW~{QmnC9Rb+hAdk$6Sb>m2_pnu*1~K#_MdqE}iN z=U|zCkLHSss%z^V|K2aC#EawqkBQx<;|+|jXS@ekH(u%BI5!scADphFB;!9p4F6k= ziW?FC8U4QfDaDP7pGv=n*?zs!F-6sDYaRblok9v6^88($=gHuZ>Bn?>Q{z=k@9}$7 zyvq1jLH#Gbqqu2B)vF=p`&!EM_}`h{GdkYv_>+wHtmdlX=QH)^N1<2nO6SKPCHLa@ zR2ddJky(i7Mf*;IRF@I@v2^{&_9Kh>{wVB`KO>kM>k}CQrY}#k)BRJ$cV>b| zs`<0M2UXnJiMfn>x&*FDJi@?L9-j#wVB#VAHhaw~@WKS&OnSEO z+5FPyyu{~Ni1psn2=14@8ckeAX_t6YP(Oa@_GqG>{H5McmH*pOJOb8sw2oQw-IpO| zz*>ae1jj-@-%Y5lHRjTd)xD1C^iq!yuV-R9qZPQi_G1vnboxZfa3AmpZX9Og5X~Mp?}2x-!^}xm*CuE|4fgc zCQ9QLW&T-GW0Ayd6u!`7Xsh-7mecAeJ9v1_I}NCw8RGAL<-B7yLW^`CeidGu-HrXSJ#iNRwBq*bAK) zE$q0I_#sY=O_Gm5_mzt=8`TsWku6#|M?l=(wXrN~3xgpYSa@z639-R=8#hFdTM(fg_BXAQw%SN{@Z zz^xj_d<-RAbB|Ci=M2GgM#mj>0-Y8O{Uha#)?ryWzksYhkze87|9_B`K9PUm9%BkY zt@eT|{SH690C86{3-eWxS={-Qcdjnx>2@(sSH(P27xQ$TPgTs*RWau|$r};XALg^B zT-W&qIM1o!-TepPH9$J-4lZ|Z2P2oSURCRK5qVWZOKZ*Q)#bIT8p_Mc$`P`B#j<7P zHO*_rHsEmBu^d4xR|Ajbs~VQAUc0=mD@k~$bU0p+K*-8$-RJX2gs%z2q)s4%}(>67y6;?bwG;OqI)P0fb7nhaK z_Scm8lgj*4%KZM9`=w?6va-v@rcPb`=dtCf6&qLjz3bKc}P1D-ux@z`=)%B}uQ2EuXTB?^_ zSc76N2h&{FvUYVV{>iGBUC^phYpk#5yeJfaO$3FPOq-e9EE)P+ajjk7S_d(@;Pnm4 zx}pINt;_40k>-i3R;YZes9Ce72EkS|z~)pptU-s-h`L6pob+l$^{=c&c2+mC)W{V( z_s+_V>Snf_UijG^5Ln^x30Vqt9`w z`GTX^s165ZXM?RqHLPo1#g@z3Utd>)5;fFa*oyk6!d{x6L#U#7it5@NS$LiUqPdl}G?u=;*=FU6i%o)}5S^G81!{Vzs^3_&ZRL!ZBm)ERk3aT8{ zC!I2ThI&3GkJT;4DSR;1=xXt-8wQ1#5QSfXcfD+RUG3Txe56jO{2MUY9EMCoWe`z?YcK{cDv{1$JXF?)hxWzV>v7&18a=0Jc%Y+&vJWMH ztWfq%}0vyEEJfp%a9jDD(`WONBNHy+r7>LO(C`9-$8leMacZ zLf;VjH=!{!V5UD%Xt~hih0YXume6{kR|@@<&@TwRPw4YPUlaPa(0>Rm;Lsw{Jxu5* zp_7E3By@q$#KorM^;Nf)I31BB{URMmf9cQ(&JI-2AG$a0Rvu8oKuM9Dz-OKYczGfeW9x9>a}67!wCprwteX<%}_Y$HBqa={FG!-xgzx-xN6Dvly6H!SElA zxIc=EgKE+cOv>?RJZ&Iyp0q(zMJyA-@F?*Ygo z4xl{#%Ncn$!p=A;Tr@S1$Nwf{XytXAP~(0+1WY!J<#!kC5Yc43zJhQ=4P%AlKQO`t zhU(-811>Bh)7E{e_M{Gz8DbxdUw%~%mWySz~Gm)48WV#r0_5C?!0!VvTcXElxwltTs(zAO@e7T50rC1 zoht4XAa-ZLjsZB{!%5w&;xY_|8L+RwXTUFM&)W()m^+I0U*IG^(}5~_Gm<23p47`~btvy@omA-veEPd)_ zFEeknK+gwteuWCuFIogOV4j}B1v z4;eXF`bFUFGFA6vmv$N^kELI=t5yIL|D4SH{QpOynKOx%XDWAvl}}OD#WBoZn5C>| zV6)e9gzpu34fg_Co!{d65Flo}EL|h!?>p{<8FP>Fhm`p%XZeYr`3U(tBU&T>-tfg`wNw!ybX16m%9e+4S3{bn>Q${!xdzpBz}Jqw?|QENqS=C4Lg5{L6KU9=+fB@T z;fb^DueI4Pl;0xuS`0_1GE#Vh6t;u6jq2gxa1<_v?s6X9U& z^y55YzEQ>)KYp|Aa;(PJVhh|@4%UGw$6VM=99W$>=%G1oY>e?E9=GN7kLz+#9?NIs z)xvJ#!0Jpz!N<@d#?JhO-+H&XzaE%3q-+@2U)W zS3q78ZpN6jHp0P{S7GH3LwP~|h-Dau&yVK6AdfQ>jiHs-9YT%!{iuj+IQwn{fQTj& zj$_F~4FhUKXX0#*F+ZFo9K-96uJ%l!Q2Y-_fCbJ_P4YoU|DiDm6rP&ueuEvAWn5R(==q#aU2wf<&T4=q{ zH9}j3ZV>uOQZ$ZF3H_3|?*;z0m!$QKzxQ=-S>Rr-y8`Cseg-bj;@a)>Yj;!6?IQ2u zj9J&&pw2(wTCdI+*j{AicZGuCE<4TU87Q0I)heV|`YNPe>BzVseHBu?3qYJg{nM1; za-YJD$^Z=fj=|l(4mW_}zIfpPis=;PXdDKY`6&W96a-_;I-I`>9ANM_=*OA7h!xF? zTmb5S6*qW&j&Aw>I*?d?zJjz%>2sW00z$+5xaY<&eRoO|t&4kcM{IYBhQBe)(N*hf z+_?pOZ`>Kj^IqlTDL@>b08TAg_M8V``=HKzN^PgJchf47BR+;c-7eH^)4>HImQ^jDR8iHSsR##;MNZpAW(qI=D=>^ z!0P-8%*(WhF@F4p+VU2n%O#$ryza)2xy~qwFvghrTLcGN-crabh8yM4o#7~-c-7W?Y@jDL=w!B>Tmi=o+{*1g!Gvr-p<&Rj$Yv+XJG;fcV+B440&p@i_xq2_gk6A}F>;ugBvFUFyZ7TRa>?vj)4td0;V}%m? zl0R7}-%Iifgf14kOz6ji5|%LBB|@(ddV|oC%rV`9lpagw9tuERczYM@h;D5g2RvND{R+?rzQVADNytpSxJzN- zV2=cjGtX{V0Ks_#2=FWx4=CMWd8;F4om-eNa`&NobRF|)7_39O}}3?E)2TD(N(KA z*TO}99)1Bw{5%|m&NTh!!Q=l#G@r=b@54Y*e;Zt4(MU7;FzjbA20nRLZ`>0+D(n11&!i{}sKC z(p)UA);SAT7(d7IlZ_0x0|6E_V>RGkkydOqSiCB_L{O~$75sX{;zkD7B7gpPQ;yr= z<4-WDa=^U-O!uSa+%0$f-$CuJ?lIHryzfUQXH8(JR7(*VTxxso9hAEm$ zI>nVpf}0tsjSOCAyydGsvlp3?|TWGK--$GT6ctXK9uj8C1c$-INg<8GIJ} z36Q5YGEg;pCY>ml6XN}|bQU7^|K78<%Pl!yIm8 zK&RfX>K27jZJ7m0Yi(uIz%UbJZ6 zIf(BvLO+(SAK89nQQz|^dJIayjSMQl^!<2xV6rCgWw7^Wj6RVX-21WyT&{=Ka+OWw zUPFJ@NtiBT-3x~p%gD#98VOqDPMZg8W?Alpo7%{LhdE#)16^7taV^}jRl$u2!j<(` z(ATiB#A$pIhAm9YW8mW?ZgJxOAQBrH+yltSjSSSz1t*AaDseLdpXjl;+{l2S7#kVr zbSEb`M;IF!{6NK>nmC4mPw{jYRGGM#foDnJ>4|mpJym>XCb(V%8yP&W;?7R6-^NA; zT5?sQ4<%Q5d?wt;fQy;2I{XtV@WKS&Ol)MpH&Sh6FqD=HJicsdBLmg-uJ?Y0;A$g- zU(@3f?+nzB&y5U5GG~{1Zz+GZkpXKvaumh-?*Ab4fNK!;83a=s8K@2*=F$ysXJQ1y z^-_R?1wb_?)DJjSRR&fZE8Ql2vr3$8Qp)z0K%nNsUDkzozhoYC{2TWH61sXM60* zxsky*#$6<}Ju`7RGj@*JZNMw7N^ED~#ojF{Ckqq&L%>D`{B&_615O0TMh2Q~N}S8M z)xutwIFf;vdL^oAv5^5s;INUwIK^Wl1F()?t5Q}Q8EmGsWh%Pb$Y4D4yV?Nf25L8x6~aG>jSRSB0bfQ{ZHJ*NLA7Bc17;v_#zqDw*gQ5eSOs2f zWT3tYjUIVc>sOhdCU3oBv5^5S?6{P8Y-GSD$wwgkK)y$6BLlvx*vQ~bRN`SDVb`D%d&09%1MrK5Op=XDIe2=)>%~bBCRR0tmA>2`6XR zKuT1l!JsIL@*rgQ=cuUOh`_lKF+4{tzBsrmK(>7a!ZB0)m35l1uvgmx6u6wr&`?%( zJC0lMFPL@v>=hd~tr}ZCuH3(<9%$ReGwC$8JA#i>4BJ-Lb^kMqQXJ2~GlzK`k2((* zmmbM)rE(vPyAFX@MGPex!`Es9F8(qHWv4CnYOHD)~kXu*R<;7eRc*EK?)vb-l49*nZFT>QTh3ZA< zT<5G7jfbo1!!_q>Nq(?&JAFLgY{yWYwlY3*ExbxZFN{{vIY2L~{&nF}SW>N4VC%*B zW_fqDEEC`Jx#4EB2(wPxtn6knxNCySk=hC&&>ARhf?iI~#p76(u2%Nf<}|6??3$3i zr$UyQGr=ASX1fKwGlSl$KxZLip96cvI@hGDh3$GxyjpnABI#`fWEpy}1|Rz(=*O!T zo~P}(5G?3l7OaeyJsmo$QtZY4;id*=R|Z-CuUF!yZ`Faf3Jn=A46==6%zA#aWrxbR z-jzVF-8cFY*)1U0U%_mX5Nr?-?n{uqCx*3mh~7biZ#%X~2$tNNHT{{}8K{n#U7yOY z$*yd6p?A=btqJrt2?t)I^S)1MdQX<_EByh#U&K{39ImmyF6NsxmiR*5Z@NFRC#n9Cb#P zvojOr;Levs+^hpr4vsaMIIudC3NZ)SaxhkoP22J|V4{(!7g8gy7IqT{R%aXj5hv3k zhT&+I;IidyhP-09F@G4?3*@!HZp(`mVT~c&j4^)H8QJn~vGRu^1@bcII2{RjNh1u@ z$lD0JEw9bWAEE^E%p4~pVpbRO?iAU4&NLrGxR*?2fM>eA{#z)BGRH$XX4jv|-$U?4 zn`)9^&N_r6#xll)|_UQL%gnQZq0yW`C(Ub!7w?iFuUg7|_@VPLnq^uKL-axb~ z>N|}w@(gdN?cTG_$WDRjSrr9=xy*&)GYXBJI^(m2g=T-ug$kunem}L}0p0G$MI92F zPheP&ffh-DBWRUuI1D>KXWZ{S_L=SSgPV>(=C%XfrytWfrM+nf3gz_^I$Y>Dp$mjA5z1W~8U7-nn}t3sl;a2V z-zKy}C^yrjdnuYODTh=@Iod|badpyFLe~l9980?2B=mzA-7T~zs^dYQqT=&RN6I-?=q#aU3tcI6ozN?Vep=|ALcbyOaiK2?g_2Ck z{~w{dh4w*1R{0mI*4ZN;CkcP1&}yL#LjObPZ9?x7`c0uv3f(32PeT2ConBv|B|=j| zj~6;e=($2y3;npztA*Yw^lqUK3w>7TD?;BC`gfs+<0Hv(pDJ{b(3^zbE>x|rN4P?C zvSe=ei+<;sjd69BQ`%ngT}^4s zPuEIj&TvduQg&J)ulh<|6?i&O+bFyKm@5af*k=Vipmk&)joFJoAeV2*7r|ks;-9tS zOb{&ac}F|GMlRpyw+AcaRagJgL@-h6PoU(aJ?}-_+@JDR=9YlaFeg|cpO0Yfkt)Cf zPGvl@f$sBrt#jOR26d}?aT2dEXJTPIr#f3=HA^7JR2|IZ}6J@R!Y6$&kGXH(M z3YS7y6Nm8_?iO0a7{3$28#}#5f#KU_jPc9-_Z^6G+>b!~2J*Yd^0Hi+|GvbE?3;}- z^5(z+pU%KMZPg3q7Y--9rDJ|BF5Bn=D+VY$SXz|<`33DUJLBDyh2p?Ft{0G z{4)Q2w_Ew^?%($)$V(bwphn(C*zNMZVdaniRi?b=-yr%wYNFf?J47@Yug@Y}F8{ROM7W1dBugIU;t>R9J04ap>wDfo;gdnEFn^YlvYLF8 zIS~J}e3qfHQ)j)g<%DK`{L}UkaqKJj4{Lw#*j|HATCl=LeRkliDck=3SlcrRa)@d9 zUX#ucI$P*Gp;Ud+zeeavp?p8+ev!~m3T68x7QR*J9pe5y;d95#t&Oz?Fej5euJM^P zVSLVO>=zOuqj^;*qSx3j#Txtmm>U^edhJfGp?8YgfQc~=5@$7WUH#P5?H$o1+?|^` z@^RKwUNA3mZ9BsEbF12XoDbFRR$T$<3)+d7^PShC{V~sRso8f5>2+QkWZ`Ffien@M z(+AID!jVtM7wUtRc=XdDZeO<&@8+JJ#Z=}R8K?B)AxufWdnGd4F+7@SDS9g1!*P7Y zaoFN%j>hGljK0+TNpO->UVaIjBV`DQqnUmQJC0`h90SSGOfS(VJerB~XXI!mEE#jU zI+{txiad|d*3nE~gxv6Grn|`vpN}LtYti?~>Z6&~qwfxmX6gebs*h&k94*XfJRanJ zTmz${<2M>BD*RW$8rrf6_9 z)6baRGdkYvcoWlmR&!NxPDqXhM>Cy6?#1sxGG{bKc7V;{Xr>n-|ATcj)6K{cI;ZCo z&$8&@(M(HNOXl#UNTSMSV`|1-;9HpB5NtF&n(0W^cX%|@2*wSMW*W=D;n7TOtjO?a zrjOD$Jep}HeZ!-f&f*gZk7l}`357>9ac9H3>+TKw32LiG}D<393IWYH#2G- z&BTGAsC6_G4-1Q0M>Bnd(yXJIxXM1-`DiB28H`#-GjZ;6VH8I*sjf9Vnkm6>;n7UL zB-_o=Ov918q9~4LdV|#!9?ew4c;V4Z17pZaC0pi!F&)$AGGA%5F1*9a=HZ!?N$xJxDqBs@}uM3kUz|wi0otH zBK?wpS(6Yn8XQn`5jf8|m-m0gsfc?y)F_7|spF0C!^a<>PNS)6nvFh&C^(!5HEkv* z!pd1w>4y^?R^?w*R&nJc-$|8c-G|iv2jwH5UQ{@}D5-~C>4!!Evm6cNFERe0B4f%W z+kmS<%M4&22bBFFp#6ISQ05e%%qdJ=45;qkgL@9-nLW*Qt(Z-z4#`nRnV5N!ou)aa zPao5>q5d5X>(OmBmm_<^8IzqSc)ri4^z5zPLbf%~-N^fU)X$!r^0TIHjXHlSZR+H~ zBYtXYo9ixc%BVik2k@+FsBg6S)vK_FvgKdjT(c(4p=oVx1DtSzPbj43y_gxu@pOFJ zm0p0~0gkiT-vxZ6l*!bMOvT5B-y4n*GCsrMgVSkV;OF6H8-}IH)Qxl%E`_ir4&yN# z$2W{I))V1i?DRVhA3}ZwjWK?ix{>)T2Qtrcbf+8nVjSzujSz%2)=b^VYJ6x}50po0 z>V;on69-l&iMb79Xc1%TIa4>%3VFo{LwOiQ3*=?$MrK1Ef(FK5w@Px)J-CFjsuG z%T-Qzvvc#_>PpymP*=iwG=}wPw@vaNF`l600}MSvoy()afcd@_HE2=X<;-a|K5;JlZGakRB_PeF}NLm z5>B1P174lQ1FFvA0aa)5fU2{2K-F11pauC_zB-EsygG{qRGq~Gs?Op8RcG;ls)mc2C>MR~mbruh(I*SKXoy7yH z&f)cs3PXLPZ_n4G9#Xa? zjGAo;^Fmdct&ZaiK5HWp&fqJW5kjpwmW zXSgNgIO8c2_4ru^VJ*g@63$x+&W(BR&@W#}_M*|qd0@S_wAahD=X(txvHU#u2)a&o z*(cL51N!Wmqw8p`iZPq+(W7`j183ZW?&saL_wzB@ra5&QCcq?JUzwpW}YDJ;jB0{L}e|!<0A|v#fiiNF*k0X z|C`rv{4Mv1b!G+JfnQ(tFL2@v{{`{dtNxPBiSMZ0ymZ%wfn>Nd96ry=%ob`0{b=~A z$8hx&ZVbYhIIudD$NwN>j358;jGca5tHHO#7~?ku4)`<#rWg#d8z7{EPk8WeMEqys zz^d@qHd@3OzgggIc@KeMxhM~xx9}P>}_p%+rXIo#o=eHlZNOd>IX5vSC0?l)GSuSCjGLeondk3;sWZd(cF(&dAtEru9}HuR$)Dj3wcUIE7qoN2^z0PLo7SPFcU}wj{+&0&K0x*h zqYdhsX>W7VZ_PDOrESDVh$MbRo$ru7;zx}s<}?&RsZ%5%wgN% zRkrQ$mzq8Qs@l&8^*BX5av>z&FHk< zHpom`_>Jq={tw^p4X1~fm6I=r|KCk^`*xkv~cMglqYrmE56XBjWul-)w zkDst}H9@-c9m6xsPj(9&bzmV9d0 z#;I^SGP3hapu<06h5M+4n-GR$nB$X?okkYrVBTN5lYFYN-HE6x4|RoeET{CDg0fF+ z+p+PZ$n#i~4|I5GSU%?c_!P<_b-=O#?*soo)o}x4{ms3-!?DVM{wFL0^0*uIfU=?t z^V%;1-3{92%geN;+XlJ!9un3~Gu8|Rb+Z+6i;*X1 zgV&^FFK)-Tub>2Va4zJdj;}6BouKUBgWXB#JtI+1gWS}{orh!orIWg{gJmiO&$N$7 zUarc>vbkHCmkm3e;-@+mA}_=6j7#x+ebh}U>j`CI8(}=w5A(eZ;quXD*k1hO5C(0f z6m)OeN<`}67|8T1AZIF`4`m*K=R=vJ!{>ASAl?2-2I%&8*6~ z@$T|J(4ME7cW|H0F6X1B{{RogsrFd)!*hfP{c4?$a#DrXRbQi z0UPi^fziLx@A`^ye&^ze9uLO59NzeqRx@YPex;*%2oq6TYkJ?MHR@dog0*mmBVM%D zErF;!!mx<1ci{As^TFjWheW@G9!~62xN)X;FIs$)nl}wWFkkg?2JuVv-i1RdztL`u5Crp8Pet~ghIODfI{r@t^^T+q zL~;jC?E3l{%Vf)9o!4F5Q z5#G3XiiwUl<(S5Z6HKbd(62&svG@^8=V;9p#?{`B6E#;H??t~!n(H55ODU5zH!vP$ zZjaI2;P^M_H$`(vr}$_j!F~8*t~V`yE&Zm`iFL}&5WN}X)DE1l((_~%L+!x%pGJpN8G5rwh|~lxeJxH1HhQprUFVx$z`edk=^I z6Sx+8YQC!XWr@fgIK3?rk2`RBU(rk~em_Ot&4}EAa~rdLkLL6aoZh{6tHkvVoZfvp z-oW@)x<0_V;SQW1Zzd5R2`Q6qz* zMM6fBn#m*-u~t#=X{%MMwDt4Z3T?G&?bEONX=|xfv`%$wooa0z0Bfzb_O-9It*_tr z|F6CFIXjnx1O%s#{mZ%kz4oy7aP~Q8<*a?yGVM)H-N_o86iqx~L_gFdZC@|od`VOh59+NRF_JY$H$s0Tk_2q@v z5RPsL$sw$d`JP4A&tR<4bowt^+FkLB3;5b#xYhz^FkN#erEg>5PX!yL z?&S1nmYNlqThNsB3UZ#Ug{P;RnL9^wXQn^Rb22yBBz5Pe-(lesv~WfG2kdi2z;i+i zoZn>O_TU^Tyg1D(GguMuiWCc++*BBRHsHl37C5gZvsJ;`C@^SvmJ`Dh)|5D4m%HJe+)JS0rsoPtu^U04OeG+IGgJ)r;rvn=aL-Yo7txY zPPQ{BaTI=sJ%k_rA3QL?e$~Hmx{7_KksBpXVr+D%qBnOQljtV}UbR77UZAg$2$l zS*t2ISZKAt8B|NlVu4c(SJX&#vB1f##X+sou)ujA>(?m_3!J=Gf_kN4f%7%?X1UVP zyd^mZ_DQB~UtH`MD)y_g15q+8a31c`u)w(#^xFaUtIF5%tpRCHD?jH5+JY7#VS$qo z-nfK4EO2s37NL(y59f9CHkRtXyjF3VUcw~qJA|D)BVe0e@>cvtJ%I&IUOoO0Ufx(V z%p8>96|^5$FVc~WlouqOo_Uj0$8c@wy2v{f1^Sin?CgIJWFP-zG>ngcq#_b2{}>CL zd$A3_f)+UUl6&8x116#&f3Ff0^A{d)B8KJfB|J_#@H1e=aL@(#@#}bJf@MvLIDWkl z3%tw~C^HEh*5NSaDkN)(DR-g}CwfI$)EZfXSKaw)D{OljFj5=gw}F zS}azILRw&Bw)DhrqU?my@$)t|lHr^=*=$%iE?j-?>@~B>!Y93P;gs2NgVGEb&T`VE zCz3H?TzJUr&j^?CrNKb1o@u3v7JjO95^%xnSqnVij78ICR{(|F#^&g7&VUA9O|CCh z?z4~?^0r`U(m1YTObK~$zRad@vHy{f;P=ZTaNGdCw5mS^$4ne=f+=nMaIe4=(}2|F zrFIPtmL;Es$a~bu|3Ivg#^y+C8mijId;Fc?RoX4L-J2$@s;$LbwKvj!;saPH4iCF+ z_8(_01LQHVEe7ZWq&yy35_&2}QPI|6L6+mbIvZ?sDiUm*d9Ohk!zZu}Hjlb#C)rzz zaWsG@$3cnPj$=OJwhp4+BTz*CoAX??dDKn2{N5aC#zlUd56f>U;;b_P2SakO=Vc^j zeprtAXDFIf&nrQ>v6cX`978h>x81*>UB0JgyLcTPwR=9|wy%hK3v=4FdFLR{<(DXq z$FUdk>^Q!PxUGYz*VzNVE0E{%D*!*+KdaN_{9K2_<+l#}xUOuldAA{fajpl3EhzUh zI~kyv$K!5AfP`CMM|6@UfR^8bh-2-w*{t899F{^9Y`MLWV%I1$^C0{^7nO?nvAnZ9 zylWunEkh#M%FZ%&mE-4}xcuIQ!WFu}DA;zR1dX`qz3Z^u7TBIMQQ)_&&YCMf4xy}E zmmVN8aGc_cUY?)Zn&9@1{J8?-5JsMwOb}C-3_%+4r6>nF(Pw{cZUn#z(_$S4`EAsypwl`8St5~ntqIkCA z7ZtBkyk7Bk#Z8LxJ{o*~qx7E?|Dl+~+_2q!6c1LMt++su-+;4Rt0MQ(kiJFnPQ{-p z%8M}M%gZ$2aGodN!HQEAD-@S1HYuK^c#+~gijOP4p(y7ceEZ?jB>$m`#fr2a!Soju zw<`WcF~pi-{$Rx-#jN5nipMLSrr4zTImIt3{x8KF6z^1gK=B#HEsB3pOke>^{}o3m zeo}Fc;zGq5#dbw;Q-pE+htfAG{!sCkioa8QM=_u8F;Q=r;%LQk#c7K36{{566wg(> zOz~R9TNHny_=Mt1ihoor#5K(JrzoDFD0`)mzE0^sDf+nav%J_<#aiQDH(uwZntqhx z9O6Jc1C>5av6YDO9g1ga`UQ$t5>f9urN6KEoMJPt8`Q_G$qR6Mmir25OlJ>vSUVwY zcGzt-z1x&3pH!Za(EHx&PIEht_SMkmW)}NuxThuoyHaxtvG)RdYq+0;_N2TF_m0fp zOu8I-*q^-_mk~Z=VEHe-npK-oQWkr-1LP0m9`5Yg^swx-!LZLN`h1)UuK>2GynC+P z>J`GTrr|Gn-RkyrFSph0i-A_|@m8Jx9$Qm=w>8Dh?Xlgc1zeRl8;~opET{OH<(k@fvA^U zgP$+r=+6j5B2z1|hD|01+`%I7g!ye?Y&U8isgVouD|Vx9L8EFns*;>XmmsGg5mMX< zjom2P(N?=rcOgnon3I5^Yd0!9lmi0C6u+dgR5CRm_jXGaq>gs-L=PYK#ctFR)S@TM zHuNuy>_$z-q=k{)s8!4>H+@K^s@Tp%Llva`B zCT~RQ&&=y;H|i-gBc3qtWnN@A>R7fA+l`{tl`ys&buqd2VmHbM2l0d{GaK2BqABw5 zWYeKUYAG9y>_)LK;SSl2q5wrtm;pN!*^T--+gPq`KsCVy6^_+kbgz$T&-tg2vSTeF3^<`3#-6(Dq2_w5v z{n2cCi~3cCi~3{=~F5IrTMiiR?!Gku7ww8x=-&qcSWR*^N4jB_AF{;=ISMUM3^y>>lF4+IXTp*N=`k!E+l_h=Jm3ja1PSQj>Ebqw z?M8iug=4!>D2q!>+ntoYj)h~pQQRj4Pna}j7ZguPx3O?+H)yfWblb2SSUKNO_-r4c+~QavYn_)E#mu^aU;GaS27 z8Rl_(Nb zUyj|V)5*=T8jyitnb*3I*(m->_$D$`rES`bseUyuXdy0tup-(8;tEnQ6&yf znAI{h(8Dvro2@+Fp@(k=%~PQCa9&5^36s|M(^PzWMJF7J8KQ3H#{+#i1!v5!<9~g7}UT14l>&m)z;EJ|3 zAm8!yWWS&17q+A>^)Cq4hBF5ivMdAB`M=s29Ox#($ygbGOd7p1$ATSxTwXddDZ-aw zrm%EY(pJl_`GFI^+Q!<(mPV)~D~(G!=#$=~mr5|DVI}w5Mw#nMG-5p5VGHU(!5B4{NrU-5PSeQE#Y=v{yxPV{_Yz_PR>?#NBbvlph|Y@*Z!LvQeOm z?}D2t~DR2qDAibe?!p>6cN)FZfoWf=~|!SZ;LO6aK^+pu+5kmaaDu)#*BBEiO) zHxkb~J{fJWd6ci6WN!<`L3>ji2c)iO9P<&kbrAJd;hoMUPJ)ddk35&(yLi@eT;xaO z{1KPpV4Vp#7?Mz;7MiI1vK;es^}WMUZgNgJlFc~Wb`wwtWst^p`TEJWdp_c}uZVgJ z!LO7N4L0u_&@R7G;Ah8yDiOb2eeZe5%qTB{<#z?*F2Awh$MLd%cz0X&1PLPxNmygn^5jyTgl0m)z2Be<0 zR`E>W0ayT>ivWv(_l{omw&)Np1CORy#weC6@(V7e^FBu8eT8_MBF9L2t>VRsS1aD2 zc&FkfMZRrdJ$}hV+^YDNqS&}X`Y(gnCE$p^|IL9uZKT5Mba#l{tIndXa)E6`^vEjF$|^UXZ@h>a_t=<$L7&~&kJ z1)A^6Sx#(R0iRS_Y+QjB8&|-;X?njrQ(kObAzf@-0ma4@aH{5ujVsX0lolITpvA@& zP;6WQ#l{s-Y+M1w#uZR(Tmhfg`eNe>^gBu?v4Gj{;fiA83bfd`0?yQQv2g`jY+M1w z#uZR(Tmi+#6;Nzk0ma4@P;6WQ#l{s-Y+M1w#uZR(Tmi+#6;Nzk0ma4@P;6WQ#l{s- zY+M1?Q2z=P8&|+@DJ?dxK;Ngd*ti0{S!uCx1-cy9H0w`OJX=xpwn!HnSHS<)bl&Kx zH%%xWLPY)qr4Lt}rRhyv=O~X`h}gj5eTsBeX}SJE%l!jC7Qs@=;pW7560K!MncAz~ zby9h@&wAI(`7p*%*ayr!_9hv z@v{!T8RmWAcGTvmvDFb5An#4&{Xz3y zcJh4Wy^ini+5V$WdVutoQ0En`bGwrlA`jpD@Arb{UE|~>koOewexZ45oxD8cJ%YSP zHLuCZ>xaDikoQx~Tj=EFBX1+}?$*4?PTm0I{U7Ari9AfN$aP#_T#FeTB{;YqC*hca zVIAw*SOb{w8Ze}TYlv1yO%NF1`RhJJ!up>1TXOR z@5y~@H@=v*uOH_JoDAcE{+AH3`tc)iNvVGP9YmoY=Y}fi$4|j?%Ie4OL9OofKZUVGG!--bq2KhEcOclz^qRX@(piA6ttJL^UI@fmC(){l$AG}ez_My|c+$Me8J^y4zKk$!vv z8J}!An@D|)jYj%$_GQQP&H)IZmb{w65EaS z~#rkpCwGr#bUu37ZqaWXlLAd&H8vbzf<3resSU>&{ z$sYCN!&x`hk1yeT#`VbA*U^EfI;KiQ>&MrU+!_5iuT`rbKari>UHb7wn4w^B z5q^z+{16P-pBw4Nc_%db@mZoDUqt=*tXlNWU#R-=7cfTu-=zjiQ%W)}nAS=$=*Ks5 z79#!lt)K#rJHz(q$LmV#s;V2y4jWfKuDs0Z>iPDJ|9BbB=Lp7iou zSJ2DP9av~o^DN82bpAhe2o6LMT)jNzFjmWhkOCv{Yl>nGYp{Yn$=#xrHz$-j_+0h; z_LcJQQGaa~5kCd3tjAe{a=P|I^L6*msPo^OBHo+?uadh-yvpVkO*|dgM$p(%+u_)I z?wdZIFSO12+Hu3sJN~)%9?kq7%{;#8ULiiyj5D-78hQ09wQDr;FqMOwKV%Yl7t9Ai zIS%*1U>_H`I{7#Ef|{Vc9rAexp4XY0M`evB^xY1OIvi)KM0*X z-ZVSGmvcQTO7X?-*jk6?T6j6?w8^JDYJ%2xXq!Xa9Xfl?Jp=ndojs;K3d}3QVdZ7! zmqfYdyv6@@#439u;lvty3em3jDb5d-LF7dotC&^fd1pFx97JBf#3_o?6=y2WRjg24 zs7Rd%>n%}SrdX@kpxC6?rr4=?rsCO(s}(N+j=%!`w&K%@Z!7Y@dFGE&oT9iy@l3^a ziu~7>L%dMvfol;V!9MUwG7LNX_#Ha;L3mU2+jH!N!0d14UI5>GcRrw}@6PkG>tFdB^zPUx zf&B?D58-#`+x@OQ{**l7x)ICkNpFmc#dR8%f3Qb=vphpEg$N1Ew$bGid5`r!jUTHm z&LE!13wau0!~8)~`4+wj%1?%Gnne6U(-i*JBtA_lKfD!?%uoD_)C~V{K%Ug1{Nk7S zMF55h9R6wjR^lb%Sjk`L<+m{7=QslIHvaCK&yye?G`1}7=?kNs`##7lH+caXeexrd zne>JpoFZ|3Iz!xia+M-VwX!FtOU6jsOxm}2lg43{F@hw2) zjCyA*zwMG&4c)zGa95XIbGh#s*5eYIf{s*mA3zLtp)7{xfvlL_dP>T z<+3Pi>yQu2)iR>N=1m1{17Y+mkrh6>#HSfBiemR~jEwhp3R11{;YjA&pvhNU>%{w)SSJI}nQT7DgfyZqq% zrrZCgTXXm|IQ`>2%JRD~hu`t|2v4#E&{nw#ab&gGtU`3WFYga%0OBrN$>B%7=u#9G<78!!=)MQxymPE} zEweCf?36H~!S>J67Txssa~ak3;C$9rz}Vw%B;C z87gq_|9AYG83oqneZ>ah7C#Q~550Z9HFm5tiabP&W{zue1S*sh(QKdoheRd$9}+kQ z_2^qHtH|#!Nb|ZU&QP4IxIpn##VW-HMP5Iww^~vD$Hc<9j5P2bMPBcH@=XT+*)M1#@@V%keMgf>-=|E_oF`Y_ZW~$twx? zH+l!Yv2YjM+@oJxYx8JZ*;LFQb+vialc1XG-L|Wbp8nQ1?f?~Fe}y5K3)Bd(JfRG{ z`1}X(V+B~QGzhR*&n9|DV8qOnv3L zD-0rogd+U%Not?}wI(_GWgY|fdn9r6R&FfH*gA-c9Qy@EG}t^ot8AQEd@so>#Ri*) zn|2pjY&B$)8;~{x2Ok9-2m5tA4qFFNc^~`&BN}YpY|vm4g%aEpS)cs!aaev!5w~>^ z^=`n$oMA+Roj=}vU4B{cD?}RkG2QaxGuGwz5cnO4G#hN*=}2(-O>z21`N#5GgSf3j z9g61au5J6ZO6p9G^ut*e(#w{nX?%@T4J;GRYtu90%u}W3_7(QLh0B!x+(E`B~bco8G%D z>-L20xh;}rZ{o16-QoNkOTljItnZ#N(p@Fr-t7u=CgMQZ*2=Oxzm#R|w|Guad^JU#)nL;tt8A&22j%lOA!n`4p{pyPlJ~kx3IT zm%`pAr9EO6L4O|R#vTNk-Ts*0J18jSjegh8$dx;{k=)V zFJ;x&Od{n>$f~yhy2`5m!wi*GpJ3TMbN~jWiV$aDPbjO7_x$4|zaqb5f{lx`dYp); zODV0+jil9QQ0=27r(*f`ET_UG)A&Qj&#j$U7M?Y3e8sFD-qG@Uv4ImeePH5Jp3nVo znA6LDN+Nj`cEB0Bdp~Oz0Q0wzSKqtnCxiWHh`ki0A*0JploNK`v}s3WO7JRrOh&dD zXG-uMwXUk8ZcL_RT5E0Hg4Px7HFfQ)GRMxJmzj{wPCVnV((z-wV|h=l;_hU)J3}-N z*+(p#K5v%SFMzssT*s>B&Z=r)XS=}$8~d2btL_T3PgGv?T(9-xRyxLQ_ zTzQq{z91aTkL8yuuks$mE5!y|?kFUP5qGnv6WZbR_zvfmA(`ZqIam&|5IKKii{n4 z+6th30V|8{pf3MC$e{KGX@7k|`XtY;>8#u!D2Fh}-RXT3Iya$3BXrL48E0TmAavGx z{tU^6%!%kjOcjxHhRB)ou|J5fLX(Nd@!MbCit-ifN8zm~7GKZO=0l#J9h)r+`tfBb z{yppRF4UDVIZu!=XAVqW>c=wX(@2eE%r=>pZe>h+zEOO4$e1$3kDiRl347mV%#X)b zfNsAza95eRHR97utT~QW@+kR1^o#g)Aa47BsCO0kbtj+k$>8#{@+kT7K4trNA>uB- zJHRi4G#hN*8YH;d_ToHJbw(&f?s#?=mz9j-YmBn3!*!D^d{sXtBqwC zXn&)-@#e~-N21(ari%R9wutCb6l!s@3X#~`UVu&vp8uEHVEI|vqMP3P`%`-rnA*L+ zFXc*&1O2q|e~UP{t#jVEa^kQn_X6-<(cNAEBa+Gk#mc9+O;b!Yk2kJ8>ij>>@@jMI zXCn(?d$v1cX*NEQY#lQ`&B<$@@ffs?tcY8_9f{-98aXszlc0rNc$&rBd^YpY>`*zJj6mGug>XFUZvz3c(?QS zL%Vww*O@H7o&{E@@gsq?uktEo0CUfL8Zj%cvLTS&zZ7*viEUnrzQ2+t|3{X-Mk;@9 zL4D6JW_6zT>|SkKQQcD2T-V_`H?D&H`sGZjt)naCU9x+%`|o7kg=TJ#+sdq0;n|(U zLZz(2CnU>}{;0{U>oJZS&~J{TH<^`t?QO79L9Wb79k`trqMes&#BCk&=&Q`i{jhkn zOaCZ&Sbp8fti18tVB5--S(iEe+n&ryAD$V@3~2e~%BttUQ--a9iI!GV361 z%*w381bCn5>psp)Q4hEs%Wz?dF-?-P5Xq&BE`QOKUQ|7Y7MgM zz5por`HwVYSA}X&kX>&!iTI`L`W=(Fj#Pfw2I#8br!LLPuFtb9|Ecw7`iwKMCuTG1 zbjg;@sMGn@(8#XSjqFPG{w$5QVb`XVU7-6?y^qLiSFXpNrPxP3zqD-5@qO5X$~oH) zhdHA!A!g-Qv;b-+#8(QGto;6pv0bFszDu3&Sl!fs`K|KGQMOm+J9uEG^)Zjr`L z0&h9?txyFsoglX((7f?bUhA#gSd_7K5S4eR=QEg*hT36=NAFCPczh2va`!}bADZ!Iq73?mxs{PBf>+rI*p_sEaw zmY-;MbjemaEer;q-5NI{i&K{j+`Ns|dG$qn!S2PpAJX_;vRV_3Pkgd2<}} zXE})x4L0w3(8%HgN5UbPi0;Ol`wn#m%JoI3Kbp~Tg*{2~xmdY^(DRwBQM1=Vu?50L^vp6#*MNj|Vnj!mAR0ND-vT0WC5pg^{%mykE<|G|^GpHDf$+3x4dw5!llcnaF%-_W ze~-43%Rv4T5g8GlL%#>T1dVR%Wd3aA#76XY*2(-WG8FptvwK zk&S(?2)~?v<78g;ycds1aiHNHCkU5J>UEa9lkSv*;!!E%Wd3TQN>awj{H;Qb9SHN0 zUif3vLKak;7v639JPB00m+NHy4yiXKbrh%az6XSwHn6e@Tplo7rl&GUjg9F4lzn-` z^x8U^KMc>$pm<^G6>@p%Q5n%|6g2Z6#>r)PGI^)=C%i)m%@wF zyfR@#pI4;oWS$qBIGLC0dR6cX6c3AE%u7GajB|n+n8L95<-Bx;Jv%peN%G&!!ztiw z=ZOLL(C5>C*lLvh8;ZG3=9z}8Gd-WZ=`W`+z;s_ga)7VX4Q6a-P~u4Z4to$k6v|yE z^GqX~-?H8)-;n*%o7t(+{&SLB;3XO1A$N_yOQ@6if8qb4CmkpAd^C~Ue&lwt&R8P- z1j)q#O9#ct^wDH~O0W#6xKz_a(Iv--zB-v7DAQY!9>}^&f=i?)k(2p*rJ=~lydfhe z^M*V#O^r&pEJ(}LuJ+S>*#sl{qlLc6Pq&h{V?R#ep>Oun|HF(r zrEmAs=ke6nE4|TAtCM+C{(j#}auB>2W!m=j66$209f*?iz2rof-pAYLG|+F;$-Fot zXbnhnS}$gQ+Ja^w;bfi>-nfK4oXm4c@)RgNoY#@-Wd1jp#C_*+y3YvMrkA`0zfn(y zd;9U~@rUs8#-d^7paidx{kVF4dyo00q(6w?Bt3s~ZRxrQzl(}_&xnLVQ-FTI{hJ^G z`5Te!AMPIuV4xHP%lLE??T=?;{-P1}*t0plh#5;q(7LZbUTV%C0pkoH*pR>AfOfp- z@{b@Nzv4jub)r0g{e#%mcC?i#q8AH)sIc^rHiRlD|O9jiKe z;;>UzqRc-q@_sV%7LQ4=PUI0)$MJ|oR-~{DaITPo>z#! zWzzX}yz~FKm%G#<`IWL`&S=GKA`Bfb?osG?Pm13s5rEX=fw&u~1mR8im>($22 zELv%7f`L`^v5GCyz&yCtx3zZQgRUJnCbq}UygA7{V{p;l-c;9uO%RxDud-%EdwX3= zXJrkj<*n_=Z|tb7IkU=~*)DJS|Nr&?j~jt_ey{A%JHY#|d-xdd^|tRt_&|WXBq4XN z_tX2B_qaomi|4tNgH*81zL|@pcKpM#42R-id3o>wdn%Vjo~?tZl)K7Fu+gbGzd96rs`3(g>+dp(6 z;&&n9whoyb0)81rG}yc~pk00=oc;|&o*i%QUhm_;?{+&#lp{YL8x#Q&{s~3HBufBo zyEh?@wG!zm4jbGzJ;jMAcUL$3$kzx#Ci844AF@c~KeC)}c9qDn+BJ%(cQe+@!Hj6I z{j;=1H~szCH^a3N2V>{GB1&+3!|`-2y({*9bFLT`;-KDQU!lwo^D;TK7YTKv)D^o* zs76%vj0|GFhoJp8j)gX;d5!k^EhE+%_u~h^F^c7ipH$@ig8B0lPf=`8sgi=7tzpeO=BL9gbpCZLF#X7}i#m^~zL6I&wrG3TQ6z^5!fA!4& zwc^`~e^<=MVrTv^#nFnh6z3~0Q*2Q@Tk$^?`3(s9+^_gc#n%=0!NtP-(Tc|^o}hS| zBLBN*xmAi6D*i;i%M_1R zoTs=%@pQ$r6u+Q&mEw04?@;`y;?s(o75}UlVgXD46^j**Qk<>0K(Si!48<=iUafee z;tv#`SA1RZZ;Ji+x(DM;D~?h;OmV8>iHge9eVDosy zH+oOMlB_6vmHXccGwafL)a+O26>f&jn-I@-_#7Xy8R>b05YHA;?|9;73~j)a?AljD z??mATD?p;FB(H46+O4Cq_iWyny`TJGS7-fZrWbf?Ur%ONOFH{PejBq-zv5?xyo%E` zU?_E(nf1_V*1S3#y3b^0E!tYYxoygiU*|r&0R2Fjydb-N?%(2iM>S+Y$Mx1Dt~M&fPD+1f>EN zP2>eP0^lb63%KP%!&wBXUk7s%BlDM_a3V7kRQ`?R(!GChZ6ToKF>j4ne?K_Zb4A{@f^_Q6l2-+LVcSc!wGO>VQ!@egkJ zCsJoI>rg`_Q;n!#se)9-q5AG0oX=pYHrJyw;RHL5=h)6+w$&$?S8iJszt0m5Rgl_* z$qNrRRAK5|Qb!nSXzF@$nPjNpsRKzJX{Zq?d9!_#p)y|K7*zZXni19JerzxD4-NvV zO%@Q<=HJOC_76Usqwd8&_|H&RRGTuhk$><{lhetj3yD-M8AblV*_R#j4_*RpRBb-Y znvs8S`d$r}Ya4ih{6*v@Ze_!*MkX`2>4i5MBAMEo zEF=HmpX5^N!9Vy4cIA7f-tg3$q;7u{zX4R6qUenLgP+OSz0>HuMy1xXf02LiTiM=S z*P)%D*s3Ik;?h@mP{ z`?F_}fAHm`p1N1Yu-FTz*s=b>Sz!oAH-wIkhmgd4{~Npg0~G7(A3QEx>lEfSI+Qh_ zlfdub%kbmVCAHxzG384w=wQx?AF)EMuOK1$BmD3*_g{k_s5XD*()b6g1dq4#(IZi9 z{umMX2PYHiUrs>T$OCvHeXL6+jW#Lv4}KEs9<6l?)1Lqj$3OT8);(5pv*~3l9Qz0V z1t)U4=1xktF*o)PzL2@GfAG;fBeS*e^z=DwDE1Hj8y1fJgWt)*Cure{H2)WH{DW7s zaO@wPSElP9d?Hyp{=t`V5RQNFzcBxtfP$r{HbwP$Zt!%Hw5T>Y+j(UiPAFRGVJlFU zg0!eMQAxv_unS>$|LaECP1kj8`G^$&gp$=E;mNo2Jw7$8#%)#fMJ563^asK2YF z<*<0YpRQnAj(_kqWasz?=MxU9O*S4DL$!G{BaVOYd8D`FA3Ru!0z2X#{739?>>r%g z?x5PN#(08as5TkljY}?5s5aX{7oiEIhpz)Is!d+2)<5_vPRh>t2QL9{ET+f7c2Hs? zev@19!?mS1ir`KZ@cSh?(5YYoGxk3aVvm16+V@AwA|(sTGf-{T<4cE(XM4OK0*RC6^~cebvqu^JhxL&G<#wdIq%%DU#d_T_agHBik& z>amqI?VYX7)wasYnhv2mG$H;Jq^km_sk+|y%x#+pbs7{wZoBZ~?69PUucNLeN5R)c zCup4TR>OdzQ3y7`ej=x#-m7eFsiY#W(r5!~T3b(VWTB4bO)KgQOa3R|I#7g)u8NvN z)jmPH2%^2N1J0?jd$6+Rvz?+#Y^|^7W@Pl8BgVMx6m->UnNfl{WwQ`*32b5>sDaYDzu6FMFkt?@M z-wvP;M(f$q*jnA8)|I-RMfSR?$>>(QC|b>QVG!st#+0LWHQFnA2P)&NTvZ2`NIRiS zZK*r66X#ge#;urJvnr9$QQKJC*wRQPailJud&0CimGfszTQq;ctdnL`F62qAs*UH^ zsF$6w%IP8RRidplZsIE|P498qskSu!<86|o&BUz;OQ;3D-K|~|XSIsg7*1eaRSUNI zRW?_hsf!DGPj4mK6LvMNE4VN!KU>8$inU*dWf$qWt?t=$SGCpA6<=B1bh=q`GAWH* zaCLR)1*eLO4{P=G%BCu#KUZzGxS+3GG`AHl!@Bx_w|$RwvMX9vbkx;W@|IwA<5)GV zE5KYXDXwp}+H`n%m01{ABV$*0>J^>Xi_q6V{TQC{@-C2ds1tCX1NP~VtLt2cmx&pa<-0}JXE{7%w$XJ` zf8+*B9*RVkmuDcbr*c{3**b_yxfUnEMyKYK zF&}YT2T|`SyzRQuNwCpeUFXITW?baQ@!5H)M%>mx)T_n&*|Cghu=7kQ)$QN?;K%o~ zfJJ1qNx!iBEo<+I7=sG>TSmwVVz3DnD zuwIVsrd=mVq8ytIAC#{19ovB}XO{EGl@y0vsq1_fY^m$yJ2)G-en(mYNV+tK=6~)s zFyAU8YCP42#?LZ7yRmH#kMriL(_t@#kNOVtSZ{1@ThU%u$$gs$O*p70-9p4Vc$n%* zOA$uBg%%&oC^t%J@xcsQd@uvsG+lf!gBBmmK=Hv0yg~ED2Qz4F2o}CSSKO-j2gP?4 zQ-LWbKA2HYd@uv~s)79$AI!iSrO#00R~^j%uA=y01}#3Af#QQ1C_b2h;)59|KA3^x zgBd73n1Rc1Lm)r#!3-21%)r|&8f#QQ1_@t(b4`$G> zD=j{lLBp-A)Ds`fphqcvnBr7L@xhGzWlFayiVtR_iw|a?_+SQ#4`!hFU)+@^1d*q7`W}x_B28s`6p!i@0iVtR> z_+SQ#4`!hFU_+SQhsNPe2FoV8QY4O1f`ZlG-2Q%nj zC@nsiK_~D)<#@{#rzwgLW~5)F^j5_;72j19y(!jS3J);qJ4X{y?=xK2p!tmLi=OoV E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_r4/gnu/example_build/libgcc.a b/ports/cortex_r4/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_r4/gnu/readme_threadx.txt b/ports/cortex_r4/gnu/readme_threadx.txt new file mode 100644 index 00000000..c89d5940 --- /dev/null +++ b/ports/cortex_r4/gnu/readme_threadx.txt @@ -0,0 +1,496 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R4 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-r4 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-r4 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R4 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/gnu/src/tx_thread_context_restore.S b/ports/cortex_r4/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..8f37269c --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,256 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif +@ + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_context_save.S b/ports/cortex_r4/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..52447586 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..5437c7af --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,247 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..48ebb94f --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..e30a7146 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..7679d8aa --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..cbe76857 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..9fe7a729 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..e89b7999 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..c5800dfe --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..c7675bf2 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_schedule.S b/ports/cortex_r4/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..365e5678 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_schedule.S @@ -0,0 +1,250 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + BL _tx_execution_thread_enter @ Call the thread execution enter function +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt +@ +_tx_solicited_return: +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 @ Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously + MSR CPSR_cxsf, r0 @ Recover CPSR +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ +@ +#ifdef TX_ENABLE_VFP_SUPPORT + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +@ + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +#endif + diff --git a/ports/cortex_r4/gnu/src/tx_thread_stack_build.S b/ports/cortex_r4/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..2b573dce --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the ARM9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_system_return.S b/ports/cortex_r4/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..9d18837f --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_system_return.S @@ -0,0 +1,177 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Lockout interrupts. */ +@ + MRS r1, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + LDR r5, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r6, [r5] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r0, [r6, #144] @ Pickup the VFP enabled flag + CMP r0, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r4, FPSCR @ Pickup the FPSCR + STR r4, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif +@ + MOV r0, #0 @ Build a solicited stack type + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r6, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r6, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r5] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..9f69fa32 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_r4/gnu/src/tx_timer_interrupt.S b/ports/cortex_r4/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..629e0928 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_r4/iar/example_build/azure_rtos.eww b/ports/cortex_r4/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_r4/iar/example_build/cstartup.s b/ports/cortex_r4/iar/example_build/cstartup.s new file mode 100644 index 00000000..7a46bec0 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/cstartup.s @@ -0,0 +1,163 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 49919 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __iar_program_start + EXTERN Undefined_Handler + EXTERN SWI_Handler + EXTERN Prefetch_Handler + EXTERN Abort_Handler + EXTERN IRQ_Handler + EXTERN FIQ_Handler + + DATA + +__iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__vector: ; Make this a DATA label, so that stack usage + ; analysis doesn't consider it an uncalled fun + + ARM + + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + + DATA + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD Undefined_Handler +SWI_Addr: DCD SWI_Handler +Prefetch_Addr: DCD Prefetch_Handler +Abort_Addr: DCD Abort_Handler +IRQ_Addr: DCD IRQ_Handler +FIQ_Addr: DCD FIQ_Handler + + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reset execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + + EXTERN __cmain + REQUIRE __vector + EXTWEAK __iar_init_core + EXTWEAK __iar_init_vfp + + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +#define MODE_MSK 0x1F ; Bit mask for mode bits in CPSR + +#define USR_MODE 0x10 ; User mode +#define FIQ_MODE 0x11 ; Fast Interrupt Request mode +#define IRQ_MODE 0x12 ; Interrupt Request mode +#define SVC_MODE 0x13 ; Supervisor mode +#define ABT_MODE 0x17 ; Abort mode +#define UND_MODE 0x1B ; Undefined Instruction mode +#define SYS_MODE 0x1F ; System mode + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Turn on core features assumed to be enabled. + FUNCALL __iar_program_start, __iar_init_core + BL __iar_init_core + + ;; Initialize VFP (if needed). + FUNCALL __iar_program_start, __iar_init_vfp + BL __iar_init_vfp + +;;; +;;; Add more initialization here +;;; + +;;; Continue to __cmain for C-level initialization. + + FUNCALL __iar_program_start, __cmain + B __cmain + + END diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.c b/ports/cortex_r4/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..983109cc --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.c @@ -0,0 +1,376 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.dep b/ports/cortex_r4/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..6c811ae0 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.dep @@ -0,0 +1,253 @@ + + + 4 + 1024685290 + + Debug + + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\rti.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\rti.__cstat.et + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\lib\sh7Sxs_b.a + $PROJ_DIR$\tx_api.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\Debug\List\cstartup.lst + $TOOLKIT_DIR$\inc\intrinsics.h + $PROJ_DIR$\Debug\Obj\rti.o + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\ycheck.h + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\lib\rt7Sx_tb.a + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\Debug\Obj\rti.pbi + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\cstartup.s + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\lib\dl7Sx_tbn.a + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\TX_ILL.s79 + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\rti.c + $TOOLKIT_DIR$\inc\string.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\lib\m7Sx_tbv.a + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + [ROOT_NODE] + + + ILINK + 1 48 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 48 + + + + + ILINK + 40 28 19 33 58 10 25 59 43 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 50 + + + BICOMP + 30 + + + + + ICCARM + 11 18 60 23 8 12 49 61 6 14 21 54 56 16 + + + BICOMP + 11 18 60 23 8 12 61 6 14 21 54 56 16 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 39 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 58 20 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 58 20 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 19 + + + BICOMP + 51 + + + __cstat + 62 + + + + + ICCARM + 38 37 22 5 47 0 63 45 2 57 3 55 13 35 36 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 28 15 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 28 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 41 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 9 + + + + + ICCARM + 11 18 + + + + + $PROJ_DIR$\rti.c + + + ICCARM + 17 + + + BICOMP + 29 + + + __cstat + 7 + + + + + ICCARM + 4 + + + BICOMP + 4 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.ewd b/ports/cortex_r4/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..28a9ad4c --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.ewp b/ports/cortex_r4/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..7557efe5 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2140 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.ewt b/ports/cortex_r4/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..77fe620f --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.icf b/ports/cortex_r4/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..13723763 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; +define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define symbol __region_DRAM_start__ = 0x80000000; +define symbol __region_DRAM_end__ = 0x807FFFFF; +define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; +place in DRAM_region { section DRAM }; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..d635fcef --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 248 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000004A00259600000200000013860000010000002981000002000000578600000100000003DA000001000000108600005F00000001840000010000005992000001000000268100000100000000DA00000200000008B000000200000015810000030000005486000001000000568400000100000029E10000020000002392000001000000ED8000000100000020810000010000000F810000010000000A860000010000000C810000160000000D8000000100000001E10000010000001D81000001000000EA8000000100000008DA000001000000048600000100000003DC00000100000005DA000001000000249600000100000017810000020000005686000006000000038400000500000002DA00000100000028810000010000009A86000001000000148100000300000007B0000001000000008400000100000000810000030000000C8600000100000003E10000010000001A86000001000000EC800000010000005E860000030000001F8100000100000009860000010000000E81000001000000E9800000010000000B8100000200000000E1000001000000148600002500000004DA00000100000058860000010000001882000003000000118600002500000002840000010000000086000001000000F480000001000000558600000100000009B0000001000000239600000800000001DA00000100000024810000010000004681000028000000EE8000000100000003B000000100000008860000010000000D81000002000000EB800000010000005D86000001000000E88000000100000006DA0000010000001686000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 000000007E040000000A000065050000 + 0000000067040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000004001000063040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF400100003200000044010000630400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000063040000000A000067040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E650080000001000000000000007E040000000A0000650500000000000067040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..2c5210a4 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..1abcd287 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..529ac91f --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R4" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE32" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..9ea83d29 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.crun b/ports/cortex_r4/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..87de74d4 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1797 @@ + + + + + + + 447 + 27 + 27 + 2010398909 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + 47 + 1666 + + + 20 + 915 + 244 + 61 + + + + 2 + 0 + 0 + + + + + + 3 + 0 + 0 + + + 0 + 1 + 0 + + + + + + + + 2 + 0 + 0 + + + 187 + 100 + 100 + 100 + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + + + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 161 + 150 + 100 + 100 + + + + + + + + TabID-32281-8114 + Workspace + Workspace + + + <ws> + <ws>/sample_threadx + <ws>/sample_threadx/Common sources + <ws>/sample_threadx/Common sources/tx_cstartup.s79 + sample_threadx + sample_threadx/Output + sample_threadx/Output/sample_threadx.out + sample_threadx/Output/sample_threadx.out/Output + + + + + 0 + + + + + TabID-31758-8124 + Debug Log + Debug-Log + + + + TabID-9738-8128 + Build + Build + + + + TabID-20156-25745 + Breakpoints + Breakpoints + + + 0 + + + + + TabID-19697-5905 + Thread List + TX-THREAD + + 1 + + + + TabID-19175-5914 + Message Queues + TX-MESSAGEQUEUE + + + TabID-29400-5927 + Semaphores + TX-SEMAPHORE + + + TabID-6858-5940 + Mutexes + TX-MUTEX + + + TabID-6335-5950 + Byte Pools + TX-BYTEPOOL + + + TabID-16561-5963 + Block Pools + TX-BLOCKPOOL + + + TabID-26786-5976 + Timers + TX-TIMER + + + TabID-26264-5986 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + TabID-4531-19825 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 40 + 1720 + 1720 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 572 + 521 + -2 + -2 + 151 + 168 + 99473 + 181425 + 344532 + 619870 + + + + + + + + + + + -2 + -2 + 572 + 307 + -2 + -2 + 214 + 217 + 140975 + 234341 + 203557 + 619870 + + + + + + + + + + + -2 + -2 + 65 + 1520 + -2 + -2 + 1522 + 67 + 1002635 + 72354 + 99473 + 181425 + + + + + + + + + 63 + -2 + 261 + 1520 + -2 + 63 + 1522 + 198 + 1002635 + 213823 + 142292 + 213823 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + Disassembly + _I0 + + + 500 + 20 + + + 0x3e94 + 0x9ec + 0x1c9c + IRQ_Handler + + 1 + 1 + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + E80000004A00259600000200000013860000010000002981000002000000578600000100000003DA000001000000108600005F00000001840000010000005992000001000000268100000100000000DA00000200000008B000000200000015810000030000005486000001000000568400000100000029E10000020000002392000001000000ED8000000100000020810000010000000F810000010000000A860000010000000C810000160000000D8000000100000001E10000010000001D81000001000000EA8000000100000008DA000001000000048600000100000003DC00000100000005DA000001000000249600000100000017810000020000005686000006000000038400000500000002DA00000100000028810000010000009A86000001000000148100000300000007B0000001000000008400000100000000810000030000000C8600000100000003E10000010000001A86000001000000EC800000010000005E860000030000001F8100000100000009860000010000000E81000006000000E9800000010000000B8100000200000000E1000001000000148600002500000004DA00000100000058860000010000001882000003000000118600002500000002840000010000000086000001000000F480000001000000558600000100000009B0000001000000239600000800000001DA00000100000024810000010000004681000028000000EE8000000100000003B000000100000008860000010000000D81000002000000EB800000010000005D86000001000000E88000000100000006DA0000010000001686000001000000 + + + 41000D8400000F84000008840000FFFFFFFF54840000328100001C81000009840000D4840000E8800000838600005886000001B0000002B0000003B0000004B0000005B0000006B0000007B0000008B0000009B000000AB000000BB000000CB000000DB000000EB000000FB0000000B000002481000000880000018800000288000003880000048800000588000000DA000001DA000002DA000003DA000004DA000005DA000006DA000007DA000008DA000009DA00000ADA00000BDA00000CDA00000DDA00001B8600001C8600001D8600001E8600005A8600005B86000053860000A4860000A3860000439200001E920000289200002992000024960000259600001F960000 + 3A00028600000F0000005786000018000000268100005B0000001581000052000000599200002400000029E100006F00000007E1000069000000239200000000000004E10000670000000A8600002A0000000D8000004400000001E1000064000000008D00001D00000007860000270000001D920000110000000486000024000000018600000E00000017810000540000009A8600001600000014810000510000000084000077000000259200001900000030840000810000000E8400007F0000000081000046000000449200002200000025E100006D00000003E10000660000001A8600003100000009860000290000001F9200001F00000022E100006A0000000B8100004C00000000E10000630000008E8600003A00000006860000260000002D92000021000000038600001000000041E10000740000006986000037000000008600000D0000001681000053000000558600000600000023960000870000000E86000017000000518400008500000005E10000680000000B8600002B00000024E100006C0000000D8100004E00000002E1000065000000A18600003B000000C3860000030000000886000028000000C08600000A000000168600003000000005860000250000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 34050000AF0400005606000060050000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 4294967295 + 000000004900000006010000CA020000 + 000000004C0000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34062 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34094 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 7A0000005F000000FA020000F0000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 7A0000005F00000080010000C0010000 + D504000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34066 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0x080018c4 + 0x080001f8 + 0x08001cac + 0x080002f8 + + 0 + 134224072 + 134224072 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 8389003 + + + 34070 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 7A0000005F00000080010000C0010000 + C405000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + Access + Current CPU Registers + Value + + + 180 + 180 + 180 + + + sctlr + + 0 + + + 34076 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 7A0000005F0000009C01000010010000 + 0000000002020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + ID + Max Stack Usage + Name + Priority + Run Count + Stack End + Stack Ptr + Stack Size + Stack Start + State + + + 125 + 125 + 100 + 65 + 75 + 125 + 125 + 75 + 125 + 100 + + + + 34091 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 7A0000005F00000080010000C0010000 + 040000004A000000020100008A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34107 + 7A0000005F00000080010000C0010000 + 00000000600000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34096 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 7A0000005F0000002802000020010000 + 0000000000000000AE010000C1000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 7A0000005F00000080010000C0010000 + F10700004C000000000A000099040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 173 + 150 + 100 + 100 + + + + 34104 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 000000007E000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000040000001000000FFFFFFFFFFFFFFFFED0700004C000000F1070000990400000100000002000010040000000100000028F9FFFFC4010000378500000000000000000000000000000000000001000000378500000100000037850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A01000099040000010000000200001004000000010000000000000000000000FFFFFFFF010000003B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CA020000000000004C0000000601000099040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000003B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF3B85000001000000FFFFFFFF3B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF00000000FE010000A4060000020200000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001D85000000000000000000000000000000000000010000001D850000010000001D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001C85000000000000000000000000000000000000010000001C850000010000001C850000000000000040000000000000FFFFFFFFFFFFFFFFC005000032000000C4050000B3020000000000000200000004000000010000001CFBFFFFFE0000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EE010000D1040000F2010000000000000100000004000000010000000000000000000000FFFFFFFF0400000015850000168500001785000018850000018000800000000000000000000009020000D1040000CA02000000000000F2010000D1040000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001585000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001685000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001785000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001885000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1585000001000000FFFFFFFF15850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000128500000000000000000000000000000000000001000000128500000100000012850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFFD104000032000000D5040000B30200000000000002000000040000000100000000F9FFFFB50000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF08000000058500000C8500000E8500000F850000108500002E85000036850000048500000180008000000100000000000000CE020000A40600007F030000000000009D040000000A00004E050000000000004080005608000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000C85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000002E85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B42007200650061006B0070006F0069006E0074007300010000000485000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000A406000004020000000000000100000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000080000000000000FFFFFFFFFFFFFFFF00000000B4020000A4060000B8020000000000000100000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000080000000000000FFFFFFFFFFFFFFFF0000000020020000A406000024020000000000000100000004000000010000000000000000000000FFFFFFFF010000004285000001800080000000000000000000003B020000A4060000CB0200000000000024020000A4060000B4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000004285000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF4285000001000000FFFFFFFF42850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000063000000FFFEFF000000000000000000000000000100000001000000018001E100000000000064000000FFFEFF000000000000000000000000000100000001000000018003E100000000040066000000FFFEFF0000000000000000000000000001000000010000000180008100000000000047000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000040069000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040070000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005A000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018029E10000000004006F000000FFFEFF0000000000000000000000000001000000010000000180028100000000040049000000FFFEFF000000000000000000000000000100000001000000018029810000000004005E000000FFFEFF000000000000000000000000000100000001000000018027810000000004005C000000FFFEFF000000000000000000000000000100000001000000018028810000000004005D000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040056000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040057000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004D000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004E000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000062000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000058000000FFFEFF0000000000000000000000000001000000010000000180208100000000000059000000FFFEFF0000000000000000000000000001000000010000000180468100000000020060000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + 34108 + 4608000060000000F4090000F0000000 + 040000003C020000AA0100009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 46080000600000006809000010010000 + 0000000038020000A4060000B4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 46080000600000004C090000C0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + 4608000060000000F409000020010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 46080000600000006809000010010000 + 00000000B8020000A406000068030000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 46080000600000006809000010010000 + 0000000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34127 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34123 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..a6623ee1 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,130 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 2137572426 + + + 0 + + + HL512000 + + 0 + 2 + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + 0 + 1 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 + + + 0 + + + 1 + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups b/ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat b/ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat new file mode 100644 index 00000000..192ce771 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat @@ -0,0 +1,32 @@ +# config version=3.5 +$ sepk + pod_drvr=jioxds110.dll + pod_port=0 + pod_serial=HL512000 +$ / +$ product + title="Texas Instruments XDS110 USB" + alias=TI_XDS110_USB + name=XDS110 +$ / +$ uscif + tdoedge=FALL + tclk_program=DEFAULT + tclk_frequency=2.5MHz +$ / +$ dot7 + dts_usage=nothing +$ / +$ swd + swd_debug=disabled + swo_data=aux_uart +$ / +@ icepick family=icepick_c irbits=6 drbits=1 subpaths=2 + & port17 address=17 default=no custom=no force=yes pseudo=no + & port16 address=16 default=no custom=no force=yes pseudo=no + @ dap family=cs_dap irbits=4 drbits=1 subpaths=1 identify=0 + & portr4 type=debug address=0 default=no custom=no force=no pseudo=no + @ cortexr4 family=cortex_rxx irbits=0 drbits=0 address=0x80001000 identify=0x02000100 traceid=0x0 + & / + & / +# / diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..529ac91f --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R4" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE32" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.crun b/ports/cortex_r4/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.dbgdt b/ports/cortex_r4/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.dnx b/ports/cortex_r4/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r4/iar/example_build/tx.dep b/ports/cortex_r4/iar/example_build/tx.dep new file mode 100644 index 00000000..09806296 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.dep @@ -0,0 +1,10488 @@ + + + 4 + 554479155 + + Debug + + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Tx_qig.c + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 64 157 355 486 629 705 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 64 157 505 + + + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 868 306 522 429 280 484 369 524 670 439 722 751 702 432 610 42 408 314 745 710 572 44 616 47 708 915 923 941 703 807 936 383 7 322 873 406 795 786 904 445 318 921 674 721 885 856 520 734 617 279 631 323 331 434 578 28 444 360 886 531 40 785 611 397 405 528 749 328 842 46 325 756 832 744 560 337 794 684 783 659 595 830 942 719 567 443 538 459 573 312 655 945 634 563 416 384 808 8 5 792 798 717 56 928 357 456 803 388 311 854 37 551 667 789 612 944 742 546 508 411 727 51 765 594 822 512 412 894 652 882 374 735 888 298 782 344 620 9 938 17 41 301 932 511 54 451 557 859 600 682 869 922 381 724 494 809 436 879 570 425 678 373 305 27 351 947 907 294 853 579 864 821 813 849 624 435 309 577 50 558 712 476 393 303 501 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 64 157 486 739 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 64 157 705 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 656 + + + BICOMP + 868 + + + __cstat + 514 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 65 + + + BICOMP + 441 157 604 120 64 65 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 673 + + + BICOMP + 306 + + + __cstat + 804 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 65 + + + BICOMP + 441 157 604 120 64 65 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 861 + + + BICOMP + 807 + + + __cstat + 548 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 84 + + + BICOMP + 84 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 644 + + + BICOMP + 280 + + + __cstat + 627 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 65 + + + BICOMP + 217 604 441 64 65 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 857 + + + BICOMP + 751 + + + __cstat + 386 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 81 + + + BICOMP + 157 332 477 120 450 564 604 64 81 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 858 + + + BICOMP + 702 + + + __cstat + 638 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 81 + + + BICOMP + 564 450 604 217 332 477 64 81 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 812 + + + BICOMP + 408 + + + __cstat + 532 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 332 477 81 450 564 604 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 356 + + + BICOMP + 42 + + + __cstat + 906 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 332 477 81 450 564 604 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 545 + + + BICOMP + 432 + + + __cstat + 463 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 81 + + + BICOMP + 564 81 450 604 217 332 477 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 910 + + + BICOMP + 572 + + + __cstat + 647 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 81 + + + BICOMP + 564 81 450 604 217 157 332 477 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 35 + + + BICOMP + 610 + + + __cstat + 622 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 81 + + + BICOMP + 564 450 604 217 332 477 64 81 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 433 + + + BICOMP + 44 + + + __cstat + 403 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 84 + + + BICOMP + 450 304 120 780 64 84 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 834 + + + BICOMP + 369 + + + __cstat + 890 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 441 604 65 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 21 + + + BICOMP + 522 + + + __cstat + 500 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 65 + + + BICOMP + 217 604 441 64 65 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 784 + + + BICOMP + 314 + + + __cstat + 399 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 332 477 81 450 564 604 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 420 + + + BICOMP + 745 + + + __cstat + 650 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 81 + + + BICOMP + 564 81 450 604 217 332 477 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 15 + + + BICOMP + 439 + + + __cstat + 22 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 65 + + + BICOMP + 65 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 473 + + + BICOMP + 429 + + + __cstat + 641 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 65 + + + BICOMP + 65 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 552 + + + BICOMP + 722 + + + __cstat + 499 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 81 + + + BICOMP + 157 332 477 120 450 564 604 64 81 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 750 + + + BICOMP + 670 + + + __cstat + 288 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 65 + + + BICOMP + 65 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 535 + + + BICOMP + 616 + + + __cstat + 537 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 84 + + + BICOMP + 157 780 450 217 304 64 84 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 43 + + + BICOMP + 47 + + + __cstat + 34 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 84 + + + BICOMP + 84 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 492 + + + BICOMP + 708 + + + __cstat + 410 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 84 + + + BICOMP + 157 84 780 450 217 304 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 893 + + + BICOMP + 915 + + + __cstat + 609 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 84 + + + BICOMP + 157 780 450 217 304 64 84 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 833 + + + BICOMP + 941 + + + __cstat + 295 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 450 304 84 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 651 + + + BICOMP + 484 + + + __cstat + 840 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 441 604 65 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 863 + + + BICOMP + 703 + + + __cstat + 390 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 450 304 84 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 934 + + + BICOMP + 524 + + + __cstat + 566 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 441 604 65 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 530 + + + BICOMP + 936 + + + __cstat + 800 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 84 + + + BICOMP + 157 780 450 217 304 64 84 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 773 + + + BICOMP + 710 + + + __cstat + 354 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 81 + + + BICOMP + 332 477 120 157 450 564 604 64 81 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 428 + + + BICOMP + 923 + + + __cstat + 768 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 450 304 84 780 64 157 604 441 274 332 564 477 308 + + + + + [ROOT_NODE] + + + IARCHIVE + 695 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 701 + + + BICOMP + 832 + + + __cstat + 474 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 370 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 738 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 847 + + + BICOMP + 531 + + + __cstat + 599 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 157 121 217 604 441 64 120 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 589 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 755 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 872 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 407 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 338 + + + BICOMP + 842 + + + __cstat + 771 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 584 + + + BICOMP + 684 + + + __cstat + 699 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 424 + + + BICOMP + 783 + + + __cstat + 536 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 608 + + + BICOMP + 560 + + + __cstat + 787 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 157 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 899 + + + BICOMP + 749 + + + __cstat + 603 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 441 604 121 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 496 + + + BICOMP + 659 + + + __cstat + 361 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 157 332 477 217 450 564 604 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 806 + + + BICOMP + 595 + + + __cstat + 574 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 157 450 564 604 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 820 + + + BICOMP + 328 + + + __cstat + 681 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 441 604 121 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 273 + + + BICOMP + 886 + + + __cstat + 895 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 131 + + + BICOMP + 157 780 217 274 308 64 131 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 541 + + + BICOMP + 785 + + + __cstat + 446 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 121 + + + BICOMP + 157 217 604 441 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 823 + + + BICOMP + 611 + + + __cstat + 592 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 845 + + + BICOMP + 397 + + + __cstat + 767 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 275 + + + BICOMP + 528 + + + __cstat + 669 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 441 604 121 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 358 + + + BICOMP + 325 + + + __cstat + 810 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 121 + + + BICOMP + 157 217 604 441 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 642 + + + BICOMP + 756 + + + __cstat + 621 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 136 + + + BICOMP + 136 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 339 + + + BICOMP + 405 + + + __cstat + 819 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 121 + + + BICOMP + 157 217 604 441 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 758 + + + BICOMP + 794 + + + __cstat + 430 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 + + + BICOMP + 604 274 120 157 441 64 136 332 780 450 304 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 892 + + + BICOMP + 40 + + + __cstat + 793 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 121 + + + BICOMP + 441 157 604 120 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 723 + + + BICOMP + 46 + + + __cstat + 686 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 754 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 462 + + + BICOMP + 337 + + + __cstat + 649 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 409 + + + BICOMP + 744 + + + __cstat + 683 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 157 332 477 217 450 564 604 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 319 + + + BICOMP + 434 + + + __cstat + 422 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 274 308 131 780 64 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 931 + + + BICOMP + 445 + + + __cstat + 829 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 138 + + + BICOMP + 780 450 217 304 64 138 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 482 + + + BICOMP + 578 + + + __cstat + 839 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 274 308 131 780 64 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 637 + + + BICOMP + 360 + + + __cstat + 704 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 908 + + + BICOMP + 7 + + + __cstat + 521 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 136 120 181 121 131 84 138 65 81 + + + BICOMP + 121 65 780 217 120 84 157 274 308 64 136 181 131 138 81 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 438 + + + BICOMP + 873 + + + __cstat + 796 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 + + + BICOMP + 604 441 136 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 732 + + + BICOMP + 786 + + + __cstat + 752 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 837 + + + BICOMP + 904 + + + __cstat + 364 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 157 304 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 675 + + + BICOMP + 406 + + + __cstat + 404 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 138 + + + BICOMP + 450 157 304 120 780 64 138 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 781 + + + BICOMP + 721 + + + __cstat + 468 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 415 + + + BICOMP + 322 + + + __cstat + 764 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 604 450 181 564 136 332 477 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 507 + + + BICOMP + 885 + + + __cstat + 29 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 138 + + + BICOMP + 157 450 304 120 780 64 138 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 633 + + + BICOMP + 383 + + + __cstat + 380 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 138 + + + BICOMP + 138 332 477 136 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 715 + + + BICOMP + 921 + + + __cstat + 889 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 450 304 138 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 470 + + + BICOMP + 856 + + + __cstat + 836 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 639 + + + BICOMP + 734 + + + __cstat + 417 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 131 + + + BICOMP + 780 217 274 308 64 131 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 372 + + + BICOMP + 674 + + + __cstat + 643 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 450 304 138 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 523 + + + BICOMP + 631 + + + __cstat + 625 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 157 780 217 274 308 64 120 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 442 + + + BICOMP + 331 + + + __cstat + 489 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 274 308 131 780 64 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 25 + + + BICOMP + 444 + + + __cstat + 587 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 157 131 780 217 274 308 64 120 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 760 + + + BICOMP + 323 + + + __cstat + 824 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 131 + + + BICOMP + 780 217 274 308 64 131 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 865 + + + BICOMP + 318 + + + __cstat + 550 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 450 304 138 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 296 + + + BICOMP + 795 + + + __cstat + 367 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 217 138 + + + BICOMP + 138 780 450 120 304 64 217 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 841 + + + BICOMP + 520 + + + __cstat + 848 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 131 + + + BICOMP + 274 308 120 157 780 64 131 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 918 + + + BICOMP + 617 + + + __cstat + 676 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 586 + + + BICOMP + 279 + + + __cstat + 692 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 646 + + + BICOMP + 28 + + + __cstat + 460 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 362 + + + BICOMP + 8 + + + __cstat + 876 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 472 + + + BICOMP + 798 + + + __cstat + 776 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 780 450 181 304 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 640 + + + BICOMP + 717 + + + __cstat + 933 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 157 304 217 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 875 + + + BICOMP + 634 + + + __cstat + 762 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 120 + + + BICOMP + 450 120 304 217 780 64 181 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 844 + + + BICOMP + 357 + + + __cstat + 10 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 157 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 891 + + + BICOMP + 456 + + + __cstat + 14 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 + + + BICOMP + 780 450 181 157 304 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 645 + + + BICOMP + 803 + + + __cstat + 12 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 181 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 349 + + + BICOMP + 56 + + + __cstat + 503 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 157 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 513 + + + BICOMP + 388 + + + __cstat + 630 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 619 + + + BICOMP + 792 + + + __cstat + 272 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 780 64 181 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 276 + + + BICOMP + 563 + + + __cstat + 779 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 737 + + + BICOMP + 459 + + + __cstat + 763 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 815 + + + BICOMP + 928 + + + __cstat + 661 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 157 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 660 + + + BICOMP + 719 + + + __cstat + 55 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 136 + + + BICOMP + 136 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 797 + + + BICOMP + 830 + + + __cstat + 606 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 157 780 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 423 + + + BICOMP + 655 + + + __cstat + 666 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 157 450 604 564 120 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 880 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 300 + + + BICOMP + 5 + + + __cstat + 23 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 780 64 181 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 335 + + + BICOMP + 416 + + + __cstat + 518 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 217 + + + BICOMP + 450 217 304 181 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 389 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 376 + + + BICOMP + 942 + + + __cstat + 490 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 478 + + + BICOMP + 443 + + + __cstat + 504 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 753 + + + BICOMP + 538 + + + __cstat + 448 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 157 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 766 + + + BICOMP + 567 + + + __cstat + 39 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 519 + + + BICOMP + 573 + + + __cstat + 487 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 157 450 604 564 120 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 748 + + + BICOMP + 312 + + + __cstat + 555 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 469 + + + BICOMP + 945 + + + __cstat + 347 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 120 + + + BICOMP + 450 120 157 304 217 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 391 + + + BICOMP + 384 + + + __cstat + 852 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 665 + + + BICOMP + 808 + + + __cstat + 632 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 780 450 120 157 304 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 427 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 382 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 315 + + + BICOMP + 727 + + + __cstat + 20 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 543 + + + BICOMP + 765 + + + __cstat + 342 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 392 + + + BICOMP + 37 + + + __cstat + 747 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 877 + + + BICOMP + 594 + + + __cstat + 345 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 497 + + + BICOMP + 51 + + + __cstat + 350 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 340 + + + BICOMP + 512 + + + __cstat + 598 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 65 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 900 + + + BICOMP + 894 + + + __cstat + 613 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 65 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 466 + + + BICOMP + 652 + + + __cstat + 271 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 65 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 580 + + + BICOMP + 667 + + + __cstat + 725 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 615 + + + BICOMP + 789 + + + __cstat + 267 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 648 + + + BICOMP + 854 + + + __cstat + 1 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 556 + + + BICOMP + 742 + + + __cstat + 495 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 498 + + + BICOMP + 822 + + + __cstat + 310 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 878 + + + BICOMP + 882 + + + __cstat + 525 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 65 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 614 + + + BICOMP + 508 + + + __cstat + 33 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 291 + + + BICOMP + 374 + + + __cstat + 626 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 65 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 726 + + + BICOMP + 888 + + + __cstat + 811 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 81 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 817 + + + BICOMP + 782 + + + __cstat + 278 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 81 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 571 + + + BICOMP + 344 + + + __cstat + 485 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 81 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 387 + + + BICOMP + 735 + + + __cstat + 324 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 81 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 927 + + + BICOMP + 298 + + + __cstat + 299 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 81 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 901 + + + BICOMP + 412 + + + __cstat + 534 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 65 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 576 + + + BICOMP + 612 + + + __cstat + 60 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 707 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 526 + + + BICOMP + 546 + + + __cstat + 297 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 874 + + + BICOMP + 411 + + + __cstat + 805 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 120 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 883 + + + BICOMP + 944 + + + __cstat + 757 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 320 + + + BICOMP + 551 + + + __cstat + 851 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 480 + + + BICOMP + 311 + + + __cstat + 290 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 455 + + + BICOMP + 305 + + + __cstat + 913 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 736 + + + BICOMP + 27 + + + __cstat + 452 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 866 + + + BICOMP + 351 + + + __cstat + 553 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 588 + + + BICOMP + 678 + + + __cstat + 449 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 121 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 654 + + + BICOMP + 947 + + + __cstat + 777 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 897 + + + BICOMP + 511 + + + __cstat + 24 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 138 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 663 + + + BICOMP + 922 + + + __cstat + 590 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 465 + + + BICOMP + 907 + + + __cstat + 867 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 481 + + + BICOMP + 294 + + + __cstat + 870 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 835 + + + BICOMP + 859 + + + __cstat + 887 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 138 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 440 + + + BICOMP + 724 + + + __cstat + 635 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 292 + + + BICOMP + 9 + + + __cstat + 491 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 84 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 540 + + + BICOMP + 600 + + + __cstat + 559 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 136 138 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 593 + + + BICOMP + 938 + + + __cstat + 58 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 84 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 379 + + + BICOMP + 436 + + + __cstat + 706 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 862 + + + BICOMP + 425 + + + __cstat + 49 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 121 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 509 + + + BICOMP + 17 + + + __cstat + 2 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 84 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 544 + + + BICOMP + 41 + + + __cstat + 591 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 84 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 561 + + + BICOMP + 682 + + + __cstat + 461 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 181 120 131 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 672 + + + BICOMP + 451 + + + __cstat + 327 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 138 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 799 + + + BICOMP + 373 + + + __cstat + 828 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 121 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 437 + + + BICOMP + 570 + + + __cstat + 16 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 902 + + + BICOMP + 620 + + + __cstat + 281 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 81 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 720 + + + BICOMP + 932 + + + __cstat + 31 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 84 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 334 + + + BICOMP + 54 + + + __cstat + 740 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 138 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 790 + + + BICOMP + 557 + + + __cstat + 935 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 138 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 48 + + + BICOMP + 301 + + + __cstat + 575 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 84 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 53 + + + BICOMP + 869 + + + __cstat + 939 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 831 + + + BICOMP + 381 + + + __cstat + 562 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 909 + + + BICOMP + 494 + + + __cstat + 946 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 421 + + + BICOMP + 809 + + + __cstat + 264 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 59 + + + BICOMP + 879 + + + __cstat + 36 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 568 + + + BICOMP + 303 + + + __cstat + 825 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 636 + + + BICOMP + 309 + + + __cstat + 402 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 714 + + + BICOMP + 821 + + + __cstat + 583 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 426 + + + BICOMP + 813 + + + __cstat + 419 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 943 + + + BICOMP + 50 + + + __cstat + 63 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 471 + + + BICOMP + 393 + + + __cstat + 801 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 527 + + + BICOMP + 864 + + + __cstat + 788 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 418 + + + BICOMP + 853 + + + __cstat + 924 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 302 + + + BICOMP + 476 + + + __cstat + 547 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 52 + + + BICOMP + 579 + + + __cstat + 838 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 343 + + + BICOMP + 501 + + + __cstat + 401 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 698 + + + BICOMP + 435 + + + __cstat + 884 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 64 157 827 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 597 + + + BICOMP + 624 + + + __cstat + 454 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 11 + + + BICOMP + 577 + + + __cstat + 515 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 396 + + + BICOMP + 558 + + + __cstat + 378 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 903 + + + BICOMP + 849 + + + __cstat + 912 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 457 + + + BICOMP + 712 + + + __cstat + 533 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 64 157 739 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 64 157 629 486 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 64 157 629 486 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 64 157 486 355 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 64 157 355 486 629 739 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 64 157 705 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 64 157 827 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 64 157 61 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 64 157 355 486 629 705 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 64 157 505 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 64 157 355 486 629 685 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 64 157 355 486 629 61 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 64 157 355 486 629 827 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 64 157 355 486 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 64 157 486 629 355 61 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 3 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 64 157 355 486 629 739 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 656 673 21 473 644 651 834 934 750 15 552 857 858 545 35 356 812 784 420 773 910 433 535 43 492 893 428 833 863 861 530 633 908 415 438 1007 675 296 732 837 931 865 715 372 781 507 470 841 639 918 586 523 760 442 319 482 646 25 637 273 847 892 541 823 845 339 275 899 820 338 723 358 589 754 642 701 409 608 462 758 370 738 755 872 407 584 424 496 806 797 376 660 427 766 478 753 880 737 519 748 423 469 389 875 276 335 391 665 382 362 300 619 472 640 349 815 844 891 645 513 707 480 648 392 320 580 615 576 883 556 526 614 874 315 497 543 877 498 340 901 900 466 878 291 387 726 927 817 571 902 292 593 509 544 48 720 897 334 672 790 835 540 561 53 663 831 440 909 421 379 59 437 862 588 799 455 736 866 654 465 481 418 52 527 714 426 903 597 698 636 11 943 396 457 302 471 568 343 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 64 157 355 486 629 505 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 348 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 385 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 64 157 355 486 629 61 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 64 157 685 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 64 157 685 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 64 157 827 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 64 157 355 486 629 685 505 739 827 705 61 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 64 157 629 486 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 64 157 486 355 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 64 157 61 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 64 157 355 486 629 705 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 64 157 505 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 263 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 64 157 486 739 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 64 157 739 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 64 157 355 486 629 827 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 545 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 35 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 656 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 473 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 750 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 673 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 651 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 934 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 644 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 834 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 552 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 15 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 858 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 857 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 21 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 865 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 715 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 372 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 356 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 1007 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 507 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 773 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 428 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 492 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 784 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 530 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 732 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 863 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 296 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1041 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 415 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 837 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 438 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 535 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 675 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 931 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 433 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 910 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 43 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 781 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 470 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 861 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 812 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 893 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 420 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 833 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 908 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1044 1052 1043 1040 1039 1045 1051 1047 1049 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 389 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 589 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 633 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1051 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 755 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 407 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 427 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 738 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 370 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 872 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 880 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 707 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 382 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 754 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 790 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 540 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 835 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 379 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 59 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 544 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 53 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 588 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 455 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 736 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 831 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 909 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 897 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 720 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 672 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 799 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 509 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 866 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 862 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 437 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 48 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 654 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 663 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 465 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 334 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 481 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 418 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 52 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 440 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 421 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 561 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 541 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 760 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 319 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 892 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 841 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 823 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 845 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 701 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 646 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 409 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 820 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 608 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 462 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 273 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 275 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 918 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 339 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 442 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 637 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 482 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 358 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 642 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1044 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 758 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 523 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 338 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 723 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 899 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 639 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 25 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 586 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 847 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 726 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 340 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 497 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 315 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 902 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 593 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 580 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 556 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 900 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 874 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 466 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 480 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 320 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 576 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 883 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 387 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 571 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 648 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 614 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 292 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 615 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 877 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 526 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 392 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 927 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 878 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 498 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 817 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 543 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 291 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 901 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 766 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 806 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 335 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 469 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 478 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 584 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 519 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 748 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 660 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1044 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 423 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 300 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 619 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 645 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 797 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 362 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 640 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 815 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 891 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 376 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 472 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 844 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 424 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 665 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 875 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 513 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 496 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 737 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 391 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 753 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 276 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 349 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 698 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 568 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 343 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 527 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 302 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 471 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 457 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 426 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 396 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 903 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 597 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 636 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 943 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 714 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 11 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r4/iar/example_build/tx.ewd b/ports/cortex_r4/iar/example_build/tx.ewd new file mode 100644 index 00000000..49662d42 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r4/iar/example_build/tx.ewp b/ports/cortex_r4/iar/example_build/tx.ewp new file mode 100644 index 00000000..72f432f8 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.ewp @@ -0,0 +1,2764 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r4/iar/example_build/tx.ewt b/ports/cortex_r4/iar/example_build/tx.ewt new file mode 100644 index 00000000..016f76bc --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.ewt @@ -0,0 +1,3415 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r4/iar/example_build/tx_initialize_low_level.s b/ports/cortex_r4/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..a05d79d1 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,277 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore + +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif + + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + ARM + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + CPS #SVC_MODE ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + BX lr ; Return to caller +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return + PUBLIC IRQ_Handler +__tx_irq_handler +IRQ_Handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +; /* FIQ Handler */ + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_r4/iar/inc/tx_port.h b/ports/cortex_r4/iar/inc/tx_port.h new file mode 100644 index 00000000..362edaf5 --- /dev/null +++ b/ports/cortex_r4/iar/inc/tx_port.h @@ -0,0 +1,380 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 1 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_IRQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-R4. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_r4/iar/readme_threadx.txt b/ports/cortex_r4/iar/readme_threadx.txt new file mode 100644 index 00000000..dbf6f32b --- /dev/null +++ b/ports/cortex_r4/iar/readme_threadx.txt @@ -0,0 +1,426 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-R4 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-R4 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R4 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R4 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of a thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +ThreadX management of FIQ interrupts is not provided because FIQ interrupts +cannot be disabled. The hardware does not support nested FIQ interrupts. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-R4 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R4 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-R4 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/iar/src/tx_iar.c b/ports/cortex_r4/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_r4/iar/src/tx_thread_context_restore.s b/ports/cortex_r4/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..eb9c7446 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_context_restore.s @@ -0,0 +1,247 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + +SVC_MODE DEFINE 0x13 ; SVC mode +IRQ_MODE DEFINE 0x12 ; IRQ mode +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +THUMB_MASK DEFINE 0x20 ; Thumb bit mask + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + ARM +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + CPSID i ; Disable IRQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + CPS #SVC_MODE ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + CPS #IRQ_MODE ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + CPS #SVC_MODE ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + CPS #SVC_MODE ; Enter SVC mode + + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_context_save.s b/ports/cortex_r4/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..9c28acb1 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_context_save.s @@ -0,0 +1,198 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + ARM +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_interrupt_control.s b/ports/cortex_r4/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..934de0dd --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + +INT_MASK DEFINE 0x80 ; Interrupt bit mask +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + ARM +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + + BX lr ; Return to caller +; +;} +; +; + END diff --git a/ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..64c26b4b --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,89 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + ARM +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR + CPSID i ; Mask interrupts + BX lr ; Return to caller +;} +; +; + END diff --git a/ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..f128b115 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + ARM +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR + + BX lr ; Return to caller +;} +; + END diff --git a/ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..04bc7792 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_MODE DEFINE 0x12 ; IRQ mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + ARM +_tx_thread_irq_nesting_end + MOV r3, lr ; Save ISR return address + CPSID i ; Disable interrupts + POP {lr} ; Pickup saved lr + CPS #IRQ_MODE ; Switch to IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..21dc597b --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SYS_MODE DEFINE 0x1F ; System mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + ARM +_tx_thread_irq_nesting_start + MOV r3, lr ; Save ISR return address + CPS #SYS_MODE ; Enter SYS mode + PUSH {lr} ; Save system mode lr on the system mode stack + CPSIE i ; Enable interrupts + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_schedule.s b/ports/cortex_r4/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..58092c84 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_schedule.s @@ -0,0 +1,220 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + ARM +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + CPSIE i ; Enable IRQ interrupts + +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + CPSID i ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR + + BX lr ; Return to caller +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_stack_build.s b/ports/cortex_r4/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..253006fc --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_stack_build.s @@ -0,0 +1,151 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + ARM +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R4 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_system_return.s b/ports/cortex_r4/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..c0014a8b --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_system_return.s @@ -0,0 +1,155 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + ARM +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR + CPSID i ; Disable interrupts +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..07b5cc5f --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,184 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + ARM +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_r4/iar/src/tx_timer_interrupt.s b/ports/cortex_r4/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..420e42ad --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_timer_interrupt.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + ARM +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_r5/ac5/example_build/build_threadx.bat b/ports/cortex_r5/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..c30b6643 --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-r5 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r5/ac5/example_build/build_threadx_sample.bat b/ports/cortex_r5/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..3adb3bab --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-r5 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-r5 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_r5/ac5/example_build/sample_threadx.c b/ports/cortex_r5/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..b4cbb423 --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-R5 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_r5/ac5/inc/tx_port.h b/ports/cortex_r5/ac5/inc/tx_port.h new file mode 100644 index 00000000..459a9a94 --- /dev/null +++ b/ports/cortex_r5/ac5/inc/tx_port.h @@ -0,0 +1,327 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R5/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R5/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_r5/ac5/readme_threadx.txt b/ports/cortex_r5/ac5/readme_threadx.txt new file mode 100644 index 00000000..bc4d497d --- /dev/null +++ b/ports/cortex_r5/ac5/readme_threadx.txt @@ -0,0 +1,529 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R5 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R5 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-R5 Specifies Cortex-R5 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R5 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-R5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R5 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r5/ac5/src/tx_thread_context_restore.s b/ports/cortex_r5/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1a1e3c0c --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,255 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_context_save.s b/ports/cortex_r5/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..d7d5d406 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..c80122bb --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,245 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..d3fceec4 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..0bfad1ba --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..fc9c725e --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..856eae8d --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..f558daa3 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..e0b1e8ef --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..67a6526d --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..9096f016 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_schedule.s b/ports/cortex_r5/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..f4857766 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_schedule.s @@ -0,0 +1,233 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + BL _tx_execution_thread_enter ; Call the thread execution enter function + ENDIF +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_stack_build.s b/ports/cortex_r5/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..26281be6 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_system_return.s b/ports/cortex_r5/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..5ecd61fd --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_system_return.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..77015e9a --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_timer_interrupt.s b/ports/cortex_r5/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d498e16f --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_r5/gnu/example_build/build_threadx.bat b/ports/cortex_r5/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..210b9999 --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r5/gnu/example_build/build_threadx_sample.bat b/ports/cortex_r5/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..2ded427d --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-r5 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_r5/gnu/example_build/crt0.S b/ports/cortex_r5/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_r5/gnu/example_build/libc.a b/ports/cortex_r5/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 zcmeFa3t&{$oj-o=otey#NkVu8!h0a0fFZP#VBwboTv`?Rff0~qVNZcD9w+5XD^^Er<@XNH6fh_vMj|JkFn6Ac zQJXJ>`&A*Pz9vNUCL!ie5u&6Hj|gYxLgCDNOE|0Zgj09CvOSjy zhxX2=g!7G4g!2;O?7dYuZ(c2&-))iB9bPA-tvFw}v`ZHXclEu(jh!Og^%cV133&7G zgnQ>n!u0IyeRnL4Wi(`{i5I(t3|=D?vu8#;8jsLYMm&Y z^sFeHUajoht)lSc{i5*n22ptSOQP^R*uros_mLPZZ5uD~gufDT>zoNZHgpQS^z&MbT$& z_3Y5ej|pjKJT8Ww@w^y%&O9;ng13}i|B4t&+p|U4PyIy<&BcCgg&0cveem8tQ4|lm zR}{}`7sbn8QMP@QD5kyoM~AlGdQBAXog;?1H;G{dkBec`P7%YZo=|qx@nTqPtg@HB zA%=bOK{4zL^Te>P06zDM81_@Ry$1N}XT-2S-zkQNU`I|7!zV4ww2SA6;jtenyLG7; zPWze1j;{Uj`C>TjZ=Mh%hHeofX54$QJ!^v)(K1Sm=(%3m&&?AfzR)N}Jc&58dn%Ou zOG=D@9XW2Evh$x1BUkSbBa^V#ydy^5SEuY#uZWR*5$-ReM9HKpM9I{5M9HbIDSJ_! zC~3Z5lx+WtDB1OdD0w>2-)}>}}7BQrfRA zRQAXDqIBO^5h%p7ni!r0-DSN_jF@|>4US(6~i!rpHa>ba>uT=KmCyFtz zJf3L}JR!yw%oAfry(7j>eoKs@N`Kt-Hn8|F=Sn3!N{`(w&J z@KZ7FYo~~D|8cPx_bkHvXs>6-kNlAsA5AIyk$f?J-S@=!O$(L1?R+u*;p4^l@2^ny zH=zI0C?C%?o@W;6Jp{mjmm!Y6)}|pjTMpO9#eKvyNIBVk@nIR zB0_t|n}ywU2ll82Tm7dU#k#h|M8e8d$vxL{rE$oY|rDO?9Jn)EiX7ll#hm;^0+9Ub%iKj z)-KA|-Yv>Iw}|pj+$qX;{Z84(;ZFPCmx}T?P7>vBKQGD;Tq>sKSBR-2_ll{LR*I<~ zek?w(s#U}qy4%_|$KrJzsV)((>lE?&`b1}^h{fU!7k77d5lO`BT4M38#HN-s*_LRl zZ%tKs-ipp57i7@M&6&ZIo3p$#g12>SNMwYkgB^i%MvTrxS4ITTc6g8rL_F2B1tn|n zkXUCTsflDV(XKt}JG$FZ9SmHbN}%XAo{rLxXiXTu#HOxPyk19YY41$1KFOdRJ_<`E zlCAN2&8xF3)zaS7(zsc~JL|hz+Tg5UEG1&`&Xy#+yBa}wIGrt5g|dX5GO<`Jm1t_| z>`J6!d{W6&N4?MwE#B49*a)IS{n2Kpg z#oHUI7J#G1(Ac{=;xYvyqOpEM7YZX18pfJ{AP|4)Cx4W;4AUrN0RF(WeM3vCqa6tX zi>dNRw7Xpra8)f$B8m2{)Mm!n5^F-Ult^15)s#?ZDj{39bY{aylC3F6!YhZy=$T5j zquvvnkayN#tg$1to^WHlr3+BKtBcheo7j|`9YqjX-F#3fl#Epm+&Ft~bZGBlm{?;& z2VM#KNJKOy(103|bO)RoTe~}(0Xjt^N`z-kknHGWaD_<-@0QjC^BU`HZ0kT1ZSCf3 z+}W6vl@^QFU((%@%5X~IwTgGbiS4DmJITCglrdY{QAF0U9XIXh#a1CzTKM%6WT8o^ z2Nh!_H0sw4NN0V#y%D8R2$KfBiRr~#6S1aLM|TqMZH$edrD%;ep|fl>6-6i-^^w-wF*4hg3rGF!_*BhUrWs_=p<`5tX3B(5PQHnEF>3 zox0*|4Y9_qgnI0Rnv`)#t7o%eW2yyxS*&qmyp`+;(4(N?ibn0l=iD4mfuY6(8?$s$ zb(v^L`|0XUG|0g6C+!qtMD(65ZAb}S2^u~_5Ez=-R!+o-wzjkl>sF<_?zUf8ZJE$xjR^xr6&+GL-ifXqT&OH)jD?6DXL z-TkwHv^UTt8E;`;CD|J9?20Ahc*9lTRHCap#qNSJ*C#eN#Jl2}>P)uEkrnB(bEPY~ zShi@5%FdJhdwpvh4M&A(NHoT~Tf1V-alD5yG|;9w0Hk8F1?f&%d!r9PZy4)}*R?W7 z$hyuf6V=&lscY$Ki?i=RlQoXAiFRygM0i;i44$z}GQsyrmO;g7){fU*v^3#Cv~;$1Y)qs8 zn^N&)GoXCQ3A@`d?6-7wCONjZbaq3IU^u)$Dn%eF$&DthjfVF|Inpt(NoAv9ztN<( z(Im9dq_oi_wb4s!lZmg9*u~zUp)nC_oma)dk3h6i)RTRhY~>!t$Ix2e(cUD-O^u0G zHL@n-DR#W^2HhJXXhVH-f+KmW8CmhfAyhz&QUYabJcU;rZ!UYTR+Xye)&?;XO{z1K zBVW{5eRnE_jwfaXVegAa-PX~b=!&N{A1YEhh>nEEkVv)EA0kdVgpSf$uOtrigbZxO12YU_-X_vM-<{v#h8Y}uF?azK89W=$xO4F$A4X7M1sCq03 zIwOep7&QhbJr3ZVYm2W>urq-04N<5Gy^F#49L-?UokU-gkd*A+JPd))L|$gtpq!)`Fob26rhbnCe0s!s})zEo*{KVsMCIXxxlJl-iqez*v((D`KI1%p$f> zJ@z(?B26kB3*OC!gqHtGrhl*C1> zyA?#;958HP%v8Lq1tNyZ5JoAAqHSKY)|hUHvF=U|P>|dp*L#IbyYT^-Mrk(#6&(Y5 ztj%i{5;1%!aEbQT7&`kV)uh|KEND!0v`Y;}$l((y#n6vK)CHyxI2fHw3wRtSwM3*b zgwalxM3n6$=pcX65)quF^rN6m9bzNXru2xPjbOb&y`L#@Nhj5Ht-Gh&|w4g!6j8hkxbH`ZBS-zunkcFJB2J)TnJ6vDm| z-5xX%jS;Z+x}kQfYE%#jqlP^k$i--=tr*@2K~kh-2MTlpp-B>I4#lqoU<#6xAu&*+ z@iYRoQ%Pt=8Q|B}(EvB;B15w{t#wo)q*B5npuOJssUa+P;*UnaRhCp0RFzW}lcfZU z_OxK-;dJ)i4}-!n?PgvY**v9up)p-yqSLekuOS%yg>6m_8l74diDAxzS`bMwLUIcw`wjN zYUsRCMs2t909=M_*U7i*80{uOB8q#v=90v4DbU?-#w>{%Ho+SD4#ou_rZ}9i0;#hP zOlH5UgKYs65CzbxNy$o*i1DW=CcXF$YXnXj^*mLWZZ8lpFH|>C8MRy1X?IeRn;IeQ zLGY~;Y=te5Nie+wk*%c*-6%w+hSmfImd=gP_xUu{FGwlUXvs$U>!+*%LMV+!{en~v zUCkeH7KEA-UkvkFfC=kTDZnflo`sY`*&k3EMdGU0#B0O~?r3bFDnYaptv=q>1*&s1 zhi&GQ-5MvY(9+bD3nox7Ng_Dw0)?FH)%!@0<|nfxlT#&>`In`Z*;Cn4sjxm(aw-ox zo1D%Osv4*-bG8u>H4n84vH~O?48@|08YgHZ?#a$%qa{p+R8(4Yr-LpppQ@d0(p_yy z&f5Uhm~=ulNKeQz3Z*OqjDaNRP+ApaM5VnL2nVIA7zhXGJ{Y1n#CbR|6H)6n(0aS@ z{MJL|)H)_)8Wbqo6|yiMf0x!YyVN8Ggeg`5UjblRSnAq>-d+`b3seP+qVdfTo}1~m z1*KrMFbGSEILKwI6eu+gN6Z>A*OLLW;f7nGiK~HZoh&R)@!OUOL)!@u12(K@-@w5-a>uz_0p0|=rOyUe_vG7pO z9Sl_b4W8O(Pxut4j%u0U`+AO8^Wp1Q=onIK&WQh#_Df4JZc<36(pW z6G%BiNT_1V5rVY#m%{;Q+3_P6R8*jv$b4v=Y;+=MYoufl=2>AX@Wz&gu4edlb=1k< zHi+e_-nAzX z*|kqZU+fcN)jp^A^5ITo<=%G=95`QybM_1s;&vx;N#FTm<-Q^zo;elpgy_P%^Mts+ z61WrHDqZ#aIZ7L5q|kcwL_d`02#DPZaY8d9i#s0fFbj1U5QS_twgoR1dx zicSiDIDA~ek`cq4;Z8MnyafY@Ovfc7T#%tEFi4X_Kw7@yC#VruRgTo^1SIIWhyH6gAiIj2kFoDi0?oHNMCSs7{(&Y9CBiVBB| zB32E#gv63%{JlVk&jGrEd3BvX6%`6J78a7}R(94y%dKy&Okzg1a!xdQ!mM-Vo?3}F zx3WF45z~{iW>?Ivf{L!mO3qkTc6K!Y3L#rMN@7&1m$ksW@wfZ|D`i-J-%bq_NWXh07{@-w{jCa{b7T5CzE30T@R(TZ;+`B@HKO zSRnmwIL zAT+K-Lxh^S;wPDU?o1|wP^HRnO2^G`R@HUJX{VhOnTDKAKdg+MIsx@47t@7dxgkeXbZ&0L^gJM>bqSjdhNbr|Q6X0hD(bK}U(o=qwF!&%b*aP#QGsgF zE^=zaqN(57{*6#IGaQoLbrgBPGR-88(E#(ZCKV1W74;o$ZCnbfK%Ofg9j99AFk#Wj zmXV_whj4sf_(IcE!P*VXG`q=gXE^kO(mbu90raCe4mJckSh$%8W8wf6;}n??uK6naFYk1;#KhDGcv~bt%rlnZ=IDt z3@IMJZNN<&@;H!{KjU{9{A_;QS8eiF2tSj*n}9P;6qaTZ9(33+0Zo*a-LmB@jt7GU za5KjE-3te>NE-J#gu_;A&zNw-;9}YoJ$n!i+p;}l!V#i~p6TI3gX2hmp|C6m%f+&0 z@Ph;0jWPTTZJ_P$7r#DW+zEXdB_?g>gtVO^Y33$vd_oB`#>I!0#_Xq!ojT*&PmDC5 zeA@T~pIqAbWDVG~U1G)`=5b&jFr4Ml!$Emm4N7X@S7Vxs7l9mH6qEH!h`rsy#em07 zm2irNQ4Qy7$oHE5i#1%X;VKQ~fDZpwO?PVeaSeA6BE73MyivP9q2YgN*rfes{!m>q ze~2f`fgb}+IphMFC9Do6tInP`M;%Rw3@)qQfOKIzS+y9?hfnli*)T1@eYAiAo+Tj) zS%ZpEMsvW9aN+QQ%T%1;T+#vA;3U@7FXl zK1<@J7h^cP2QzrK3}E;BWNP@$v~apJ9FFC9#)Qk30U8m4ZOa%FE?WjDK!K_e2-=qH zS(!ifr%Pc?9H4UiPY}_@_^}T%IK8OMl<6=8#&0cfyC+_bbeRs*B{bZ*@K{>l z>1}+T!&p;lu&5X1TvW9-?82Y#l8bu55C(mCfN>H@%5f5K3c~?b5~8wYeEeWTh&38T z2A?~@!MTVugO5jVs)y)}N8a3tsQnktWgI*%^*?7J=P2a-gFQzPz#N4&DIr^&YF&QW z5Lh!blVP1J@#Aj7PkI)jlvIFq!dVFA=TbbtEJQE;f|46%A%3PDp9a9xLmVI!^gG;2 z<4kv^fuvz_&V>O?Domr3QzJwNpey9G#nB!PJN00Q19M13_@+C{Agwr#%*H@-0nDPD zj$sr*NxL1E<)GZ!IM!uDRrk}5-qh;hP3_5$PueQPvHQ{DjINhsZR}j(0gv%c5IZp9SFvf(- z9_tsOJHG*eM!=%m^~PMLVd4N45fJKqB9-=A3fvwqegJ;>A5`DJ1^gliXN;*o$__Ta zm%)re}~fdp9h18VFqaUW$XKITlq6%J@c2X z@Bb1E-pb-fp4s|-FZ#XyWR`mo)|OdHK}^izM>1PxnTK$>==)U|YgtI@dz4#P&;7|P zRVZ8${ERX6VrT_k?*l%TM>HhvmsnILa!Dt7rXB z^$Tb1b*gvmDa5+dUk)7jU%4I??d7`BSbyYmea?{KSc}4%6lfPmR*9o%`8|T}y*|(* zd{|Gae&M>k#nu1z`r*i8qr9ab^n+$GDNijX1xGl}2rfEtsR-Rqp%-=mn!yk(oQ&X_ zQ~qQuJyjw=xc|kcf=t1#Fmo-cD03}JOhC!-52M7sbrM&dpR)-K+%4sgmhb{@1N@yl z_m2c2_Z<3p3sao@h1f@Z3nC$hfKbrYj$Z=h5BmQbz}GenzwSp7+6no82H?BuBlP|W zJ-;}a=ru$iWH|r75q(Go;4G5wD-vyBw5OIa0Icx+CtU;n@8dUbGk${KM}TvHoa~Mb ztq1OoBTu(XgocqC-yMtHm|b6IKVd-R*3{KkjwqTfvA7YWUxAC9Htx2!yL zIbntJn--cvze+{T41I=vQAI^VLHf;RiQO_>daw@&z4B}E<6!>xNx~7%A^;jbW9Pzx z#&+D5@f`7*!W5!7!x_L?T?D~=8MNE5a~l1r?P`+YizN&h)2N=91UGOR8w z0)m#|*YRXpz44l5bTBK zPBN}cdaPt&<-%%)6AP@$)PO}kb{LkH~T0jTJL z#{?qUnEX+XviZGamy3S%I>J3>B3b;%*J>VOWEk}f#}c?7 zNqq7-P_YMJ|71%|8_wCXZKREzI_oXd*C$8bbZB3O#>en% zacRT#PuuvQ5#g~*!@h$05!J&wgU$t`zS*wrHPh*u zj%t{_cDh`8ISII0gF#MYN|6dCR{;d}^;x-0(VH-8aq}x^*Ag310P8 z`)b9FukVb0YIv!*xztxPwb)<#Aq2l*A9#$-Zws(gK5VjV1?ROVqN;y5&{;U(bDwGPbZ1>`=>kxIiZ(P<&aWHZW21j_zsFIyl= zz4CwRhoU`cjWBLU1I*I$H1aC)tU*uF!!B^qqn@kT8 z+J>L2VTTYwKd)l>%fZMA<#Qr0!(SmaWwoUI!sn1IqlW0a6oaa7 z>NKDQe%~k%?ueg&@V_JTQbEYiZmU}#1z_KW|9;)zU#W8#{y)+dH-@_o9 zDhQu#QN=~EP0*PsS-E8+#ZZ4Q7=+kqJr6{d2<@jAG*#_#cXs%DOkvJs{-PYOF`c=J z@`v*g#;sCRDE!aN{0WLG2>+0kKTlD`;YUf$SJcSxzmv-XMU{pZk~&dQ})+bCQ)=i`=z!qsGXzidKf1>vQvjxQ;ys3=y~DBK6`l!+II zzrbX_teBLBk7K-tSvPLk`0zyL;gLm*T^0#{g)zR?A*u54*Xj55Pf2Q8_M+6xmTm;e z5hPLH9|7)v3BjDuQ2zuF!y7UKlQe-Z20oH8hWc5p!&w8)b4XJ0m6+z+O@G!&I$gwK zqYkl*UcZ4B`JXloiHc?UEOI3L?sFwCvIO&8az%3~xd>t1liiQY;`&Q!Y%)}Gzhn6p zlyoreDLQU($?@dzQTG<8GI-}pW-#ul+BaIVnSmF&EH381N?v0{F4DdWN=XgqVEzp`{9Rm+HWaN*-cD%e3#ACBJ9j zFLh5s{rJjy10^F#U*>Y9%UAYh0FQvR9azQU_?(x(W>h!Au7hKN8+1x!*BWx@#_Ar; z7KjiLTG?y3!atG0gQI@~8RiAI*)3sWPYx$F@MQN7Rm_m$n_ zl>95%HE8+)r(_HL6PkY5DM`}5QPbaaN+@QzO`86egTWOkv1(+sjS>DE5Fiu`F$116 zHkTf6)1$@cm7w>#m$)U*Gs7J&X;$lZnSRo(lO%4-CBlwNvY#MAY?6Egnl9ygv>#1% z4Bu5erthN?$6UukU*a-N5xNJzUQSBISiU{Z2)^EEH1r(m=O8|ot=BPq%=6OyoA?dA ziXXNu(=Pr85uH4LJ>rD?{$C?+e!u?-fRKM&Ed(Ivw+t}S`Cr7Nc^%fdaJ)QxQov-L zmE)nl38z4YK4-#eaB>PJGuQ#I0X&zf2 zL^-m_MSBW+01mh`30H=+R@Sw&S5{Q;@JnS=eLbhmXSL%5<}BVXSSgQqRBCRPiX^AQ z5&r zJM2aUINgSG(Y&ys3O5=i5F%NS=T!>8n%Z0czwFrvZ6pP_x7#VVuRQw~p9kPuqJn1bKufDfLw_ zh}Vp>J3Jc*M}6%E?rvfw)OU2OZ$VPAPI)1P%qH2!^i69moxBMUS!w7LyncbFvw2Vm z0(e75x4hg6*YnBLureTzBBrl<(HTdnaKzFSLlw7?x2Evm5KoIY;M6XzN5REUOc_@z zw8f>LykwzWT|9y;cC}?r;>S=y%{W?VPN#3^;z>?fgv?4#@iD6lz}j0nu>9T6RwS7q z?v0Q|F;_#97~mz#>9AR)c_J0Kuuq?`lDQVRrV=-dsKe6gb{Bp4o==$<5~y;RI_9O8 zcy{!}`F>s+sSe@Ca9vgd5C3Dqq63pt@`gKH0|1P->hK;Spv%ubZCPyP;?vfwT(xBF z;@E2DCEk#(Ou0T1vuZ{@2bmLjOdqHF*_>jhFIm2rO+`U<1CV~k=ty{n2KGyu+l){) zb%&I9l_0JyVlzVGJlcc{O1hXiG(lee8RH>sUR9_snm|c6%ETLa$szpJbto#UW~oP2 zNDCVgt}J1t;@}n<6z^fc-7~C)#&+3(p~`sWPHfF`9DkGN@8u;;vf-H=$ z;-ERsljDL1-s^(v<#-hqT4@JP;Nj9VnaM8HI-Vb|_+s7YmW-?B8gYc3Zx6ak=DJeGB}G zHNSj|AE%gXew)CL&(avj}oF9j$9LB zeKV_sEURgwK*h;uFCQVIjp1i#18w(Xu_nZ4nKqbk0`auxVCRPAVM|Jzqp?PWYW584 z&2EdNXKLTq0l9|6iC1Ijj}Bkm>W$&QJT6ZY=-a&;)D4g7s_zEgDPw{HftZC$+hDfB zjvt}+zjD3l4o%-jh$St)+k>t@p^eJ*C&1|p4_Kw)hc#qBLwCOSgcoYqtl@SIuhH;! z4Ve#ymwTW9pV0JwY4}qO`!xJN4MTWzj5kWdat+Vduuj9IhL>u1t%kR2c%O!kXb1&a z^8KEMavcfjaBnNq`?H2&ydV+3S}N6`f39iH zw@dySa*r$NMH;TuuvWu%4Yz9eu!c`)_=<*aYWR+Za@H4oN8`mN|5G%4LBpSD__~I_ z*Dwz&6AWLXVY!BLHC(9SIU3e#*rDO28eXU29U6W~!^brIu7)pZ__~IF&@hAs%zTt; zSgGMhH9S+pb2V(#aEFGU((q0VzpUYN8vb0vH#Pi|hWVT}Lb_u#oTlM?4Nuo_jfM>x zc51jy!<#kyM-9KK;gcGEU&DPG`a>#R?onp?r)juV!<`!TX~@0c4EGxi-_bA+9XQ>G z5u(kNXgE*1pQfRFui(#do9AuN&CBqp2Em&?3}jzLKB_xXx&_xt2U{ndGcWf&wJ)RX z!DOtH`g>>f;Xao=e(tNqx?};?D!Df4$NpG<@8@1Uoc*zC^)E2c${L!ySqEfIWZ$!r z-VnQF#K{wVs zu)kILx&HzR+gSZ>7~N9((38AbCFK4FzBu%>n^A%R0_Ro!gq&#rG)&aFFpsxsJHcfn zE(ne$2tLc-n!E<%zB1%+aCC++s)NRnFGGYG2`g{A2{yyJqMpA;XSXKySjwH6nXO74 zCDt=WV;U=$p&epo2-$$O=Z4s3jbTX_75UFB3SI9^29Bl*^L^MPEJjZIiy8EikAR32 zc_bpMOJVkrs*DdENZsuS^?g;^N;@kU_0!WnRH?n$m1A*YE2~=inevdj^ug05AE=#2 zsCG*EkZqa$Dh=fuf;2gu6_xl)g|9T30JMr^xn{Z_3%!$VByBQt^phH#A>EzUQPDYbfXV1fCKA6Gx^HFz#IY>@*uvd<9 zswm#IFDDt*?14*fdy{tnVztcP6_;@j;6S$kX3DPO9#)gerEHrKiDMcE(0K+wX5Uu@ zaBTmI0E7a*n@I%?Xa_~<)Ay)y9tz+Fd|#E$zFnk(zO4X|KDl4m{oy?PQaDAtpqDN# z{bMU}@}vM-6T-=$JU&hbeg1QRuH5W?ltsz`M6@GW_snQY`Y4cI+LTqSmNrY9pforR zn(BZuY6N}<%c%Fk_2aPSbyaN^4*koh5$U6TvZ7c=U2t#)OA7;tmb|U_2o^HE1+%nJ zc(7#X1)?yUyFfX>;~H!QEkmN#FFSgeBfZ{-lVI{`W7`2x`+6VDM;+oe!1u>Vnd~(Y z%BB%mV^p_y@Hv@pVvMHj#lD$uJ;RZvd_)>@gfy!)G(h$cAhKoCfx>ajF>%O);V5qz zWBeAv!Qk|J5|(e7F~%=jHvJaL!Eh|cp=8tbVDO@0259(k%(G>+R>*3mUI8kw0CJ}+;^klO`cWU@4?f#Ue z`A#36T$|jSn_OG9AXm9|KN~uldzA$0oC@b(DbpTZdDcGKkeft1#GJ~={}6NcO<2?> zjGsM+oVF&E^6f4lM!ua39P%x@!-3`70C+&`4KN;VO$6nHe4Nop%ePYYRq`#RVR?17 zmT^l-Ux@j803+i53*u-v;$o^(eOA5iXP1wrn`QFnW8 zb~jwJo0aWP z?zNkn>J|@{dtb)*Z{$1nLJUVbTkc(M+O3AN#{!-$_YM?}W0HwO77TY85p9eg$5n&V z>px+46Vb-_Wy`&$!j*l(HqWy`&kQzP&<#^ik)98hJRdBDowq2%80f?qCjZ!d(*1s?Zw zo!t*NcqNTjDKegm+&d59a*=y$@vw4{dwIY55|ar)Q!kd2L~Zx?v)s$R!j^jtZRB1< zFSIHsOYW6DeU{vt+?*-*Vob{%;-uWm58J@-J^NdddoM?RDEICpM7zIM!<)7H5zD>& zrVRw&LH8ZZpO^F9+<#yPfNtRLSnjj!&0^fZj`%aOC$B!J9vt(cSttR>nCj44`fQ-|>Fnp9mP+bLoMOpd-@%KId5X_Ov zzpq0M;J8D%ksX7PqyFCH-~A}ZeYzZj$-m!2IAdgI2qJsl_clwuWc`?WsRM4}kVmbX zoBX@Wk}rXJ{IccWo#4kYz!;NO2OLmD&pc%1?@;pZgWwnOVx{w*E&o1hL(%z+^asNe*^6w;6Y%cOI&zj~U|2E@cKNj*YwtHK~ zPMvxKTTa>>jlJ)D?`e#DYjiI|pP;-w|I;;1kSYJ_VJ1@mrelT#EQh z2L2A};fVG$V6Hp2x!<`te@n5KofNv3Y#Eq$1abb?#lBmgz6)s3y|?e(zJ`Bhm8qP{ z_FXPcX z-lg+*x5a@iYe0#2OcOLZ=ioEirXMgBbMPJqR&AENtJiD#6?e^3CBy#3TdNl!qrXA< z^e747>VX`*&*Fo*-lI3yYd1I54IVt#`)rP~?mD(v%a~C(d#-n&a8blHama?@D8CtF z{1(E&;Pm5I!ne#A1UEVs9%UthPOO`y8th*e&_B4|@KvT~b0k>sS?n$6* zz&?c%3&W9bC#)$GP|*c`M&2N8{IX?T&K)y8`5j8u{Ri-iAdE4FU$(4!hn2rW$+|rE zmCIc33pvWVJja!btotE^%SG0$L8as(>-ON`EHRY=XzImslBn%|EM#3NKYE$4Q-5z{ z-4QyiazJ~o*U)CJ*U$^Syk*O}sz=Whb>WsF>2gfV9OCRf4s6SROLM(PeUC$`X$$XS zpo~j1*j(@2Xzt$(=Q%={3^{lIsknc$cI94CgL^l7cJ1N!8}h`iJtBEyUjXti+FCyM zKZxR6`kb1cy@BG(dqwf~KHO>7C*5}=EbiV6ik@D1_htm=)Od&I?wx&TnJO-5e%E3D zsRMn}!QS#~ee=+^zwKxgChvU4fro+81{$`B5VYa zCtaAN8}$DO4)}0a9RNN6fj(CFet0T=gMXyUmHZjzOa`D~2AvB-2M7vffOVk?axRok ztB3H@h)yB5;5cjZsTDiJnR#bT{yPLCZshN|_@YAtkbs}0n8J*RKLI;RGt)S9x8(?L zhA~$z4Io1v(I#f|PD$xrUX*f(YnqCkIWuORGacVMubfr6{K|$|XH{0JQ+OOh?YVBY z4`cXT78R9V@9cE1^6l_n8Q7j@-OqXwQ!f3L25%B~9^?0Qdeh%8?!CQj5 zI%NC-YG;r=!%QBB4s{QMPmWpNG#EgQFrfvits{kf)yHBFiM*PIDIdlzYMD`9aP)z8 zaAewny1xMpRqlgeBdmfo9U^Jjp8<}8wdK~=(Px#yZ6qw?GaThk%BZ9v=1Fs(h6d1& zCR;xkC|tIFz;ImrGsf_v{9$nV%>|)OW~h+HFIzw0wXrWC2+P5t(v)K*a1#fp;7yYs zvK$P$0)BSAya0Zz2l68{{A5oL+L&5Y5X)waspo9{;3e?Gcr5vGm@xdZ^@AJ0kLw!7 znEYky2fSF@X_^n(i!E*Je^CkmB|e!#i^3X=&df0mO(O}&B@!Z}Y!!@h$00s8`D*k0|nNcuSA2}s%-7S%m4-jD-Ph8;RCV{65AVBF}e zHhh#L3eWGIOb8LDmT^7cPeK^XP(_Nb568*X7sEXmC+ezHC5_Qs2#MwhDw7me0Gb9MpEb4;k(kmJ#c1G zgng}QfK=-40A;#U=19gQ3*AN~%^%ZFiKE-)?WYjF)k(_3m-y4VM8=WGw6i=QnXP=# z(Uam2j+o)n&(0W6X`q563+u&@hc?sd)KO5L^y8I`jb>!(Eyh7hR^SJ!$dRfd{oWN~ zH&V)$G}*eynUFzq(M7(gqIN#5%sRqAd1R_6<1cqO>F7h<^l^JG$Car8;q{hl0P>M$*Pk{k_pe%v!}xBuZT*l1^N&`sV%d8qSn5}8oyCV&Naq=&VSN9ria zWTIUyaSXn`QI+#v_TqkYl-@AOnA4Sl{Obd_5Dy=sJ^ z4#MwNo9~DPBW6A0>OK@TV?Bd=fqEDH&97-RkHH`~~@CtCVrV*0sD1}nBI5+>djHA{xvh)nKrtuf}zmN3{^&aJXE4v)QQoZWUOo0Ez-!i*}B9F5Ns(EP{w6^BjZlhG~_;M?$FQxhNa2YB?bydnZd+i zJci3fmpBfQa#`2tMLAvoPnP3Qy2LEJ*tx80JOo)Yr1=q=ddb!$R-=MgHe*aZXX_G= zf}g49L+KLR!EcIT259OmTbFp+${+hTlfP_T;$HBJ^uuo(+-zNf>o_KVhtegU0>6_? zroe+J?OhrICOe>S3r|L%SocP z`?1g^%sPY0hn@O+qf1~(K^pcI)Ftd^!S?VW!~&~9F^n4$Z2W!AWcEYJ%Q8} zY7jN&`|8o4Cm=j!aJ~zKRT}=StzYos=EK$v|mtefTPbGMw zV)w3nj<{e?0c3o5AMZwA_=OX>VlTfj?CieQb;Qa&e>`yDBz_b4aPHc+cQYOG#_b}0 zU3bX{dE<8G$7@5G`;_b(VB`(k+%x2=63O=W*{$#+^h{1m@Eu(Iz^AAh2I ze`2+H>hwQK!n7%vtTmYhN}hv>xanIFGbGo;m$EaWr&FaoEz__nMO95&n~V4rYpX>aVX>DHF^giSZ5;%ylY$?m## zIDsW^VbpB#g{&qzDU$mEE9yJi+W1kiBbA`lJUg0kh74^tKiN~je=;n?K@^gvK|=%R zM{^u3Wyit7%|sXz2dE&wYlvuL{7wOFaC-d;mT!_V#_uFJ*s|RnAa=uz^M)KESPtfE z1+0k!RPalnKO~}!@mmVo=Epm#8K3-uu!bLHUK0nX*oEFZLPQ&eqd6be=GOpz#c(4( zx*L9!d2N2X!EZ9$j4^)e;b8OQJ&GoO5NkbtlzB}Y^1uSVh!D}n_+19t=EpM-CVz$S zGx_6+HRG5z;^09~H%zo2$lZYYiI*)_rYajJ10!fPLVWolQurt zQf)dYsF$RTojT*&PmDC5eA@T~pIqAbWDVFfYa(rYVi^9E;q#?zYzZQr&;{Hda&G+v!|{wjXxOd4@PoJ0vvY4C zqS6RdZ|@C?b$i}EaNsfYe#qZ-d-pFs8gu6Z9R$e!hE0}4ohfhQW<@Dik3~yXFQeMO zvs+fP>dMvr9r-o!jJflR`8)#t8UW0lZzUBp;H#i8cm7G`C>xYH5AdJL>$3pZv~wZ= zCd}n9ktcJYHtpnbg2#D*Vbg~Ic9Xm?_%cDE46ruH4V6yeF#et&WQ%tS6_L%$3V#RnCH)(==<&lFDe)8MBuiU!#u? z9Haw8Sf|?T23%A${(9$Xcc80b-Lg^#9;2!4b~5_kWha zZk0x&$)0oXf@l&!!{u0u1}`Naie^(aZ6u?&LEDC5X=cDO{9xfIQuF` z5VXPRbr}f0iN+Z86gb#Y)-5QX~9xZZ7+Gs?lENda=^=Y&l8Pq(fqG zy~4Z&ip$`7gc2@QXx2+8OB1kDr$1Xx+8m9u1ZK{CH`w+!=gxk>7`ES;h5#gO50ADY zqQ(n-qM$AFK*7m~#(DT!LOkf5n%+f-46#;@M1SFXNPXf+=jBs6KIcWrr$QjTu`c;_Ib{(}e`;i%44{|mi?{%QcIR0#kq zgy7elgII;6oh@`u??GY)u?LB*Q13MQm^$rHIFnB2gjgb{kWq2IA#}A2cOKo==1WCN zX;rK9p(Ry zUVhe$ImgegT)u7D=g(TEv@&#$8S66Tpp9XhSX5Mgy>pFwweOSuoq?kWy-up9^N?b#twWUq8celk}OdRqdzpoL|#`rA+ZE$-13IyL?V+@+D%lR>|{{ewm4$6WoFY~n$*2DoS zK8B3uqRagm{1~772o1kF;5NV8;9=`5rk=BPIX^~K%D&{6Z}H34<@oK!55eCUlUBAa zHxm3z{@6d7{88>SameF$@Q4u6#`tXmZR>L5t^82{F#NK0xlsWj+6)tfBT9Rhh5*uR z!$Yv^#YDLuzIX&l9ZY-!;d0UCeu8k1nMi!}I+$hV&VR z03@9~1RtdT$rBqGbsD;pJmtvY4uHovv_{yNN+bq9XWoUR#-lQCAjC^|8zC~Vn-Kcq z(}d6?DYTA9W7$uLaA;AYxreCH2AM*_^5XOo`$^|2Jk$| zkGuZ~BO3A^BGPi10Pu884#xtj3*KcXspY(#5 z%*}<^yav}o8Q|QYIzjR_1Fj7|Lr~bj-_;?hujyN{M=bsT)8#OCvE6$!734$`B%9cLb5l$XQb_=eqC zsm*ESOX^GmXm=U9FaPQym1lujrubXDJE>sTLF#la^1rigHkTG`He)UVRQ{b!>#ad zUs(h;)Ke}XL$my{l`XFCS;r)Wi&_9yZv;N0{-oZV2F7yuS0B-f_y`p&6KD=i6f#~*L zC$ep?Kl;O8$g?TMm%Abw7rx0mf)2ttk%fDI&-E+byIX^GuGu?&k*pqQ{RnsJ4)Bc% zF5v`h6(cWGhZyK<#hF{_vNQ;@vu;01jWGd6DH3dSG!*+}1(~l`?1Tfp-nIn*UvGPz zRM3DY893zQ#x^)E1?2|({urQ79YyyYpj*)QB0wnUYX@-h0;}n$K446K&d2yetyHyr zY^8gLF5&a|yC%qe%1-#>BvuEhzBpkSZEXmPJH^U9bTRag$@DvCNHf83sdm%|zr4sR zpP|H0U|qTW_!#V$JL0n}rlm_IptGx?A6%}9a>~OF2ZTHLjeAMHA8$LT=?YB%u>QC4=t%L#ItstK+XZp~HUVzES zi#}MAeLa;Y=#XLCMB1FpF^`gCW$Jz0*-r7I}bNCKDsdmQwfOmkB9j(fgj7JW-B}$qIZ7ZyF69jpN?U-NZGxiWoGLb+aX&{gFDAjGF@6i-U~u~F1i`n^7=u#&fH>)y2T+a|K(QQ$(lM^b zYn#hj!dA#Ox#$?XQE-;c7*o#|!NJZS&$JZ7jrlv2j}{igqV4d3m)sBddNlrPEmzcoCf^@et6fa=<-LG_$D^X4tcRnIBKI|$?HIr82s z>~}(chP_AM>x17LPV_CnRr~%7eZ`6P^zsfY7y1o!l*^%G+|0YLgg9p(aNmIUU>#~r zL8%aV_R<2*qJy4WO`Uz~KvyAfPkoRReA|f;!=Eg<~LwAK%;b4*IqOU;#nt40-JR)dE7$ zp<05iM_enQsfLBV@GF8sxqwg;;sH^oa0i{v39rQcg>vLJa+}udB;K1&)D}v+L&q}Y03LVP&dNLUV@1LxBW3tX;W&*7Q4=%Q%Y>l^7jzMg498;=^Xk%LBWY7#} zhK3Rn{dsCWp(4~S@E{FZ{Y`JId|knzbc2y6IpOf_+UitXsFBSf?@^>;pKo8Kbv zD~22S(cSQ)%xv?!CySr)V_n(&xL#rM2Qks(w=Ij`w+7&MSr$Lu<7M(!Xz{yA^NRw~ zyb6BDnM{EuO8Yqt0i@w~CKeb1&_uZxINB5k329D4xQT`UG~qZ9nYKsoIKn+bL>m*1 z5Lxm}Eh`0%BLOI&bZut&qIG`v~EI|-5g-5P#TyR*G8A5Utyn-JmHHgcYiPbHGA@p`#2 zf6(*aC(g-rW{tM9>y8+h(pibz=i#Hbl!Wk| zIVZYpc%XJiG5A0wUAgZ!a&OHoQbtC9oS%nyG7i(jnR941GMxgRKWCaX*vo_bp|y|2 zyZlCo-@Jo-JqB@^o=IErKv<-~v*DcMM_Ty>$b%b6^tzE2Irm?H`0`vqw58X_a|Z~= zZ{p=gR6Y#xZGHT{g;#E|Q?5VY5#$T-&C`5^Si4Wu zUegz#yQ$->^XW`S@~Pd)yTab(nT5k#YdG|`y?5a4MeAm(lKsZR@>k#GRRd@DdWOh2 zgZ?r@2mB8JVCmscq=E*lMQG>>Apkfw$hi93-XE7<_8IhP^!BdxdJK#*&!DFmqn$sa zoXPN|VFsZ}+)7X^1FQ?Z1$U=-6P<7%o!|B@zJyNahJGx4NZ<&0NFJUjzLeos=Px1{ zy`8`3<^LnYl}h6L{O3uGk;Iz(+ewUTkQ@r~pCUE>MoES8moxGN`r*srA0{zT1r+&c z%fgw&fH?c!L$8Po$9uzwsE>*V{HFrXn~5KB0Rp|>zxikS#hlhZN}Q%y+m@}U@@-yP z=_{)6wO7oZiPP#Q%-Dr*j?b#R7zfp(TnLs}vq3!@B6)IgC$sn!1`87k;R1I;o zFBp5bYE=43@S7U)bo$1YuIBXDH9XbOUg7b+zk!deH?%Z13dTumk?o0%@}r2}$NeOd zv6OP~N{h}(%)Y8PBZ}cFzqv>qj^7DUS@yzZ9iPv5JkrlFQSrcq>=H{BS6LaxauM+gfFrSN1qDCe4TU~f_!iKFUnR>nm;cR}>z>o4a`9V1G_;mue`P~M7WpFdb_)*Wa z`7N;W2NBuhN7>rMA&+l>UxbJ@#%~*Fn_sn+KUAg1?^fW9!{c?OhrI zNV5U@g(K7cHp~DGKg&s?w)^1vqn%^s-?RqB^Ljp_cMhVN*|g#@~f)Nrzfl^XJ15c)6GaGiz;4Y@dR zIJ$V{>=V@zkp3M^7oRgP_iw#N&?muox;WR2oZ?gW$~BA zLD2Ofi03CeBmHp{HbZ|f;O8`=`!;@@P@aP>)*LgLN%X?tD1tEOZ=9OoI7u||_neUY zvU>OGEYW^oPyyDh#-0 z#LAk?0>cWq1h@lGc644k(yKqsgprN0Pj{qaO37GqlM;7FdsF0K(LGcAKG^^8SC!ta zTH_S}RqW-?Tj}z2nk;p}bGLP!e$I;@drjf*fAL7Zz-Vhm>fjh|aYq%b0LX!{GF;h3$bg#`saDH#q%zVV@(Sjqy7Pv@N?{3xXXEWf=|y zEC=&Nncl8y9ZX)GKX*aSXE`>pBfx9M{#RgU>?rgM{@z)ArP0sh%*D-p{1!@W z@#S)zhuS)Iq5f1a7T=Z^*2&Ase zMVE(j;3F7hh`AOwe}ok_oDRDH9a;eeVBDn3AWTRxEJ7eH+A`2kBPAE>U;!0uScy0e zjbL~QB6B+x`o@6#pvg$JqEe#MLXOF1l$8iN_|aarK$Lpr0Wl^W4{KS9JN6^X=-BY3 z5+9#=N<6)pYXZb{>l23)_0>|y#77HGMs~%+=s47CPIZ!xPMKu@&L`2encZDKL#RM- zGMxQXps+&od*Go!;0grFt8>nx&u{1x%e}f=SD4*S8$X^!bbsqi+OwcXErM#r3td^8t_@b`;yCQTV!aWO5S;k4CxCiv( zus1lqHL7OU(us^$Fhl36Ecn9@kkNTNq+ck^y!g(S6p`?)=|--96LLF13^68A6LV)Z+3YTelc>?GxpvL5%m4fRRn@EN zo~vgBmKf?YJ>RNVRlllNuikt0>ihduv2B8~@rl=vCi3~EA|;ie;(X)_SqV)^{5$LS z&mWY~)I>4k9{qn3no*kWs`VmYQYBO(ggQU2>bw9URQk)RyoCwwFcf*>?&wS6QP<4V^O-G)ciji|rwl?uThQ9X|IfqMe z-=LyF?6~>J?=!;~p4}J*$1sTY=A9Ph)UzKS6`g>088nGG+!@OpqoOPE|2VdQ z|164Ba>b|Rb}^o9V#`IY592_b=NLXW&?CR;hA|%HxpbjMUNrJ-^1s;B^8-pncS+uf zw2_6ud*yVa$s62YJo$+4#FiviFz?wq@95+r$cVfnxHC>sW0TzPB65z7txR6T#ES!- zZctX0{5l(Qsg7NctYhrC!NZbwVKU3u6@hvLElPH<+?6`<(&X1!&?+6fJo!B)ULAa1 z@~%#nGI)VbT%Ejzd8-3n6I{ULHH>W!+9mO&N#2=}u7G!Br0l66c@0Hx4tTRg%DxpO z*}{=+!Ba>cDf?+GxtP-aDmV-66DivpOP7U#(f@RbI)NpBjgeWWznS1Y$JWu`qlKBW3sd$?s8Iy$*lMPu{}#j1GU+Pu{@z1|5FPPkxx;Mjd|A z$FmeA@n)1}JJE|ifCTa4I4ckyF81PQxZxAL6V@R7dgQ7g`46mcHei^|`W(w|3u+~} z)r-@^2bYMS;KkV`c?ooQ9Pgvo(N$06y^72912p1^kMpFj3RtEWzaRg@nvC;K;@#tq z;q8r1!^lxl-a#j^_xk1;^KCi)82-m!#6R{e(=TF3>=&Kfg|SX&i#H{hoM=XILD?h- z#2F;+MQwvADilqe#G|LGP&_f0DNj?OlEkNdgicqX(TQI$G*yMhCgce)O@+oK9-z!K zRA_wSJcjgOBjt_%IBMead(wZK&l{L-Dt`X@3Ew1~DG921wn#bl7dW3&E<$0Ei4nGf z?|WSc1xl;q;Ox=NPlI9FJr1%D+#tJv>D(0^+dBFyA7(F|*e|A{wyCwEyu6~hskWlA zt`1v=wajeIwq|B#YHFJ*=9E{JS5=t0cs2TKM#ym|pbMurW-%a0b8gj3H?(3RwZlte&*A#2 z1z{QKOiQM{G1FSNZ5ZnJX_T|Isk72cZ>ekV%(m3(q7m$naECr1bDO=VW-$tBP_=8D z+u@=0F#^L$AZvIQ5akL^!ASRr586f@)XjIH7zYQ zxK@p=@OkN0P5sFcIT7aEmZ@>}+>?B0ppCVtNpqGbj0%NQ2_T7wCrr1Zf(le zcJyVpfD)QIKs>U~G`7|>lZ*7yx;v_XI(JkE#iEv(Enb>81x_7Jg7#^L7LRIosVmR6 zsa2|8U$c!Fwst}!uZy&T>OeTqQQuVG)Y=3QWH+0eSc%maELoLavuw$_H5aY8cv*Ta zTfU~=PN~ZTdfGV|)gWvqDJV)Zh)HoPy=5S;EXhn$OpM*^;MYdspVtGyk! zKToWNw-p*UQ`3r(cDkiztL_1aM=NDA_0T>-($4;#NrODq_{6EO&ma_)?V{xL<{I`% zmVmZpb8V4RYG})L@C?v(TC-|9j&yDFCUp}@tD?1~mD$747dNG;sKnb}9%Hzgu=r!^ zs}@?f8l(z3U#1gXBSW$F^y_e>F^jcsP3b`1d+Dy$u8s^g5y6uLf}7Yx=*`(K6eD*M zL##&gys8@2YtWt24P9*D2KE-7L91LFB}$#4?t0SdY!{VPPD(1v^3r`BS={UeQd6_@h-*z<7eED5#Za?I1@)+#X0O7454>Ip$c3r&XlL4)yoxLDVaOYeW0Z&4zfc}0#9Vn*kk=P~ zKwia_x5ud;zcx($Zp@Rn2J%ukW}GQ&2M)OMo^t9}iZ~Y&^U`rHJj z15VRerIG3*JkI9^k@qoiy~d3icWV5AM&VMBZnqA9LE{q|zoYRd8hbRprZJ9=!E%n* zNF6MOFV|SBu}veb0vNwb<3}{^*7$ji_&k?%-`Ciq@s}F^q%na`PkAS4JX_;CHLlZG zr|~L{pV0XC8vj}2w>AEo#u9X8k*{%{#-$q9XxyN&RU_wbnD4V1pU}vOPac0&;~zA} zaf|Ty2^!DV$bFJ{{Kpz!()iyRi@=O9KB;kv#yJ`nYrIe+by}G|tC4GLGklB2k81pT zjgM-4TI2H?U()!7#yC1K<&4uS}c<0_4pX>8Q^UX3>p(MNCAc)LFSpvETNABg9BmYb*GF)v{> zn}=ns)bj?&XBpF(PoVY!*L|2XcV5BvbW_k~a3Lo;4sWH`m(F~7T;**&8&dc7j9qkF z&*(k3_3WtJu{TKV*jo**G+w>^h18-CzZBhYTaVXvThFdNyY_BAf9DJ1z@PfvSQD>u z*WQvvJ74f&M>b_NxYfP4^z8L+d3p4rTf_!zB#w{c-la>`+S9Cn;l%soS^LllGz4c% zuNjd`H9Gt%dCYi!%;Sh$=5eHE9-&~!>yj|UY>6Rey>4DQ)>qq#T`hh!{PN2fc?aV{ z?ZB%TiUpSdpdF~V(~lD-Qk#VAh!kiXj4P)1`UrGyGQ^oCSbNVFutA6^%p! zH9c57p2d|-WvVi-_}j!ODioEA8l0*^@!}GuJWYj4igz;Q=_)k3SY9?$RcLInsHIL* zp>f4OV#+gAXngV47@Dp^Da@djc#OMJB}xqt^uBsx8q-t{13bsw|+}7M;MhbQ8(eJ z_jUXN@Bi`t5i{%P+{1ZueK=R?P?3Zm836;X_-*CDH-b`3pkCC~dS145ZCB=!O#Rx8 zUFWtpT~yP#vZnRiOzn9!?dP<$pI5VOWmoIUuI6*P8ZXMUT~OC~es=Rxd?kCQme1)( z@!zR)>VdQC&kFygPKDwT$Kwa!e9ynS6dwpFgpK1>ly&oN4sMLx5WPOOvuJB+CG@j# zTy_5Y(a!9N;gd}Li~&Dq&V&cL{{aT3FWww|1Pzyuhe z_iUCV&zZOCLje*w)l>l`Ig?A6BuKZ`V0s$jl_!*xr)nud=H|QtQ07*EoZT3n@~1nG zlWxZ_SI?9EdCpX1WuCCSU9cSUNVCeTymHQg)MskDFqPBJW_Av=b=9)vJKSS6n6GK% zA(aPGyz;t3unwQwzfG^Fz9(Mwq1%p|Erk$1`|!1bhdzFB{7%(jc@o0^Fn+FMTDs}@ zG5uiaaEpq3fH=y#SNjP@-eSkk;};-;ceHWFn?HZijq{-LJI|vCKXV>y;5T_FgE}(L z(4(D+<9CnSE{|ZW#q**(qLIgW3FcAH8qfO@PW()SjWhE2{HK4mj(7vn&_xEHTftn+1f~N{)>x@=zD7Q)7{5&8YK<3Z+@P^pV~0i# zV3}{1M&4r#@7DNvjZbR)zQ(;8f2r|L8b_n^G5^U#bn=NBPt(WeXk4UmH4*J{p$@Ot z;m=SW^2;|O9u|XtBQ~ifFYp_2{`|@+>er@HgYQN3Emi`zWtD)^n=SEXzFdj@i2n8+ z-TUkD-RCXp-tS{QlTNIc@>u1w`;Ngko>#ede;d{bc^qL6-+ui5i{m#|e+PP%Snp)f zS9?Zd9TP8geNR2U2`jN5Q5;CU+ftNKt;^V;%ix;pZMuwR$YvQVtFSU|=-B|-)hMGx zm(l0c3y5lu-Sb`=JD(`tN-_ z$z1i{pP`tzA1qOtO*!hnfmQ!Kkr}P}?CiiLqboA1INg-EZD05UWwopfvEomuKI7_s{aO` zR6^pSUmS$$zwcsmmbGA|#h|8le)gzCRC=bxkg z8|0|}207}#!IxD%7bd>R@=|J}#(o>uu*C*JNO6srI3V<=Srr800} z)qiI(uw+IO@OKc@mELuZ*!A_1}F=-&_56HBZM;|80Vp63nb7 z<%DC66|8Axz zNB!4lJskDl3dTF?zZbJCNBvi3l^ylpWsG;!f6wKmbJTy=F+7m^Zvzq(s{R{5{r5Ij z*sA~D$?}J){)?`9BJWjPCQ<+WYo7EWQvZ!yhYA->|4)1hltiOn#@YHs5h}tL&!&=a zWG;>rHBo2y{W!Sl=CKq0~H)L*97?;KJgR&v##K+>t{7i@OQZFu#-zu(STDp8L zufKGh-!^%ekLmj2=oaUt<2M!Gmc|(woF8`%d)+vX1*kmF1LMo^Jl4Q(^1$nD2Iumm zbHI4>xxD8wLC@#+kT$U1SngrhYi3P~MI3n>>{9G~}h|(ayx}K-jHc9P&&*K$cM6UGOsxuOHpZ zh@_sNag5{dK8@!1Kac5~dwUQGFq~^M>3)TDC^~eMMRzQINEf&@w{?b=FBUz3!_2I$8!Mz!-O;y4zo%LtWv2N(x8C%u5 z2-q>U4P8Bc*HV0_=HB$KSumdbht<3YZ~LY z9IVgr8mDL!{bL-bf*9jP{}}jJI=oAx=pWyyzbzEc(Yl(LV-?{xMMWkAb3p3>5uipy(e1MgJHm`o}=gKL(2aF;Mi6 zfues56#ZkM=pO?`{}?Fx$3W3P28#YMQ1p+1qJIn&{bQi$9|J}I7%2M3K+!)2ivBTB z^pAm}e+(4;W1#3C14aKBDEh}h(LV-?{xMMWkAb3p3>5uipy(e1MgJHm`o}=gKL(2a zF;Mi6fues56#ZkM=pO?`{}?Fx$3W3P28#YMQ1p+1qJIn&{bQi$9|J}I7%2M3K+!)2 zivBTB^pAm}e+(4;W1#3C14aKBDEh}h(LVTz3tdG-%i23*qb=O{6pu-D^h?nOJ{u$(RjK^y{?PYegL)obr9>_x=j}Go11$JiIlh9L4=)Ipv2DVL0W7 z7-KnQ5>=X0eiSkNamp%J^mGVvIOQ)OXgTFCGcM_vVy;%X0eRl({%i5OT^w z=!cxLFwFBO$@z~>2zMHC$|PMar~GkB84jl`t0!4bSybQ$;go-k3oM+nv~0*JbCog6 zDT|rMo8Xi$fVAG6avd*9KBxQ~3$~o{Mg)hzDIY_TA*XyP+i@72@+8(F)8*d{0o*Ba>}A}6>`e2vh}BnFgU0DGsr)(IOR{G zM#3ro2T$E{%G4zdN#tnqN;eo!cCsxjrz|vaznt=!%xgL28(EO$l>fknw4Ac&s#s3> zRK{9Pc@oR*ms6%`h{GvA#l)6V7Czc?%0j?Q=Z6555Ot^o~1gR@+zjcobm_;EvGz=O=LOc zPcqhW$~!5`a>`FI)^f@(FxGO)ZLD^ooH7@>ayjJ^*2CeHXE5I3lvlH?0XXHiG5&CJ z$}h0OmQ%i$vSJq?C>B zIueb?PbJ5Fs@+q@13bzoyGvIc%;l=gkS@ zJ8;ZB-#fV)dIQXk*HW9Tyj-` zT=H7<7wYyI=hodEBf7^A2bauiX`Nd-W?BycmrTB$j$>MK$<#G5j{RW@evC8mmXI-2 zayW3^+@J@oX7EEfi|{+jBZJ4rr6iwrlt)(WaFj<@?QoPwR_!ntkGz%l559u=ei|N+ z+>vSTG%Rufd-}|ty`WGY`4MH_9`eX1pq8UyGo0d{K6~!yDOvQrS~Q!GH1l`{Z)AW)n_Y0Xy6IOz5?p&s^#!NUM`k zwQF(E#>KxHF~N^iuuVh0b6Qm@pxX*c7%e_Y5$)Iqr(f35*J(Xic80(ZGpt#q7 znn!v&pU=We?)5d~%Hv*@{Al6>jM58g#S;%8g9()+);poXxz`^e7r9qirC_!>578@{ zV@mZYxk`oN3E7}!t_qbTM8j#G3XM**^HR)Lp|J__(!l~18keYG=u8zFpSYb(aFzhuo_y$}l8*-ZLSM z-0L54iLE{F->`a(x(sd48~q9k&Yp#YvYii=zWU}~bv|zA6MRwy;)(MqGUQ%`xao&` z{X16WA(d}jLM)#{d)@@=5OS}Zc=93l`f0|6-0N#BZwTD0DsN%pcPu@$=iR}})(`h8 zMy*e)e5(_}Fg~L~)rm2zS;)Pn849`A;8a#rbFa+cZ0Exu+MC;L1m8unT<+B-rUlv< zow$(gd~{N~olhtVr4_uL&mE|daIa7E4CV(E!aYaQtgc~Kqsa^1U_ALLUI`Ohl5Aw& zvvuCl$ulU!+VcuGc8-p%OkTyrmV5mVHsn$ryC8WTV=ec(nz5F96|KvaI`Puv!z{?! z^S;8w)}HsbtmFkcadonpLCd{f&cv2`<(=truZlr0UYl2G)i;qc@qrxw&z{M z({Z@h%OFO$S9t(f?)5|#Kf+h7A5BhVwnDhqpEIH5UNaP9xmO`i`{!PR6q7sLt0-q) z98A)EK#YYg_xcW|w%qGS*&>#EeT)roxo+*{$=1mcxpQz+Vk>WHQej_*(k%~UiE{c|LuH&mr*db^Em@!9ls0( z`3q2GHP(Tl?r(7|{VG1L{Oa-dA;yzI}<-ww6Ebd^YJ@-QFM@hiYM<6Vpc#?Ls;MDWdMoQXRd2b{y+Z*d-6 zkCo>^`xBloUZ%bF#5pE`bzY4S#2arucUXcqFY{9#(a5_}=a~(pTLeB}hVsgPrlZWO zG|EBzYwjZ*<67`@&tojg#jrriMODLc-v_^`E4(`ydl;!5W%8BQnmE z`_DLlA$FTN{vD(%#9s9^qc4N<6?~~G_KdUQR7aHAJ8cF zu8^}^hsE9%;U{$XI~v8_701Qi6)5(uz&I`!>ml~8z$rRRWmg`TnHON24vW1j!n<@> zcuItYrv!?|KGJb*6l=cLj>QD^Rq^fnx6p6nj^o*t-J7-W4eJ zu0XMO1&X~ZP-cUHV($tRdsm>?y8^}D6)5(uK(TiPZs0dIQ0!fSV($tRdsm>?y8>li z8YuRzK(TiPioGjPcuJs5sQ|^^6)5(uK(TiPioGjP>|KFk?+O%qSD@It0>$1HDE6*E zv3CWEy(>`cU4dfn3KV-+pxCQD^ToRfnx6p6nj^o*t-J7-W4eJ zu0XMO1&X~ZQ0!fSV($tRdsm?Flt8g}1&X~ZQ0!fSV($tRdsm>?y8^}D6)5(uK(TiP zioGjP>|KFk?+O%qSD@It0>$1HDE6*Ev3CWEy(>`cU4dfn3KV-+;1b-!y#8YE3KV-+ zpxCfr7IeumL{xSQy_ub^}LYnP+1LW~0-PW^x1JcgAEmoR( z-@eky9ln3v_Mdx`w&U3L*eeGPymDe`_kP85R`2)rfCKgRMqWN}VC3>ysNd-B{a)p+ zo|}%{#k%$E0{$!V@WlG$L(RI#Q$X+~5@+LW6g|p^dM71)f6VE4S)H8AhuRg4^BK|H zWs*+L##a5%rx7JOvYAEN<&gPew5F@e7@E8m|7p4! zeH5i>`joTaA$@u*ic$1wC>;lOZs#PFpoZ+q$DQ3&nUg*aXisPF*;O|SmDGK zPM?y4A$=+@$Z$F2MzoeSU2R6)?Q+P%I?h!!DoM!7&hu1gbmDy0Av9gRl~NX{xN(VM z*7i&l8lU(U<8n<`xk9hdr$P&d%OMMgWS2w!9Wz?f)w@{YAoOVrS%f~7mJR7sdB*`cwtt ziNB-BkUo8xvihM8hN6Z-pHg{1=+m3oxYl%)N){nO8ci-|tl>-JNwL&5!IGpHr&`lh zF=@8+=}z`TYr1+JC0qKGCk*AX zw5F?3O1AXr7a42mQ{I^_eY%%nhdzChB|G$~P+|^!D#M}P^yxb&#-UGNfEb}qC?!scvT(xw4Bl|))c6hyq(dO zKK%y@xAf^e3b*vBFuvAwRhHAX^y%-J*wUx`ly>OTpRioJ9P$!gR!g5kLECfb(?=L~ z=u^>KaZFb?Q<_7cp38bW^yy2?@0hOM!{QwJ^d;sWfIf|U9PKg``t*NUprubYvp$2+ zryLgaqEC6R8v687R&sds=_JU;Bcgx$^yJGi$np8%>7U?BYGmL*2i)oBc=T8v^w&*j zXodeC9=T)!7Q973Qe8Ts-gqxQh2P!&IFVRA5lbDPxSi>*IOSQKfIpssXmJiVD$08< zRgLH%6=`J^{IOH{Ss|b9-U*0(3p20b_tKl-UXS-9Bg-2rBAw-tW6Eb%L^^;Ckul|w zlULqQ5!t-*owF-uR8&r%bwZ)U};8M72ytLA)M+fPhehK^TO_9eV2 z+?UWh4aab~;5u=+xIT6|-JWS|>gde0r!!ldI@{W_brMfWDkb``c4p|zU^?AV-&Eh! z+JwofmfGe_D@?lZ{mA1DUb=Z+RZY6K3%>N0x{V0eHYmG9EWcdS%nkT-?B<&0F3H5i zj*Xkzk}tiIOO>;xEmqu3H*~euVV${pOvafNYwNOITu--As@785 z(cYQeQrBTlu)S(Q$mFRnX3tswI9<276Rm+1a{9gbyVj;`EvUe>S|qonR)ibbjTtON z-I+;q1z_BtOs6+aOsj06g=PcRw^j=+3$w^%vNK}t_Kx8~&1OqSsZ?ub3oZ#3!p5cR zYUawp$gQ?%w5uGeQ^WeriilK81vj*IZfnCnf$4^}Y)2Y7>zcD28E+U=djrd-1lWvc zyQH2A2(u)taRsH07prb4^F5;=OxsP|3>YFPhw; zE;F{FWdBd=R_}dNsLmNyKvrDFwU!30%Vsw5}OAXjkMh2h(g<^5Ji!A5Rf3?Qk(faz*7TDS+~ta)2L;! zSzfplF`hfuw2$_4SpsMyxyo1%vC!FjQ4!Rx$=Iixl78U z93!t5ev=1YZ!3sRo||#zeEEsx%KMY%E-8>#@_-Db5EieHm?m_s`S2)Ed?p35a#RPz+ zeq{Z^J_Y|s%vC?yM>?igBO(=91)cA~$$6UU4*<(jZT_xR!9 zR?$5j7tLcsqrw^61itW#PlX5E+VXta)2urfYX=){mCqJ(tuw87d5%=&h4I!^un%5x>p%6oj!^@O1$AYZ+}X-p5~y-E~* z70Ble!z(nd*SJyRPL0B^BHc%Hc(+F3S8@Ca9sZ6+P9sw;2oS;7Gz!0ppjK;c(`!mk2_Uj+)k3KV`7DEul= z_*J0rt3a7P1`59l6n+&b{3=lRRiN;zK;c(`GARk<6dlh`_*J0rt3csbfg5zZ@T&+5 zzX}w76)5~FQ215gt2+H3Gz!0pg0)<}%3cm^zeibPE zDp2@Upzy0e;a7peuL6Z%1q#0k6n+&b{3=lRRiN;zK;c(`!mk2_Uj+)k3KV`7DEul= z_*J0rt3csbfx@o>g0)<}%3cm^zeiisiT=kpZ z5%FM`^@RC=#{-=GX_m$n8rKo=KC01Sxu1}p?^)VQ<1sICL>&H%QY0qi=-Z$`17Yjp3&UgW;9eR7w5 z*m5R4vUagiULvsqkH@0Ew;wIeW$V1VdG`3>y2vYIs`$|xfd2jX7tr`2v|bFT?FExX zzLeuJ9T!}VkRK0Tk(5zC7Uft=qz19zUKP2Ehl+!ZfOv6{&-anP$j>QmeKF_1-oBPm z)oKItK(<#nxU*E|O3S=ZsAm5TzhXs2qn@}yLwfGK4f~LBtn$**=xVCZ^Bt&K?{DDS zjGyX7@ZcqdpKe+S^Pf3i`t5Xz&XhYh5Ps?p{p&savXpOKD>gjNkII}tA79Us_f1Xf zgs=PFU;0Ns?$(@FUenpx-c;Mwi3yt_INpK0Rr&m)tHRIiR_alsY&!5L4Be}7+<6GG zFEc;WF`WN>cLk2QP96(5kpF$xUpkJfOdiT%I(`EgXW|y)fblbqV|w02#+kVM@4Mfk z(i{WwJlF>2JowBpdEoWPVr-*FI}?}xeYXpZWZH#j(9wAnH3cUjQdzyjQf^z z+{b%Bwc~F1_?8jDz`lolrkxq@4*O7uLno z(e9PkWm{T626^S@3~%Vy*SOE^R~#46os8cI@u`1%@&3b~JP&!(GabYE-3EHJGjWR%HhxAuj34hJ<4j!sxbG!Yx*LfG8~0rb0sIm(&dAFj z_uYg>GVMY%?NSTB$wL{1j{9zdywONs$hgnFZl@KiKWmZ=i8s6(4Lyi1spgU+!VADpJ_EuNmnI8TZ|cbO(Ff$M19FoKrG~1l{9@ zW8CLnlbnV|Z4SjeJ^KzF`y9u8$4N;2V}A|bi8Act8%daYzQ~1BI2>cWi%=HFfSgDo zHf!WJ6T{bPyqSppd8X!*ZBClupx{Q z)PuP9T;CBk=6g5VOh#nESKzZ_zAG4t1$=Q zqB!8EpBeLInCM);8$icisK$ItH_(eQ-y1+o;&%c9)dLRxm@jw87x|j!hoe4ppMK~1 zSX(pZ1D)8%m=6bsGUR)c^J!U*UG02c&M1#V!6R&_2hAarRJ1Z zl~<*vVyWy5lyRn|rY_0WXD-Tiwby0Zx1}&NO3kjUoO{)rnX{&O=kU|9CR0<}jiUExo+wj?B#x{R$V?Js?cBB4< zjQKbpU>whxjt?>SeY+C@(=J5QF17HRJn$Ag=HuL9p<_Od%Z)Q-<&XJ3>eP?VB~!or zF&|f+OBrE6BQJl<$GJmOzfwnD{#+jy&^nMOk23FbWHWkpfn&aR7dYm-=@5+h_?$M* zw2KKFbdMj7F(3Pyb#Cd0X3Uq+h4ERzF`ta{^s#WvM?DPA^x?H3Bfk1SpYdKJ&V}Q^ zA&mE$hBDrpUs?Eg?t?}?Ntl3SB=Bw6tsAN zN%skT6XV_jJS)+q;MCmcBJq13O@RCp5EDFrf8jVe`Z`mpb$ste5)7F+^8iECci^Fx zzm9Je5^F=$n;@khLsVS?Y-v!WHAKCanI}xef2_lqSi{idwGx6M>R+QYZHW3mC_gkr zl}#hZ{FuqO5u!Fky&qm0qD}_p8KNrr(Zr`16|UpE5U(H;DoIRr;tDrJJr}uXh$>4y zhU@sAj@ky{I==5>1BdJQu3|ZJRgFp#KI;&!<2#da;X1zOQ%bmw?>@$b>-dVMRPH*y zUqmrth)T`RAT&gs&JwI4>gO0~4N`sM4~bAu1J7?K-|IC^s}jWnF?H z8KUy@n1-mYGG}OrdLzroU&r@x7G(`lZ$X;A4N>)F&t1n?j1@ye)K5}YKZdAhv4e%{ z_`b-Bg@&l_WhgX6y@x47LsVHwG&Dq&eJ+P!h^i{RFd?Rop&{xkETJDm)RAnYr&Yey zi7uuL*YW*Fo?mE)x}BlW5H+Y_(!tm9<*MGfhNvvdF+^psKtoiW)Ec6OqK0CKT8}dp zL)7bd8SFZ~=dmS>scAGRHoztrPl~pl36>U((stsyG! zOxF;#n_M5syqO!A!@*Mb{*eJ1_v-i z{V`fe3{ii;=CbSf-oSj;5cLjLs((Y&;Ax(OV~BbTrP+0SpJ8@uh}ufw)(~|GW33_T z|5BD+$9FL=jWtAloQbU=sxV`A9bZx6w1%h?nAaMjp255uf{}5)!nXU#YZ!J6Q4#d8 zhbnteq^#RduH#uahNz_fT|?A|nBFl&-NfP?L)0gje*i<&;Db2Tp%|iml?7Tu)OoDW zAcm-ukY&UU{Bzgw<-KYQQRlOg!!tx>Lk(<*n!q5(r{;;j%$L;2kirj!sGwn&upXF_ zo8Wh#A+Vz=9?M@v6H=`6i}b4`{e@~RyTBU*xd&HOZ+O#XuwZKLs?St( zZ0qQcU2STGja74VMQu}SMR|Dz*8**{an&Y?@` zpE+KJun6}S;=*#a1fO$F9=fhrlUuXc-!2bgy48V|SS=)tx4bgc{z zn%QTl4Rb^rdk&rEm(G&zW$HS3fSL{H?~NLPrS$Qw`$=GWF>`oUAtU#6K#IQ4T5iI?YQ z+*_G5NZ};=;tbGC9^?39JoV9xV}FsMC*JsqQ)p70LUT9{r4n3cwpooxnVxzjl|;;+ z^FAHah7ey8?9nJToG3?Z zIDulr37mpX!t%w26DT&Ez&3qcY&a2?nMt77a011K6DT&Ez$bNjvEf9xM~B6R6JfF8 z1d0tOP;5AXV#5g(8&06ua011K6DT&EK(XNjiVY`FY&d~p!wD1{PN3Lu0%cYRC^nox zvEc-Y4JU8|Ze*Uf*l+^Hh7%~C|3LZh28sy?CC^noxvEc-Y4JS}+IDulr2^1SnpxAH%#fB3oHk?4Q z;RK2eCs1rSfnvi66dO*U*l+^Hh7%|@oItVR1d0tOP;5AXV#5g(8&06ua011K6DT&E zK(XNjiVY`FY&d~p!wD1{PN3Lu0>y?CC^noxvEc-Y4JS}+IDulr2^1SnpxAH%#fB3o zHk?4Q;RK2eCoqZ^Ag{OBa011K6DT&EK(XNjiVY_)--h!Tyl|L*95KK%Kx2yi9AUm2 zUETc|I?U$<$(%qDY#xdANf7U> zuN3Qb87?oHcz{tM&-V_DhU(Stg!aGq}wB$DSlAN31Dp063LWqH0!7#H$<%UFky z=ldf=AJSOu^xPowrhM$n&u-L*w~K_>$-Q8FPj_-_0x|pXZA(iRJljLz*G* zeAiH9$n(kQq92~`TK2<`=lge-8uENuhC-h2-w&-Vli9)Rb&fYKbE zZyn2a7M%Sx^E*6WD~oe@zQ>qATD@eavy0;rizAVt8Zu|DfvW z507m)bX*@kB;Ews_x)aEA3k^bwKGT|&TxAC_MuDZpE)ji2#oL+;o@qpuesUdr6$?e ztmjq^3EMZki({!EY0QJR*z8ft@F1-ZJ9Nshf3~n+rY~m|*Z~BYGV(;Vgb4$X3} z=7BM^bzhGXewN@nVhBIH5jYo*7qZNU0c1^}Mf7Ngcf2@IJ2_krxiZe3@two`Ooyqx zUbf+#IOaO0r8^v)AK!MynR4?vzfPP-A)Mb-aDMZR5C}Eie9rG`hf`yFn0Bdk@~}=D z@KRqyk9MY=^Etnrke5Olw(~%oUpM4U)3OMre)*i={Z9Qjt}yk>w-b6Aktqt&&dA$= zu+yyGry$StgMm1|mm!b4I~YfK{N1O~9KWtW&hMWKyyWm&W^z!UK-yeG(C~6Q^jLgqO&h<^3GmZ_xD| zj@tLZ7>-TC5_glk|<^3G{ zzNN?(@_t94eV=HXguGt|@9EIK?@H9&@_vQe_lbr~$ou8m_dU-Na(TbdzV9=P3wggh z`#ztQvAka)_I;ZmZ&3Tb53|sa_dBHaeIt1amiK#8_IIHe12KKs z_X$5}dB3Y!`T)FNfA)Q%>1TPr|6rvD;Qa=%?-PAQ%lkdbN?G1-358qUZ(#erk<8mK z?>992zOS(00eHWB`@Sn!w!{1Vp7|Z#?~vQ~34dyNzxS~|!{PnNof+Qm(A)QI#4Yb9 zd_KDAQurzRzL6p8_Z*KMCrKE+h(T@NcdTLkJpWk3`OV^q{{`6hy(!9XB-a#MwaGE> zllAlZ+ed)yZn(YvI6uy};9|l#_I=Hvecz#E{0#qQel!pNV~^mU zzmEUP{Yd~imhP`FYMJHv(h80$r`UX`Zzps?;H3Z$R-~LOo(2wR~5295Ss?`IZL@e5Z|ThqV0i?Mu98?fLj4S zeLW@2f6Qv!aHmVyC>8ol>=r{EP4CI1J5}j+S)H79Fp(t?hbUYb_eQP z2h{CY>haclt@vu_U~nutm=5S_(?d1N!w3H9_%Xj35%-s_5@}2xcs-`uM2~hRZZX2f z&!{ipw}&3>OkBPW=%qN1ZlvLP&@PYAKu1F!>qU7Oa)tHF*8#l|@=}O5 z&dA$=131OdjdSW(ilgRy^S=xK4)P9!xl~(F=6(1X*^H)r@dA3ZGjR_hj41Uqgr93d zoMI9IO**K2hJA|Be?q!P>Cw)lBce*7n~Fx^!jOZl`$ByXKBtW{@=VyEd;DLV0>2nwPaf4UB-G2XK$cs$j5I4J`afVHS&IDc$vo4 z8ZXkwfeqtpG;Y+$`+~=>)p#=z9pYAvU((3?#9dQ@&j>8TD9;Ka?@i{bt;@D;a|W4% ztsyac-rU);ghT;*1MO80hhAe$Z;#po+{Yf^CD;$Vp!MMU7;h?Vu9!RQ#6IBeu=7~3 zev8nF@^*%dV+_hA8uS|JBg`0d%EqI?kttpW?#>W6%*Y1|8`=g<#-ugnI;!LD}p2AB2|q4Hfu0@cjWfMK+G% z6nPQUb8!!R@5N7gHn8tOsJW<&?=^sI&a^gmZtQRCp`i~U-{dG)wbjtap{fP?SS8Yq zWJ96s(nohLI(U0ky8SE4P6o$ujyndq8Uemn_^jsL&U6gZ_LX4_0mNOZ(SSS|5SWf1 z(+`%8?;eu}UXSwl{xHtOEye-kXWVo6?V(3I6UTR#dmh|pXg7}WJc{r$=aD}ay&D3) zg?QtPy!^4~3_K7`yAX}MTKG*K%BaT;Kb0QsOgmqRuv@<>$m9Et_2aYF$m@XLmA4D> z_`zzNiOV00E_LdMS8*sWe=NEi@=`_^(8${Xzgxf6PW=WNi#`Q;w9Pk;UjFXWXpVmu z9b$nAIB^fck0`z_#Ll*_RLHc$D`f$C;cFBVM7g zPUE{ZUZwFmjW-d|Pj_kjdwu+I9cH}?8kcrtYTD~Ih9lEK$E9bUIj_)h=|VoF(50#b zrsCV_IPdifX1?rs7wyLv^cY#+tgU;$cU$+qpt^fsWPA5Mzq@wf_uPNl-Vqqj7GXR)YH#+*lqt)G?{>^~{kNRyp zU-;F51J4v8P4v6Byzu%3UwY{jNz=Xm4+jps(t8gicUbGrvSPwjkA-7u0Gv1G?RP)) z{84XJ&LDWC83ZRzL$j1vD~Ds0m4mkcw<9hroSK^5E`F@`2lPLSf1J+6ICcj9NAAVH zXmL~zl;W@cnmd1Uj-Rh2s{X3m;9Yj!4x z_BCGTv(32e@GLEzvbuEYt^NmsnxPe@rAIpx$1%F`GwNalcxM@Byl3HnJMQ@?9^xFFwoI~O@Y>(|Er={%MVmYy76h z=QZ|d{I$jd8cT5Mtp6T{Ay>`|%`NAJFrSxw&O>)*x73BB{nX$#&2ttMyq57zd|05{ zRS8T*e;wm(STytH@mR-r^oCnr@G!>bdd3`^$FaWgsOo2XI48ZR^4^~KXvBMW^o&Z~ z@`8`OOT7)ZNSyC=?MJ>besy=m$2i}wz8eEqHCtu7bodNXxn#`@Tj*Hy%Zf3PJQ3B ziC?WA@AK7ZR8Imtjf#pVF=2qi(OC2!;fJa8ClC?T`sXp`zZg?o)IooAaxs^pkEYH+ zsF-WmMkg`Ci|@d{oADb#4<2hOSCk9T8;j{^S>iziqZ3$QfE`gk!_efl5{i0}Y6i=0 zXMXMv89j9>yd}{H7nhI8O3Bd^Sz_@qTo;*(2ak(QOZ*pd#oU#WW7C!VXyQ&r=}d-j z{G8>?QK4w!M~tgdp?Kmmto&RRDoM~HGB!_zMkoH7q4_E_HnE3N7O2p;!~%xSRH5++ zuH6$mONCP2=xNCKB8rLou_Xz9Z^S~2X#~8OT`744Gg^yjelEraSt+>(!f*3q>r~5z zD<#v|I(CVwLNxI>1%(#VtV?W2JEAUzw0JC&_zrW1Dz+ zMkn~C7JEqL8<*hQAQrBaJeG9`S4!rHF&0`(Kgzh!Vw(2dv7D8XV_#AwRF0 zofja4N`G0Ew=nTE%L`XZ=91B|9E<7L*Oio|3G(i-r&YeyiTCsTo>8IdL?ufPEvC7W zdF*>%f#jg4bV)|GHFVKmrlh-k?T`74BW39zB z@61?NupJO7dn!nB1Ql~Ernm4U9E<5cFy2`y`9B!GHuxdFf+A(F#&8MP+OZWp9misN z0}htNiv6TKTJ1{7^H}@{U$uTT$vvfG16WK?Mroz7$$s*6CbTOhzmH<9#q@EkLjM-i zQ7)QqR!WX-43b>lICgQsR}=dHwM$~wV)_aSw-(c%U}9@A{bM%o<+`<(Cm&<1T`74w z^ID7PI!d-XqVmNWvnwUv!=PO$xrL&f9Z{<(%dwcA$oN_*Il>)LA7o9Om6G32agN3G z?TmLUrk66_StKV;;nC|~O*JtfB{;V_PTTaG`5 z|M3^`uN9hwIRH8igJ3L;X+atC z`0FOL)M7K#5wAmXaQo;}WY%*eOZKZLv~5AU1Pcvrk58!e{1QH;g4;(;^ts86f2^cS zVfd9mMPd^pVtws<+Yt)9_56R3=0{~)#{TBmhM_h)yxBUlo9dg&EjznNI8HW> z-C${H$x_bU-Vj_bN-rYJBa2N&M=B`E`!~m3*+L!M3Ab zx}mkEy|KefW2eCSss)~7r>w+d>F3PWrp`(aE9+u|t(IDoaZ6o?ggf*BtNxoaZ}k~q}dqMiXxrS(bU+QsZYuDYPw7I+LRe&yC5(Y@on(Z+14~` znpWpim(6Z!!ujcaJVhj>rJGvXy4o{ou0Rf(;~JiOQ%AaPYYon@o(&-r)7Z+SJ=3|l zrn$c!-O*lG(VE$Utw?9iDxX!=)}GNpZuVPOp_isMeJI=|G~3Y7k)aiCEn5$5s9QpM z6*Q?4(GF!8(>|)@8d^~=HUq7o>ND-A`QoNVIh)3smX;ccgU?I1wqV!ctlAdUT1rbw zwKB5an3VNFF=~cB_jymM4d|1?90_(skJ`cGEQaUKi4LWHOr& zLOr%fJsR4w9ZZK_(3(}8gI!};nxcu_B$GkeY#??S^fa>!K|`x-D2>LdM}qXa)mhj& zd4f~lL9T<#Ir$n%yyv+wO1}eEWCMMRgLNm=(FjD zF1AIu32>`4qY|agtEr=&7f2e&b|g6!Ib%MV)Tta*ml~eBRG;fNyYB~iRpC8Bjs-84 z&^6O(k;Wv5U^_Cywc{AwIj_K&G#Lt!YDaad*W0W@%KO>KGR<68G$m6@-I1@)M#+CP& zQ$KzX7`X@17TO*lTQ6GlN!pq3x4L|^`m!YyKnB6~eJRi*%1_*#wqJM^s}b33_jUI9Y^)Nd(#6tSXV`YWgU= z-U9TO+4N{<x!HqLS^Sl(YjR&c=kcjKd z^9{ymUSlv`2mMia9pE(P16FAiUI$@5Q+S;BIB~tkjT(1q{D8)fXxy!l_Cw6~ghoyk zGW-*b!rLJHnhwWtnHYb(Myj1Ne7VM2jk2dJj{lVo@6sqMR^s?>9saz=CpF4SZ;0>F z;a_U}lSbLo74fpCEAVXGAT0l#8fBGDgzI!z_H;$~6FMw=x*{xlx&mcSSD@_a3M@f4 zr#w!n6J<|VpzP@iT%(U~&?tMl;`r4%Odgr}WKUP1?CA;=n{VJBbiC~8iZG|$nO^pE z1yuOUZtU?E-PD7&dBqobYxY5B@+5!sbuajPATz~$ zYxe(lKlyMvudqH|<=rta)g6ge?!bfkrkGcGBYxfcBj9ykKSyz~rI7d2KJ_gfKGssO zQKJ{}-f@*l9`;CP8&-5Mohd1fSR;+M}DmN;I?1b9D-kk%> zogK3iTaJif%%+5sKr#_x%LtFNHaUSl=7l6L>(Tez(&7Jpe~aopx}DB^MaUhGPKe== zxG8u#xXuJm$3eVO2TeBvX-poHx2ICmN`d9_>u~U5>CTZ!P4F z#xcs{aU+l4+OE7OA+HR_j5BeYaKM#U@6-?8P~HysO&-dimPU#m?M&RY2)pu{o%&%| z6w3P${LEv{u^1Ik86i53!H;P_K-}pV-!3o#pvm$8{HRi!iAp0~A>ZWJARVbLC3nnk@B4koW^)yrN;Rhd7tz6GL5S>$|wfMH|TJ?My^W3^xHMwsPS%%e@jI9>|exh z=;Kf5F#AJ6c1!Qcv}cE)$2fcLyak2YE&Whk{+w~UKl;KKU`I5I<6M9AIWPF$Rr~$Q zJum(dV`bVG4XAgRH_pYA&kT3-$GLVTCu34Sv@z}%*nIfmCXhav62IqhNGpatW{kUu zNn#OBd-QKp&(0QF48@`~2u6N^e;5Ei4+t&mi*S>gF|8k6bc|)ePfuCJY}F$! zCQRAP{}+yw?SQAgOJa0SIKs{8rPK94MxExD2c<&s_TqSPON1^3pWJ_Pb834k|k%Q zrh-G9mYP#uRbG{vij6cgurnHX(dpr@_50^Puq4;Rdz0@6x+?rq^k`?^e3KAnI`d{+ zYZ7Q=9Np>ox#PiN74X1tsjVt#+9_O-+qnE$@aphC!IE9QWS@A-~m8T$GA>+#N zYy?zjEMTB<<#?R08B-x?PMa}ooO7zE>aPx%522SGw0YzgCB0Txs4* zDO6gGEA{IDBTDl|I#gpx;a*UIbts!-##)U{8rw8((a65dbT<>x4{z1jt&cyh!@Tx| zj3J?Q0lgWmK!UO4U~|9o=N7&uQ#C7r+ptu$C+QB zm}~Hp>Sfxq1y3(@3if+>ZZ6kP&;JDaFX4?4@b!i-3N_Il<&3%B3~>*=vEVuYEPN&) zZLHRx1WC%YCo;Ks83K{ia{Mpe04b5aO?z|+!7?N%EfZyxSk7D(DoOkY zL-SNMM5%+A_EaK^Y=$T;8=Cekq2NnYg`$ae$_-6>SeIZ(rac@-#e+=Z8RiU4d%nOj z8g&`a?B*LL`g0a#H$(gq(p(XUX;0vq_5{0iKAQFfpHzW(;z5cGO?!l%&oS)@LerjA z?1vAjeB%;NuwtQU&qWM{rahlz%Fwjudu-FtwCB4_nPb`$1 zL(`r=vVsnah+B?S5OnVr_#d$aCF_>wOPHIhiLQxP%60rFHwdy?Ky`R@f;mnncPXq*0hHs@nETrU65>HVr$y-9D~-h z=V~TisS__vHd2%|?b*m{VoiH~!^Czo#79|YYua-^6I;_B-kI)Zh%{buH$(ggg*m1@ zw^N#9+H)%7dz<#0L@|zO&m%}Cn<2^rz?$}OshYrUhIko+1DN)F0nJhxz_jPnY#(dd zLy97>rakwwQvI9u1YD8UnD$_oz2q+#zF3>*cu9Vk2G+FaZVI=iJ@Rg`raiLPL zv}Y3Q?U?q+7}_!I`5PAJnD%rt{{W^vh{FT6IDS&xF{ml_;xw}f4Qx*EPFRER>j6xA ze#i=1)1EZzGl*%=BxD(}1OJR^54!4!yjRU;h)Gs*c&0s5Ar_B_{!M#MeisHgK8N)n z?U|T^92o9gjPm`_%Kdzk48REa`h{EKXTA1hW$O+4g{=l_Gl@+(t@ zVUpY09!D%{`k9;@j;28F2b;{p8Uq|OPH2|{zc$8!59d*zX;79s7*yg2MtH~i^CI&a zB8$smoU<}Aw>)xD`SQxjS<`2|7MZv*a?GO@kt_cNY6X>*Gb(4De{ba74UrR8Ha_;i zoKn*KE-X(q_k+jq%3bC61VrXEjJ+yIy zG8f3Vfk}($iMHy z=4@?Ev#WKQ7CR7YO=HbS#1tpA#;|G<{Ei82sd6l0@@-(mmP6S*Slta(F&J4XvkGN? z6WVHMn~!0b$b@DW#!!P*@5m?vq4dTqY`eqhbY%fk_D5)8q{>cE=sPoSd--1 zSM{=WF}7g6nFidUq2-P>V={JFEj3%E8o9=G`8IOeF2~r~Nu8B-kv7Cp);^&T70!v4 zP5nGL3o}8>e^gp)A#0?xrOq+KtIO8Ivd6U;6w5tje`bwwX!}EJAJc@!z)6`ixqv;nd+*3Ia7${^!r%P#1#lAD6#zUk(_Bh&vho@sbH$CDv6W|1cIm=4U#* zfO^^VT+K+wnc#FBV|t9N#Pyf160s%^6EfXjI|qz+ab7wO+4xp8&ZHwB zW5Pb<&irxc_`yuke8xII}^79VOL(8 zQ$J)0<=q88^YHr7y%&*RGbf2KSaxxKZOyjUUh`Qx(X+TZctq2H_`kSiZ#({)rBQc#!g5(->#{5r5Q{xPr6&G2h zuC=!pSK42R7^4aKdql)!&7J6{5r<_48vr07g|pJj41Nw7oMi^*A&*{W@NUNR%|%94 zt|*tLGF&8<8RV_+U zAQi3NdaE67TjhV>HJ?L9M6UmHSZl$+ZhCayQa!^use{&l)U}hS4ni)Kmu@;Lw&4<@wk$+-hYi5u@TWGP!FEO#jBKc&7j+w!S810xDyphZtERuM7 z=wOlj=nnV9B8laM4i>o`$?`*(85C2i#Ug1>Ewp9^kEOR0Eb?vCwr>b5lKMTN#UdM- z&tj3cvQiymk|l{s)9+xBqggM<%-|AobFj!m81G<_-0vAWSmYHf z&cPyo#r&OMkr9oOb{C5bfkhIs3oRDOZ`H61Eb=sD>D_=ojYVRp9>Ql8w@H{8Je8H) zJ1nvYY%xW2j75gakRW)Obr@U>c?b2yUzyK#&{5_AGzl2-lSG^RIYa-29#Nh%ykT6N z3ypEW68Hiy$^ZQUA?^hLxOXe!E*R;l?*@S#8fXxmqH#prErTQCTH%PeGT7m9e(5QT z7AaGHd*FbDOsO2ZALk}s@6YWU!?L9kMq`J+>C{Dzx=FVgW$Rpy>+}V8+JR#|i0MRI>^o zS`E#lDfEX}#fO9S9J4eP|KCG=d-nw4L4kS0QuFL6Gjsw&u9DUS_e9PN!uX*eLJ1oE zAIAw5fUT?oX5)liLVE{Ly^`vhs@02Nn(^a$%u&0x`rKClBnsiOalNTn$me=J-#dK$ zGaX(od*FJD5#~CkrOU?kI!ecNcb$j%nC^2W3_*e%ZL*4Twx>W}up11Fqfnu5#+v8Ls!A;CH8Pq~b@OTOHoG z^v(lT(;ZyzMx^TwuD2cOx`XSz20*VnxL!WS%Q#k4Io&VXuc;fpKX5&c4eNYy!V#Yx z>D<~t^rkA07`uQA_9>DQrKOC^fC;Oo?N74iK_+&rqFME6fzr*v$mksf` zNYMeL2p_5F2uy7~$M2-gJ;HKb;&(?)=(gRx8GPxZs+vVavkk`MCmJc^5>&D z;;xUdnvD$gsBDk14=1t2jp7=@Bd9+KF&ayxB$@N_L?(P24+JzFQ&>8RB)WJyLvo_O zAQtH2%@m{bBQ*+?U{U;KKMU3!b*W>R?`1R%mHXBLS5f9-4toS&S zK*dq4%?>Ssk1CEln?4*-A$))pxlJQ17R$`Uj>1vLAO^7FBzS^?o$y2nKHa%}W}@IH z@S}?3Z$N{?83LAlaX3O?V8!o)q4ve%_cDo!%a1Q|d`iW!T=3xOWnAo!Rl@rlT!J1RYOXQD zWxqzGXyb4%@df5X$wI|Z^z2y-;?3H`3K>{Y=qa5mbf}7Ban>a`j~x^iV`0BvM82`D z`1=Naiupl)zlcG7Uc_G|xKYJ%2y-rE2+QC~e&E2098jUq$z4H!pidE6a|v=96-Skk zrDmzm>%ONDP_{1wLi;1=N<9rqdc(01V)ixbMKyx>t;f;_z}cudw= zo?aFhSaAT$d*XhPuS_atKKWzeJE1R@N4?<3lFRfs&ua>PD%&?Jj_!tvqx6->4`b=i zPsH>P6wi(Sl)hg)C)$A1%VsfSPXB4(>N7(DTUS7D0lm0w)Z2>wj%0)tN5j*9MP_1p zbz)+Lh0M_}Iurl>*#ka7Ajwx;DZcfLXP?+|k*g5_F}Bgn8yJzla{Unh*_MY;BcbBR zbFiS|C|m0#uSQxZF$%N8#Zi)ohVjOd1l^1`KY2a#T3B&1SVG0|Hhg#E#KPn$%xhuA z%}hKkU~_}wNlBrLY+=Q1j6ErMSmd3Wyo=p@N+748vgA^hYhgu#RZwx1u``kbn0Hq2 zxX3#z8Dm}xE7mh_dBA&u8<-Rtk1K=EiNxn5`D8-HQ9PtPy^J$2R2&87UHn{-{4%p$ z61;@uVexA@$&<@ma|2H0LGj4sGo%()e2uZ64*H7jEl-YM-g&`#QIm6$SF(NQ2ak(_7ALVL;X%bw zdTXU>WrgytNp2vk${;Daw%$)}BCq+uDB-`>PflgL11oN2O%{mkVe#$0K=q*FNbX_r zU4C*S<7<@vUO&kt7pOSO_(%LCw?adWQTm_qy%-z8hf#FfAzt(?Bmk_)3YcK1I3DTx zq2hQx{6fX?kF4;DfPQxCA6R~EuuOQ@crjjZ;u7qKdNB@3-U8(x$mi%CsyOml#cldM zI`I%O3w|bGnO^LB_%}7d>1BL+`~p7S7&MH;A&4k+5J#`H7mSeKi144_KSnr;V@r<< z4~hL=1CE8*!@~s=ep{5B24?;rqtPI2#AgxizplK|;Dyk5+!ZkchQ{Ek3qAi0<;zD= ze*^y<8VK;;5}`xhMneCGWU(UO=Tu2YsmecpXg&+SFrT&e%c&W8VLl7>XAiwd#t7dT z!=YGNn?D_lQVZ%X_59DsRC9*YQztwroH5|}m*leme{K=}y%9OA#kXYIGm5Bcn_7kp z-^v$Nnhif@XQrHr!UDO?cYmOvU1;^V7-k0;&R*cDo;){dWr=`8H3W*=VjxglD+m-< z1~0`p#0^CVo~ZvC=!XR*v&N>wfhA#lX6%#clY?RH>qyGaGUk#udwSp4^*%%;3xB?c z+gXmE&{kZr0HOz-jmOPXPK)65rtq7A-(39M@Uc$#I$Ud)frn(OZb`UFosMRZ&^-=G z!?|A<0Rp|WW-m-Gf4q)X6E|HRi}v9US?ly*HCX0@5+eJ|r~ztVc@LG)Om)2;9E2v0 zzWOMRL+jw7>*BFhz^Q%AMEl#*jC8T}43ycReFDrEYNd8m=x#qb-Y{Ngo=>!F z9nbjT8&^A>?pOpk!QL#igW@IIL77sw;|yHuJh=2~Ajg+E0s4}dj?3>R0Hkae`H^aV zRk+r9aOrKs`toRAD93bk7vSgeyA}L&KXbWG^Q*(P%kKs7OCd}<9hZ&G-sRMfpC+0g zKNNHx@_45Mehr9o>vykHzrKjm{It#`dC?^h$$P1tF6(v#@LI=}A>Hd_q8#J+`<|jI z*gLGCeGKT&_|nX$*{&mrB@yiiW3BNf7+3U4|Xbw%I+_<3Jg zRZ{ke9?Q7&5*Sxwc%hu;r~R6`;rj!_6$^d3aMK$y;G@87O;NZAVIh`dgl;2##BlkQ zq8hO-DE~c*KB4IIioU97o1*V1`VU2gZ7A?5!XP34QblVN zU8d+~75%)TUsm)EMekAcaYcWw=3X5rRZ-I-KFTkcwku0C`G9*L;vZDp0DVIigF2;@z*FS%=y9pyz;-HC|4qxj^D$i zVj&51gz}3;JNSRA{5utWS5b}`<~vByl%l1I9;@hSiq2E?LPalC^z({tR`gqn-mmD7 z6#b>5t%|;@Xowe*sK27ciXNlrOhxA?TBYb`6um*wTNJ%h(FYZMMbTY~{$0^tTm?h> zlZuX1bfTiu6rHVTrJ^eoy4FX8Fe{`YA=PQFN1{ z;`n%^`WJ%A@KTe~qF)CdEtfS>^wY@)z^DK)ymg zmk8sWML)W$-E-F#P*L2%zg^H|9j1490us1kp zHBI2DUx7C?c)HI{x=#?g87hpy-CSxhKZc?F&-de*3ER+H1&vU*YcW;W8OX|gUskJL2BgB$TwpE-@1W;ULB9lAOC0SmS! zV`su^@YJ8kR(FD@p27l*nx=r}Gt@M#$=JJjPYs?rlKG69X2?1iHO+fis!`LtlW|5( zQ=Ac-p{Cin$=D(>R;R}QMQYSEg?Zx)HBDD6T8`}X`at=EuMNm3$kjOuQRb#)BGzFTRe3Uy;e>0 z>r8CbH2Gw@CS#Y8wWFqaE*s&fX$t(*QPVt#-1k(|l>{R8=1HO;%p#;R%li?JQ6X+q@>@wo@T3mHw|sZ_TGo=Wb- z%-WdUs%c)s)K*RNDkipSn*YfTuz2d%7;Duu`!TOo(>#Nmt(qoZtd7apXXv$Rnx~VM zqozqH4|pmqwsMO}GRAlZPZirB95u~{$<9&JyqGn0)HE+*yrZUh75$y4X@>k3?5>(7 zO~#6EC99_SW0v2AnkH{ShMFevR6eWPWUSb|@=>X2{u!nFy$1J(tmFR@we=q($SH*# z=w}L;@}d0an5x_x`boCOXl05I+56YI1A{U0bV6EO=icjh)sB z#bINjR}A3_Fjf{pD>77>t(DSjOQViKR%LxvVA!6q{Hm-CS1A2vX<98A)%>b(t@Gg0OW_4RnitA39bGo=Hxm4G zKcfnUAF&3P-wg2M`&>I6myP>Pa_WaHhTk=~)_KUI8j&epD5v8Z;CI_Q)u|sb9o=5a zyUfG;N4F0Ax}%dh4!F$}nMM5Ta=#59MA=#$RfBZh!SfoB?jfBCRP!UnH-T~60n`%D zBVNn?W;;mPR+MX8(*QYkb%5rl{hGSr{~LH7?}Z&-Zf)2ejwI{$g-#~AS-7$IZ%-$a zHl4L&zh>fjRLYcARrwDvFGC}fGA!{tw&%m>W2TuO>-?Wklye6Crzm>9qKg$>r|1_H zy+zS&iawy|6N>&^(QG{LZ51BFZD4s~c@9*pX@Q=n!mAXmRrGR2*DHF9qT3X`Us3Ge z6?|V*l=|o_N34B;{#*Iu81M`i3kRUbD*wrfo~h^oeN5R;2lO#zKh!BaZhz@x3cIQp zpZ^m>`52S$E2{Cl3>*$qnfS&Rsw#j-SwN9BxNDI2`pbrx1t3 znUx;(ETM;q>g7#I-w6MlR=ivC9!dYQxe_{=kEEY6x|V^$>i&M<3`m@GNhL_H=lYWl zMwfL4q-$Aq4~*^zyy$U{;3CYHa<4Thm1BINp>r$3?XiwD8`&#&G*Sfr#vhJ#yb}Z% z-A#}dGLChOM&urh#F0GKkuX^Yrc?u2LO^XHjnToB>Q~{7%(0H&pl^i1=(trvno^A} z#ITC=v5s8dl%`aJABuVljE<|AG^HvG^<|n;6)gcqcNG|h>X64+du;VpU@oZNUgVUqArzh&Tx|S#p1WJ^5$5_tI>I(Io9zQ`pmJ8JpC**$2yLo z&m8NxmRvHAb^JYV5lyKQ*s`Wn;qe?(s{bS#i_r~atGmGHzKB{0Q>vn84Mw++oXoL~ z)nsHaI@YCUrc`;X8BMAFlsOGXcLBL(AM5xq3$_>?HTT*#rK)a#G^MKhpSXlIrApPK zj!dbpW>w6wj&IRtFuEMp!C-U~dEX31_Z`L=jBY#2%fRS5H>E1;IW_(y%QG0=D%LXt zqqC+|f6nsEv5u2jo;lX>SM(W-ZUpQ3i^st^C_aZv)VS#SSjT6OEEA(+9UW7u^g`>V zJEl}sQmRMxzXN{)?iZ}U;7bUIJ&eEWz)vjpL+9~X*N@K@9+tKNH4>&&pJdbRv5vwx zvPR*c@r10#c4{n1^wN0qlk=I^9_x5GSURRuhcd4{*6~6nwiq34Mu+xT$Imj>VsylI z98;>JSgt+R@p2YqF*?F-jw#g#nAjfcNbtZhr8<;}Ek?&D(>0}fBw0Hc-F!B}!RX#& zyo1pRUFSV9x?|WJ2cw$_Ho}yum;fwB_Zll_k99nR**d}KMxbJDaQ=jP7sbi* z=uV@*6O1mn013K_(b1IZ73?^R(Ou8-yTIs*P=t7FT~n%jR&kqN!ee^~cb4p>DOELb zbZkmB;0LSUD=I;~g9#-lZtx(8J^n@T`_oW+DfR%ZTL{I&G7&cylMYd%p*d`wLF~j< zQ?CMH`_7K)k`;S-9GFrZ{BXJV^*N3_QcZkx2)#qDfUhW7Oc7J8h~X}v=%&ndaK6t|j6s=8u`kV}T5 z0I}dDf`po(yh07#!_qR<2$ce1JK*2POZyKt6llyhSj`|Y_m@w@5kwJM9km-T$pWN*(bh@(7C)`^Q@55^9Iq2I-r_4HWPbIycW5H&K zR;VL01!UC~dbihTQdMV^^XBgtg}{BH0@&`E zi~219ino$*e4pS&V%)}V;((W#9P&a)8@SBI0Xs^^wR@e19GI>C0>!a2q-bFWWA0z|DA(kJijUbw5)Ub?dhs{D_;denfAW zj{LK6z#ZV{VlBFU**M@1r+$YIktJT}U@fX9CsrBOV2*%D7%wr|k|7mIOgSOdq!L`A15I$O~LSfK2m z{fz~_g_j)fi#}U1#7l<@R=J9Dj}PN13oxATM`~epjS2D_dqpX=?dZD11ScHTZA@@< z0V;v%ev%-gp(8GJ^QHn5EQC&;=WS~1qs~+Gz1mhR#NcJBRHqZ6?bDc2)NR7o;855C>BNR)h%W+EoQi=-5?N$Y5OARfX5V z4QW@ECo;m!s?zQI9LJxy&k{GBC9dTj6aQXFAX>MNO3=NekEH-PnJfAkQfu5Wr#Mb?s5wK6kQr;f@r&pi zF<1CtE444ZLborZ6~r8U1mi$>B6$R3Z?IEGFg}dJ2S#J!RH%+z+%Qradr_R)8QK?% z{}vgvFF(H6@d?~8>dq02&B!$}8Xx~X>Kqx}J|ahvv6b3~oQ-bZ)2zJF?c*78(NRUB z#fdoAYNN^0R~TPME=ITSEyfw$zAfaEsoOUM#l-yRgm{W|F-I`M<3;ueMw)SrEN)oI zx^;mYeg!3O^rJIn&l=p2NMCfetZWqjCK(yrkadZAq}%s56cUSS;#7o;3~opWG+Ly} zz#{K;@P{;V8QCKk30KUE#1V{GLB%3GLB%3jIC6k`3!FOMb9#bjTSW-M$%&wYcHAjJ3Lbw0sd|>h?tzH{`aB$m;g_^jh7% zi<#Hz_AO$p#SQsnM$Qq8%h)XrZg?3R;oyc7$j!kG52k-l+%T8Tad5*Lu*r{b1f!T* zEpB)yi?_OcRCtU!!40{B&^N*nj6`fBiyN+FK8qXD07ld?ZWsv*txC5q0&YlDGqOi8 zzE9>BH=IT0R<~~(6Iw;Z-cY6WlQBiEdv6-0<_Pu*D6zZ8Pcu zH#`k>$iNLTR1e{^irXY`Lv9QJ@58w!6uTY&oL@u^*h<|FzhA&@0hkIH*)JkkI_PN; zUW8zTbc`EDe?^W4!7O8(IPU48Hr@GXTB5s6%6mhL!L|hqg5hDiD z9zt*rc!YYBS#!GIc>=z0fjD_ zziiojo{YI1S6+oNL&}hkD=gWO+0gx}6v(@^THdXXOg)f?CsyxUCBeM|RoPBps&d*A zATCD|G;%MjSUR7ImR;K&Wq&PD!&|FIE`UPtq7^GI@%AguC?_~kAAJK4=pgc_$$bJm z;^ojD_NdoU`0jv&ARMs-yl{+rubbFoy~!ajAS(!$jXl<@a7}bNVg>q|arO97Cr3Md zISm2&nsNDf8S*WuosP@K9wRJPrqM{QT~bD4dnpc`fuGKUOK$@fu1<0S^kp{oI0-Le z<|jW=&94gAIu9*w?D5~=M;SmnT~;>sILoOY zvKW5Z*yBK~>!vg_P|dFa*G{*3bDjEihCNOJzu)ObDt_d-)!~gxF9{HqRQ!h(SA+c@cn^3y7z>4i}!Yhu8g^RGT@`Y9*K3*&BBk^ zBXv2o_cm;}xAniuXNF_8>i5h1V&1Bqrk? z;*)hfu^l>je0mab%v3jQhi=FF2rdJkOjBpE3_6QE?~xc~d1JE=eMB$4u8sCXiBqCk zc@eP4v^g8{rZ(y`dg-f@|L9C-5wP2_kX^z75HR1E@Q>c>Q6nNZ1c zBs_Rf(mM=qul~~VCleIppiGEBhYFHZWueAoGr%bX`vrP@=3}PLq6H&|s8bzLMQvHs z0V9W%_{Zf7I1=$RG&-E1H&1&cM2Rp3QJ%yhDDSwC2=ptNAf2DYijamV|HMI&Tg3mn z5C@2o>+66hX*Co&ji)iD7OXTxiQ^o(2P%{hCCx#1V188PipC>}hA3fv^cH3|5GC1L z^P?e8Nt5PB!#?D!AxhjuWqveTk0c7Bya$&wKl&Duc3^&#N^#oYXe@pz1VQb~kN<_) zdTf3)0gg03I*hpuM0prG&6*!QjBy5{sfhYr(U?9pzm@)&R?4J42jpSk=O3boekO5Iz^P}PbI|EVHGNpki zg<%K-QGSW7wGibzCRM79MY!$&qI?o9_;^8-b?6%}3Z74%%FeYA zEVjkW3&TNt|K!CqWm1WIS^%v@q0p) z+{faYAN@L#3G<_30zE%M%e)q%9L2;AM7f532cjIrdN~lKFy`z)lySy85al-JcOXh( zf7*d4f5F;x22m0>@2+Yi&5u6D0xd*&6zkJdh?3?<`K)U5qdqJ7Q9+c%Ghu#oDr6m> ziuV3^zX)xhqr3y1Mjlw@ml6c^&m6K4XE~;sz@Ia8Wz8zj7jJKz#prX!_QfV5AM28- z6X`7!DSeM1f8Z7Jf8St@(yHIyt+9VZ$0cI5n;#w@;&0j``h1#lY9_Jdkt22^5=s%q1m71CDXo_cE1 zDrbekmoiMCE~;4t+nqJE2`PZOie}(mCQz+eOrfA?txJj_f*X=)J{6db zL~k>W_7jKs34~Z3;YT*ovZK|nM75xWnbyW5rHN4k5h-JqJy#(}4s_h2hQ2 zlPmWG=avAuTQgq{kE{-&a>w%3wR|XzZBz{{FH@#YGu4c<&HqY_(`X%whKpLsL4=2= zrUuWYIZ_fGBMyT!=1;BF)lB%_)pQmnge9bHt&HNa6lP3ygT-V4@Lf*g7$(9@v7TrY zBrlbZmEqMop&)y}TIpU|D{T)abSHoPO320u*K`vnyiC7E6vca9xFhh77m?8?>nL3s zX>=ZDWV%gGfWDlTm5#m)SVsMsyV0)fG;- z5o=3hH8W7%&llj@t>0$wBd*dFPWTAdsvLg0e%Uyot3!z_9pZ$)MP#ZSehmn7>*wlF zc7_xF3;b@^jRX(YkH4*of(Un8H+2+$-Ax_Ezam|CaKcnKal&$pmqT@BLD`1(oEyGB za6+t@I?ng7tiE4$6b1H&GC6k;C&Uqr#xX8sd~!S!CzLP2kwQb!NTkYSx|A2BaQb0% z6UU(30~jGz@-ZK>9}egy%6>SYn<)EXva&;ZlA>oSTCM2*#t5~YQlXp3uTs2hi1C$> zV*Gwm(IQN+J;MID1)&GJi4%@GYEnwLuFnm8O1{@Jus@y~NX(BoU-nsno$4A|2rtq= zn#S@3s@AI`U@I5EmIA2=Y{ew1<~_g(P)xp3nT}uk+W9}jl}4(T;2Ou`oemPq3Ar=? z%bbe*CwzV^yg~;45G2Tnq6*OPr!wjWhUJD6Kw`NecU<_ra=y*LWux)m>w65joqyx~ zb3y1>761I)Q%Fihf^w+I+y`&$v-tBK#V_!_$^U(`G$gi)e)yFkZ-E$0*_+4BCh)X> zs#>MNDlcm9uG3JC(~j-O9&lk+it9J>Ha(21tML4_1Spd*5{ZvcCt*o%(h5Jy;KZDP1{G%`f|V@EoUp zoqZ2Bf*)<-YR60dwkoQ_X^nV__Be6h#xk|w)*m;?aiMri*?`cTBrn54 z(Q-GQy=q;EFFuYPI*vJh|MeF>`Nw{9$0Gga9g5FC`ED>cfu|O`#d9+RiOHMafP5Z# zemMOB`6&xcv;1g5wgv>k?Qa<< zh1&$G0Zd>d_HNC^WmsIqxMDB&DbR4F^hFr4@QsqbSnhPDJXHGfb1!AwVbYh#y^_As z(pQ)}%ZG1_^bO2?mT`wm-;i9s(?Ye$D&@uIAgTWn!u)(AX0ucL^Lx)GkqOFsv*Y|2 z1#y3F9;)v5xf<8d3xxnqlLPV3!i&vM2=hdbe5?fUy%Q0&Nn1JJR46<)OZzj+L~Puj znQoAX>z=Z_i@CCsA;?efo4(#(haowL-N`-_27Ng|#4Ohd=a~;#tWq%)Zl#cIuorn3D?iOAs zr{kuEMIE<}xONTu15qux;Uej@|;P(OGHsd&6M;M`*U%M^f0&u`A=fwAKm~E1=B*3-QnLuql;SmrvwB zkI_K^(b4#iIK$^`#-E?t>nsok=JEpha!v$^as#pYb1~;el{aF9Hy^*i`!xUejeNX- z(kMkmaYMucv**dK#{XzK<1-i6CNf=QoC-f)IP}>bP9~TpT+ohVdyg2kn^^H(n|osdo+Id1mE<4fySE-1ymxur|0 z#*Hr-KdE+Qjq;WvXaQD^(c|*J0#ilJtGb)!Tq&_da#);<_zESw`T0Fg=lkn4W5H8I% zhlne4Bp_H(w&Ht+14+wR*)pXoMQ@@LFP2TJux*Nc6i@X&7jN|W0MMWU~N^k?+zGfP_>+nNVt?=NFN4*Wv z9#EZ*PXMBfTMJKnGCtGmK4Idw*trN~e##^4XZAVU>hgOFD>X$3(@vMG{hGSrUCV54 zO<0~ga_P^}Yy}O?(;$OGj9~V?b=myfJ4Sw)srOvtqNSv`ImanKSL_(i?;O$#Ni}~If=#jN zXdEfObSb+WIi=gU{!Q{08QDeK9QJqM?9p^%vxl`(V*L3jo<-W&`eAT>%;_C1h4#wS zSk09Rw3yPQ`fP74CwT&wNB>}Ci=nB%JJuk?KNx>{HT369k{hld$qDC!U{O>Bej7eN z7DXYYPb9)WZe;jp5gfioUvBsyNGvyJI|Dh+{G?w5LdQb=^Ls5^?)eD{xPEyrY+;Az zRC?z1f|7{5oa5z+_!uL+-VvF3m*5w8mHgi~5*79r;{~5FPLx=sEVdQ;i^i2M5=(p# zu{*@-*(_l7<$Ytwrsd3iuWCLOC7Bx!L7MCaf3vah}rrve)504Sp%a zYp3}&Ai(7p13z6qEenzV&G<1-8b7+vf?qGq1b$xfw^dOP;jRqZm+8KZSVYyTWZn

Q>dP6leU^u3WJIStz4({jFOv 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 z%0D}GII883;Y-UubND6ta(3!d3_tv544*yxGy3wJ;ZV6S!BsHgdc;7m_va0-T2rGv zXAQ425p!{EB0fF*QqLbJ$~vQ{Zi(lYkpJ*Y!BSlL7oZQ>Q1mAvM*I=-v_F>>c~sb@ z-HA3+L`1`ANzlJn=&+nStfCs%?5|#DY>MV=ii$slPDU(vgg0#Vi*p?Bt$y)3u<`FD z^YDg7znB(}rPrT3Y~@9$?Y(b_xNUywUFK|(jCOg$t0oxVPWX;Az9#sPQKfv#8(zI+ zk@EUy4@XNyjDJq*6t+ft7CYQu^HQj;VeyKW`UeKX|6}i4z^o|Fw7XBAVGhg)qc9N_ zH(^~ml%DmHz06>jDg4u3@+-_<#izUp*z(#){>lk$sELI5 zxL(#jxUtup&}~CvH_lC773SbCPp%JhN5{bhcu7nf+?bwFj|^0pJfWcz7gwd^gbEl3 zmdn2;xrE94Sh(1Y<0hcL{8akd@(Jj&ub3`7c0w&GDuTZvxt1-b!i2WgjxgGo32n`2 zVNFyp0sY)WTQdPndH-k9F;?CjUv+bQ0_0a^&F4oZcB8H2xOgou!8;p5+Iz zO_-PzU&6TtF5!Ep$=w&aaHzfVOO~H3ymHw@;cgw zMc*mGg{3s?dqF8I3YU~EOk?5K8R^uFDaWQ~1;wRzl^qKqb>`Gm#pT=qG{|2RY%HCY z4lY9c(z4XTR9WJ~XQqO$Ue=hJo@#2oYwt+u^AjJ&4x)|0^hLpv(jZlOCKInH4W^dP zn!RM=!I!8Vmz&EaqzWxY4GoV*Z9J1(}R-I9f^}3O*5oqdTjb=oGx)r za|tXGr+<_xS)5JB znENAIZ(fLI#$KxdEIl7t8niD;rFSG=t8F&f2j98$ktL`|u&EJ$y?)|po}(g_hW+QJ z>E}-^nL52BolY;FQJ*d;NiCedEmd+R%9AQwdoz7#IZV7&SY2tw&l{7VPeQaUL8J|g|6DK83Y6|W|=odfwM(_)7%eG&mnrHs= z)ZkD4mb>o2RVzV@1iwQ!{QjknBtD7a;hMqp^`hV_{tqj7`jXTYOJ@cbFDeU?uw>oX z6nq7BOa-G$Pd`6+hB#FaSq21k88M@cz7O(M|Kq{ zouHf3k+p6@<^C2w`wfahOKVG88tahc@lmzDp&bj98rzNOUc0!ep{=2-siD2@q666c zHd^YJwHPXUL05NYLtRx}O?SgUd*fEM);7v=t=5J{*o19r#kL%00gsY)GX)O54Qmn3y4ej++$8$#*T|>u|%^lbi2J5pLv)1-i)pc~NYiW>t z7%t2IWC^M<2W{4PwRBh2ZK}ZvFs@`Xi_owgl3n#?7x8s8Hg@CfTHjFDx!#jvz=yTs zS~oP1T{wnn!e*Y8bj_Jry4J`GRMVO z{0>_5Uf-6v=P+LOW$@lu*IbKLZLJ-+95lvEi+y`$|<$4Q-ur1;Q13C*ywRp9hUO7 z$wEFcDJTW6x~QS1%UcIq%nc0YdOWlpFP$v(GiJ24$zemVg{%J}^XlyPW!^@#8(IxJ z2AFbqy5co52Ocd@tnKLP>Og5KmY%w}YT0S0u2^>V!j-30E$8*EsrOnq4y>!`>bfYr z|LPlB(KKN*m@X&n6m3*(7G2iYAXQbjEDWqVePP9ElnnAF)WwEvwN5XH)+}Z(K6FB2>WwysTz5iznHZV)DGIv9qJw?pkd-F*;a# zhuModTuF(|OS!0#*8s~R8*94PS2fnOv|^g z1lU2Z$1)mg1V3Z(vaN6(u5nWb8+=3ihVF)XSq++HeZ3K9$6c`=rAFp*v)0zK!&SA; zo>?On?hkAzhAg@3gs|svC!u?*m3(xex^=u2+vReaqM1f%>8@uLWtHgqmbM0CU_W!A zE7zG~Gjnb-ZyJ()<8O0o?+!j1O0m$htaPSV+SSlnTHjE+0qxXP)7Id6bZ)3^hgY}j zSA&koIvQSXlUs!eVmb#W4ZP zmAzhcB?c;AjRp*1nU)}~o8P8WOnTcYP@=_URvRzm& zww;?_^>O$hXfr{Wa|kJNuK&BSu9Vl5j^pSUO2umtIkz;d&j_sT#5zOU=`{X}j?C}} z!|P@8+vCU#--!{paVC5WJE%Bc^54XZp)$*Jiz74rbE+ZEZpA=)x=G3ZKzgbxXVxz8 z!i*(SAZK^ukCy&veRy4qtN^5ZY?gd{mV8>4yevzu%92~NWSJzXAJ4ZvEBupL@;zBH zKls@>(jmBBk7kAUX35{mlAq6#U(S+W%aVVUCI2Z)&T+aF>vK?+%r&vrF`QZ;>nI0b#_2dEC#u=EoHaWVFxhlSr4J%f>3Ok&OwwhwOwyUR4R0DzzE-lU~C-;(_1c% z1Y{@nGc*;%CX8TgI&M@S3Jk+oODCUI_0w^Jc^pY2iaWi`9t6(Q$w&(mbarfAN^K2ob)5)rZb{3K&hskJhT||HWA|9Mvqs#E^>VLcX-%Fh6dA-C*xJQYI_aYJbkHs@$ zT#d|0MEKuJM0p=lxtECgzDYzoB=DeQ`O6i#*oEo#5RbyM z01teYlWR_i^A*<<5$^^f+JQECdHx59Xs?HfIPX(L#QQN3=Np4M^89Hc%1N8NOkaR! zCF^?waNIP=`M?r-ijUIVxn3ip-*T)OL*K<^f^|Q%H!)_$gv7CwF@{A^1yM9XWF>f_;ylHLisvde zD{fP~M)5Yqdlmml@kzz+D88WBr}(;J!Z+s^TLvg!vC3-{YZb+o0m3g;S!@|VzD?zO z6~&eT{GU=;Y#BhNGMx1nTLwU}WdO`W+t6QZ834tW0g&o{`invySf}y@ie#HG{PT)p z%K)<2G64QW{qynslKd6LmI1=WmH|*~836g5WIVBD0OWI$@26k7&Bv1I@hTLwU} zWdPi&>BW`-ct8-%upW zm**eJ_X}{m;(3Z~ivOtinBt!lr{TfHbXO=|M?`sUQu$LV->LFvRlZ;4FRA=BmH$QM zXB7WK{ePhH3o7qYIlz00=bxzfQ9dtlemq{i82;q>33;x{gJpjALXEHd|UiIx*Yj$1V zH1NdJkg;a>m0{pnTb_SD`0E7-C%=8{bJxApS*|t^aDopw)d#?-9*E{VE|WPuK9lvl zx6Szu-l*m}qbp)yBFCQhBS?M;LSkRVUqoyE4Z`Dw*35SyXwByWKx;l5Zwi>6pNMcn zYlhAFnGga)YyKp18NlYeo&gq;amvJquOU$aHs|kQ;*i$7jM5~Q4m3GWtjHRh^YP)# z+0vRv@_i#V=VN5xsm=Ls;gB}x<*n$_nqwiY`8#~kg|y}>W}{Mm-drba=r-qRi=Q^< z<&_`Onx~<)Vj-=$2xX6jwB{!1M*_WGEKo>mzMtpFrZtm}9*bzrUqhV!ZO%_N9f`E&*nLJw|Ux^xf zv^h@#F>KD8x_gD4Yzb>sK3;eTL#>!7EajE3Vt(OlMviFBFS0QroAVnPIifXhWaNm} zj2Am@F+J~`!n+wcvN=DFkt3V)>litrHLqc4L~EYUYZB3#|Cf;?TJs)OA)+Y;d|Sh=hA|hLu-Bj(ZuGwJOCnEb1vgWv}T&D z+?UPyKckhz=KOEjToJALlS~)Unr~*I2DUjLli84CbABRoi)hUIOKYah zdETqm=KNw7@*SczA8{52IsR7E66WQP!%68llz@48utD<}JZ$;R@fA16$M2wb9^2ku zHvV5xC>72g{~!|jd8?V#S>w5CK!vsAgovAWo`m4FfJBM7OQbxqn=KR?sGm;BJCy(L zTUMle@0N+lTe47}Dk)u@*bqyQmbDiL3!fQ7$E!JiWWj=wldt!$h+Q6R!^Jubez;6< z-MBPluvW=8ZSi7a6R7N^Z?7r zF!T_IITF%}s+3101fQB#!zzdf362qZU|$wck!0{h zXuqAhkTLk-RTc6?IESiE)8NqCgzu@d9S?iB1YvG|v>VU#%#UdE ztHrTRgG28@d>>`qth4QW9z5Lq-b8-3o$)C+%&!~AZhkO!BswUYpAGBC$}f&_fGr=A zg!x^Wl^@r*B;jYB&2K9_-15<`y)7S9i(!72e`M=89@E6fZ6y(p`SEv`B0$`KLEksW z3P5|_`*Dmu)oFu9<6AA%e4(@PkUZ>D3@k&uN5WW9evEI1Lnd%7h(c+2lJ~^=u&6}V z)%Il^de@@Al<+{EJ+GB5y8iD5Ux?Q-a)!TC8G5*-VSU(>BKLOKp+_@|?c?0+6yhUbf^A@-HG5hBG)q^m6>h;o`DRF`P{F1JHf3-UI4o(dR@j3!KDwz_g<1 zWg*W~d7+}{W#Qkf@;1e56mL_!SMi?|pH!47H`2eLa-ZVsilUcAxaehp^4S6?dRd_8 zWq}{qm^at!0~_8lSp`u8WeVEITtf zJ)NF)!Hkl!Dc&g@rU~H1h=Z;(XuN5fA3z-Qv*)6RJ*MKr9@Bpo{~Tw-PKTd8 zW-#ON-D8~%TLuq%%rMIRjdwl*e|NldHDveukIf@{yz@E4<41PuY&;@vhtP4`;2uaA z*2-vLpz+QvCH#dYIeL0@Kd6%F3#>=JYp3#2#8)Llmcl*$$uj2S+KmDsdzkL2nVrkP`J{s18zug3j zb-0Qn&H$pV@H|{jYkn`#lCX&jOL9p2C&WdKUX5X=2V;#77DB7P@p1`vH9*<>rlx!D z_Ig{tjJOZscTXKGvjecVO0=ik4@aNlljJ;sMxtc z;`Bgn_j1`+yW>6F z86XNjB`Z8B3kW{dXDxUK1t=fNHV)Ps$?(`b{5lxB{L9bB;o5k~TcLcY#PzCu34Qih zKm8o8$5StlOBzdqF@&M~C*;ENG48nga|>!vZ(M_dvrzY^UWSFo!)YPWOFz{&0%a{m z{q61!o)?t?mNR$%1np3L!w%H@Q?N{bLtjz)O7xXww2u0M2TT6T%Wv*`0&$9au6$`Z ztbxJ;U}%ZaD@QwdJwB{ejxcez_Eq+5?c0-K70_CN-t({Q<$JaDX5@i(j#Z}1a__V;}FC3?V)L4S%@8-@(qj_nqgYn0V)urP1i zZJ4)0+HF{6gK4+Q6??Ut?`5{z0^3HgJ{yDeN4I^RM}7SVw@CZYiZ-uf4zFLiX`k2J z_IWUBAGSqMjk;I%?3#xD=k@gL+M)f%_A}_^85^I zbka@8O4ovG#eQbfuy6Aj#p@=|DD-jrjN)~Rcbe-}jQ$)wpO)?NdV6-^jfKAS9O`?v zJZtc7gMLC{~^A3ll-Qk;ie6(4B_;EZJ@jSzM3mAWuSfBP`jry*WNAJYL zZ$#QdILhEBKZbHd;h#ac?>+r8Ez`2Bzmfa#MSZqDje9vNJJQLsmDXXwx)AHA%nSFm zsfW~&Rz9CL&sCJkOFu2vIHx)Hwcm@j=%qz=SW9)T1$P1R#$NZcb^q@#KmQfl$qnQE zbqo9wh@X#myw=#Y=T+XPj@w*v>bRf3H2d(Ajo+S=_nczhOAB`Xr0=xeB`^8aJ-f=w z@93+j#O^StLq2v0ISSAJ3S5ls_%-9V`mgYF&tFh}-7AU8>-wgk9mufbJ7Lc$mQ9Ce zetA#em7~Az#EuDw7e_y3dtg@zS}QjF8SjSdKAnU9;&1L5&3-M~zSk8WqK8R)kuHBu(J`T&Ze)@@*`Hu9{d(a=w-i@7*4rh3N63;&NiAwg#dD8Fw z$|qh9dhy&u7~jvu>FbbYwf1Xs4`FBl5^d!!)2E+6x8kk{J>U1S%LDuO1F1vsZhhiq z>CffJdnc}E@>=A7UfAEIKbJr8GR7dgev9(3PxBs)$ynhD^yfW&Ovmyfo%Cm>5Bso$ zoriKi;q>7r`fg`mL%Z;Lu+46jz6Yz`2m1xX4#EFXBS+^2_#PN5hSkx$ypu4@3~-n* zhw%@r#d?PuTeL7P=30b3*gwQC#}yqKt8oBpv3a-vhhRWHaUjm5Ycn>-HA7pZ>`7Se z<)pbdG73xaD78DQp+_t8QpIEP{1q5SO&;%;jW*|>lH-+Of_p51>8H-rgK2J+ljs{I znw8k@E!9GZkkTTEkk$f-P!<*LRQq=hS`c0P%dliDc@5&EZgK8^e>nKP015E57^Uo4qgY3S6>|3x08 zc77Y}6AP)GQ&HN8+W7~Dh1AaJcq~TL&K)R!MD3*Qu87+CYnC>oc2-jgsh$7JGh|Xb z`2kg^o#<;`MD6@C(?u3*&tk%e+Ia@sU=V8Oy(pDXJEdhqYUdryIHY#|BQpxAo$@hv zzo?z(BR5hzf6c;&)Xw{uYc{p>|9Ikv+PMkheo#BhnPo`ryqC=}0JZZT7A2&1%6I99 zo~2*WxV&HTN`=(Ujg&%a=j$wANbTf}7klKhJWtWIk=QBRi~S2}Rlacxk7nK>wR0V%?>-@C0JU=^3pzNp zlPe+LThvaj)f8&y!K`{j?feYuZpoYR!Y?w^iitv@@mevzkj5VzYA4sjJJilgm^Pwz zeuj}FYUhJ&$cWncI71_9=W2#V)XwEBRYdKSg-;Q+la@gpYG*FRh}uaroDQ|Kk)aW_ zlXoV_@|yuc(bKWQHLQa}?ffPy;ZQq^n43fG3@GnS?Yw~1aj2anPYbnE9sm)wa~e+{ zQ9CP{Y#$bDsRb2kr;s8eYNxDli>RGKeccDO^LU=sp>_(%F`{|dcC>>O(6R)#y&PE2ewsGXNk-WRp=Iz-qXYUiyia769=Z=U}^sGYo5Ew%H1 zSm}3&+8Jv^31Or5Nt7EFYjbcaNV`yLf7lV<#W%jgalQOcArfY9_y^-t%(31y8ShKK zavUxD_&1Rg>aQ4o9wXdDqM#aQ9X|uv`ZvkL`Nlcp>zM6LA7hly4^VSNXJ?xchq#8BrB5tb+Sz>iuI z6Xkm*3I?!^7&ZFqdH$aZkCiogo<%&@l)X>N4jL;=h>n*W`y}nE@p9%qNxyo$l-39z z8UJyn?~?*9Kk`3Wz}G}r!-Bsqhn1#Azo38`9oftx|59>3OD%>@;${>+hPIwxirHsbLu)o5a^c;(~h{aiHipQee%06)J(b6H7`qCrTn8GeK zg*7c{3X2G=_Nt?$%PcjgU0o!7VyQ2k;v+{(r!X;t8(;KHaaWnR=NyCdUa{2mLdh(4 zV{x%mcB6_(Q;SWu7Odb!CiPnA>>tIb9v29IUpJLt1vsj=m3Y)tqOxcrBRy(Tt~6D8 z)Kp2W4$ovKLUhJkUL@VzNWqOyd8Sg2no6B#Dy4B(OlBeYErjQt@-&2Fzt3WwHRZo~ zjE#mo|GX)0^7t=2UVZF{gBW}aHI7qh6&AIgO0%)C8Q#R#y&F(*81l zO-b9YX0kLI`W)t(@_AA@OiPcFL$7Qm+C5@$FF@ap8P3A{m%(inMQ?$?eXH+Rrh`q1 z7@%(_f(v9M+$a0gM&&_)22_IeQe2$bj3EBRZVXzS)8gkV|uW# zG5Dr;=OS3^EbWCE+K1D>4~8d_G&@?dc>5h^E=~n4jX~#~!SF|diy9xBR+cIWroJK3 zuc$!$#NP!Q7s0Blja<_h48Jpsd358JvQL*yT|E8r$8gT6uqYcGl6c@huSgVKR)$2k zr<$(%SgJmiDtj!|wDec0&1u*?U6{IS-5sgvOM*u(+Y%Hc=H4C5O{`y(DrpKv#wz@l zVAGbx!F3;fV8ItG!qQ8P+P{uqe7|0dTgaD6E<*Irf z(Xr+xHEu+8_L~L88{j<-XIYLPOJNRwtxD>Jw@Vt7pS<4|QH8Hgvyb~QgW6pKOZd^M12j%H6aGNWpl)obU*9~K z6;w3~Yq2hnB6&?dvJO!ECt~yckru#5zI*>Kfx3n}NdIf}Q1&r-exqHoO z4`&^VLzn-nSwMZ8EuYdBdrP;NoIM~Dr}p_*^%hN?Mn+EGf`QWR^)+3xg2^?tOf#jO zT{NHDpx78bssGmPmcFG01@C~_QW$8G0la;Ak?Hh%3}CIZhh%}_0#gBOp7LROT=5HPIBKslU-s$(n7Eeo%#Zol{AzJ*(=diDfhAOO^bv7(}b-}Yv`8dwA<+~EcHVyMQ5BVi|pw5PE zh3sC^=aF9l{8+yJRu^b;?^5JfZUvyt?;btob*6h9@#f-sSjTw${iCAw|Kr5|S$Pj5 z0{T>^jW>PL&{iQ-BHq(B5zv;87<2p|JlgX%!-HRGc~7wYSbw&O?aMgy(o-F$Z0AP|w=YtBm9VeaVq^JJ zZEJ#XEQT+w8BSQ<+}lWJIEH|EdRqI(h7eWGu-s0oT=Sid;ZWKUrR8)pWHaVFTRWP{ zuvdi4yyl|JwD`9g#iixOdx)UwK1DndJU1f3`DJ)q5|-Y8v5ELZgLa@lw*aI+`yu_~ zxJ{UTF0lyLgIJ7yNW}fjmD!Ygh=}(h5&3kYAM*UYz!=W)l;YEh&niBr_`Kqe6<<`` zsra(uD~e)~4f*a-`Ax;&E7I~N&r9+wF|L?U%vUT>9HTf^ahzgOu~>1k;xxsy;!MRk zigOjq73V81P}~fp1`S5a2}!2d~=W#td#7gX+3d|fete#Lx5!wM``Syui)mX$w1S@{FJRKu@T zyiM_5#jh!{-!fmZ$OsgRj6ku-2o#Hqz&u=I#uM{Qz>`!Ki;R%PA|tR){Y75|`EHdz zuP7E7;V%{$fntLMC>9xkhx5Jwih&fMSY!l>MMhw?hKof;$d{-r78xNwsj{s6fh-mo zfnt#nC>9xkhvGisc|=vUDP%JV6=V`cDWQ1I; zvRGt9xkVv!Lj_bE^;G6KaSBTy_d z0_%An0>vUDaI4BA4ep5Yj{^L*nJk5xQDaSaja z&QrXei1YMn`2Q%rs`wj4?B_1|en?R)LgGBLRIX4g;`0pokKuC@e~2P7IQ$~dQF*P( z)hf&L8u7QQ{D6i(sIt5_@Mn?ZA)cq9kt2n0dB~tEzvdh_Yql&88N$l12RIGuZjED=cJ|qF&cmcV?;BJ!t8(02m0{qqjwHC>BB(ch#U5x9OgD+Zb_?Gdcu{7yb z8_p`zSPPTyWZrvFo}ja5*BF#1hO#s#%~}c{WkfxM3rfy;Zg0=7k^-zvDR_2FMZu0f zzxs5n*}bvPTE~o|zD?lfdcF9e4z#36i<#t-N_wy7V2qf8G35F>mNTUp^)HRG#90oU zn{C6iwq4>#mqt4Hy^4JL=cOtcHE_wO@rbXQqyC^bqSGAe`=j&nPRKhEcT4U;Ahq(4 zAqgKLJQzOFTR1v};1Q#pxajpZ?i}3E`J+S|a1f)A7;7>diAV{PAtQ}qBxYHl(Q-_* zgA2W5a5EiZn4^p^ItS;(t#Y&gl#OyOl$hCk$TGz;q6f-N^*n6KVGF2~&7Y&3xCi0lxb2OChd2vA{}zPAXyzrJ6C8$7K|FUNyyG(v zGoBOQiDPgzA3*@PnrAYEL!WqVXpOTP>4W4c2+4f|Ap=l0HC4O}899{ACm;snCn9mI z$jf_%(xl}g#l4`3qEI%2+cCTdj+%^+{CGeuv$4h*PvGQA+3dy1N!dJzp_!CTlYcyq z+eF8v8Yz+YWhAgte%>la8aicjCsL8J`6HHjy2;tg`+q#o3?s$!hB4=vMoQ%UJBv5V zNcnlMu<>UbsUS~mJRWDHF?qslnq#D~c}tn+@kSb#$34(vCm1Q|6-+@kwBII_&BIxi z`SfC&LU1XYNhXXan@f>sFv{kykdsh0rDa3P=Cv%)DpQ1b-WQlrNZAxya{EQuJO{an zHBROeQa1mAQj?wooRF(gnP3-B+%W@(2hs3l7sUQ4o0`s8<1|7dZvnFmDVv-|4n*1f z2e#Z7OuDgo^1=)$n^Reakg~azZ5>iJzssZb3lue<04nW!b z4bS(CNmr3~G0*pHBUR>2V97$trcg^m%4YmDCREBM6FAm5DWbhec!=*ov`oro6uBM| zMr-8raXf}8M#UH5|B#R4&;NH6z~n1O8g&E1Stmct3aS1c9*IZs$ICo?EB<0$;@?~u z59`SoS$qX063XV!ScBvEeSm$v@DjugIhygpc2`UkKI}W8`Gr?9?Ma%ppzv7c5n1D0 z$h4@Ggc9NZG96c^7Hq`Gqo4iYS{Sm^QM;$>%gEo2EvU zgxzgI(O? zYa^`0S534|JbuKlndw@V;ER$eGu#$tdf#4!zE5)2Lf_{W+6ZgCBTm7X&!572JSX%xON$E2d5#mjbG(Q)$)5CCinD2>UoG zaQ@mO$Dp$Q*F{+69kG*Hl7sGlMzUmfWFDC;?{o`zr{uQW) z!tlsEZZ<+?NTb(-BkDao-j6(J^mrSIj)Qjq4;m!{7Q~OGsVt1O)SF?mHe>s1(;rRW9egY7x5n8r-|y;lFKF`7`rS|4VV7mo%GQ%* zJrJQRiwQQ=U9h9=x2=uROiRiG?}9zh&ezI`tJ1Bn2P1x|0bRpi3+=U%vc?^*)$r>+ zI9}!{bKsj<_p^UBX^lL0Xh2$f_JQv}E!E*Z)AA$~JGN%a@dLJ?MYW+?(88Cs3=3Kb ze_uAVxJ&dPcC@06q>U}DNH+GgBKfbk(R9B%O;aan9bQi2ppwnt>a4|^XEprB;K%5E z{V?uPDr1Nx?p`M^dRTEPjv0TjcxfjM4n5|_If`}ma2`DDF~d$l#(cY4XT!*A;!w@H zhxi7?S5el3x&m8|Y|d61grsFQ6U4KJw_r z4?j1*$Bl*J{I0~YO~Wj1Mt(^i zsIy^PA-m-(Mt+DYmnFzU;X?$5s|H!#Nf;E<6zNo!~yP?dT@sN3Iat)jEdp!D}7mDflt& zO#B!>1zf9sl<99BnAldx>bw9}~wS9g51nTMmq&Z!V{d^v%HW;FVdAlsEF{23tI zm+}%t;m<&3yV0N5f_RPMZHg=}{e?dRd{SlM&p>`bSHppHuu2 z5$E};;VGIgS?)<0ljkCnEe9#hHp{C@v!+{z}C*^}kZ_HpS0s_rOL}SyjA5+mHCZ_>2FZ^0hJ$AS)Q}_vsj@1 z4eb}Ubak|cgp)z-k@C z!uFPy%W!f&J;c&1nu@1Ht45CR0P%>G;b;zi0S^$3U%KMCIdP7<<9sFfiD7*6`pJp- z&yn)yvdMk3qTTr9#F>XzhhNN-7tPzc4B4~SM7~+Vv>;DI$FVZU2^vl>@2!2T(2HM} zxnR%c&mEUq@O1_90j$cDsr~^^d^w*xVAIhubFEq5zxn8BTD!Li=_ssoLv4Fa8>~l{ z);H8{Xu`LGu6NbKboM-z&jGypLT8WJPw@x~-P5?i@u>Ai;m2OXc$B9qnp@J`1vU=^ zg?XoO?A|==>8lw*oei4@*&Z{9&mHzp>ugx|e3tz2YD8lB_$;#JTY_Vo28Z5X@S~d6 zIvd9Mr#)sE4UqIV&su{pw_V8lw(UZHd){^&Ge6dwZX1Lh=1~3_#@|JX;)%Z^G_E`a z)Pr&8w%~_0?i2xkA3?lvRsh;~7&pl00W}k8^hESLC-D=C?}a zdLk~CrpTZ%D zgug)40f>apB8sIBCi2$ep0HAW-kVIOB*UQ-2@gSzBoZFY)FF{@J{m0|5~dgy5(y7w z8A2lAM3x~W5(+;lBodOp5SufRl`R^Z=QCzVBow2FnMA@XaT*~KZe_ZVNVu5kBHNEL zk&lRkOIVsgY(M592O$zl%Z5b4Im|dD67t0t5eZqA*nSZSSD>0C5^^z}LnP!mvWbNM z#ZyH@!Y?4seh>+7W0oP2@SDtQ0NanV*zzHfP|W>>L_+zl5fTYM%a|dNP^e5Hk??U= z=m3a>cd?uykub(`4nQP4mNB21DE*`&kFWZONcb$%g+#(TC`CjVM8cPtJR%Za!^|ThA;*`AT@#~(6sL?oof(;*T*&x;<}ek6m|Arf-Jna9q{6p}o#CypfGv zE$hKzvW%6c)(w#MGKm#tiH(S7&It)T+?=dqT~%vMH%{_)?cm+iupZl-HIN*Ga#=FW zTieDvg9g>!un`0oUe~I&4Px5>Cu!-fMEE+^bz279 z0e_q3_n!kIWxWpwS^O@~w>`gQ(eb;q`zEmO2foZ14{v^Pa}_NxjP4lxn0~N$(-6m| z!J+UF&UZZQA;+8cnDIUbfp0nMY}g6#aJ;=AgTqjO!gI{Yub8X{%e4eQn+As-^>))8 z4|})>VQzk}9B$GxKYV%)^UMBzJq9o5G{UX3?Y9OVZhm`^UlM-IkN&oN{N`@UfJ1LS z^5b_&>ulIMc)0l$;6k!~%#WXUY<^pDY}4S-yAb&$d7#dQaUG4D-&o|w@6gQeApC58 zH{qCRY#l#={Jv@{sbLJiLyrOC7UKhXf8W__B4ky_A zdwXuy7jpOPjPG7C%DnQC3*^eVGFu>WfwY7xTaB)1C-Ra&>5)>hq=u&y4s}6Pa>kii zV@y6z2L1Mqz9Zk>fm0YC$mb97M8$cEyl?4$u41#|HpOccZ&SQiQFuT|_oT|-QG7wM zPf>V4h{q4OJdf~zfW;~c4+ygGfPlgS0tycZC_Esb@PL5#YC7QoL4HbQ`FsdjctAkm z0Re>v1QZ?+Pv1QZ?+Po7HAE6bio$-GImY5g?m#=dC89mlNYoh~Y0HGSGlkchO{u({ zUO6`JUH|_$Z?8*c*m!=y054^DxQn`DY^dXMoZ0_b}2^UqCOOBf{)Rwuq9 z!qJR9`EcAzp8p|M%U?PCM#7;YtQmeeg|Q;6@N(je zpA%;c>_&_7dVj*v+q7u2rmN}V1Dr!*)lln(`i6m0x3pu5+S;0`ZD~)HmZn-;YEw;h zb*Y-Jwvu)jX)kH0sclKghVm(!Q*__Tr!n~wP};IC&L5e)-oH9_Rj@sNWzH4DF3;VT z5L>5`zgL3Bz8$gb(?k-E!@miRi_E{?@CYTvS~*P1Ngt|eZD>D$FDC=6LX5n56YxV< zLw!;{oP^~IKk9TftcO8(DY%CNDM(#MdtJ?XiumxA@m)dEv#gRnBZ$@L&jfoINeU2| zAwMue8arXi)&d_ROs%@QI=ax3@BT!cJg~q0$@&CzN_1dvn08LSuX^>EV7o7-ZW%L! zhcPW!0KYN#F+JlY@S}=_vYnOi$?7_W(M`pV@dt~?IiXF1Ly!6Kxo({en+Fej%rK6n zd1qQ@4>|Y8P$6>phAYK-unlZI$j`B982Jv|%~U&BXAe1taP!-P{8%sMN3{9X;@GCa zp-0xkOdhDS?aaBqo8Rw|AIB@q53j{AKY80g4jnS!wY1Kjs{Y^ENBqK*Y_*H$2xYJ)|V5%KElUOGtUI@}+f^DLR$U=D?{kBED)Yl&mri6gk* zIQJL-uy^)ohIwg*oxS^)vOjtc&Jo#o^u6+zv0+f|<2KFE?Q`;B9ouvM$T15zg|Vhx#=}oC_g=>ln@S$1QW6Mw z(BWqypgXH$M%G0md7Z~Fy$7Xf754!&vjJ!3kvS&`rypl5S&=+7DRaBzWQ?X8YPuVy zBqyKRQQvSj^uBcsT^A)!S$1Y}dOAJpf*B=cQ=<8Z4E>{Q!+8ehJQ;#ij4y?^I_0pJ zsUHI)QW#dg|H+Ztwr8Ar>IuoosQ8rqs`n|pVh5y6e1A+*Py8IST&_))eaubnt{9mD82Zejev;-wMCroo}N6Tgdjpw5QPgKUo(L>&O{ zLhEeUN$_yT**&PobMWK)cNl)Q9?NiS)8J6P>GLUXoej&Lr*Ir=+l6TJtHrTR!#vWc zIO}GeZD)>4-12Qgeth?{e0;py{IcgM)yQum!mYFC%ATiecgn}-o6RqKp7Jr|m$aDy zZGKyE?3V8ar+oXGr`(17BAWvyKjwLtlQ#}U*TAu(b@se`S0Rf|>wj?0(B>&A#2d;y zg=<}@dmL<@!rdIF*g^np`5Z4fbp79rc?#P;a_-sLZtOXc+k5R!X6pWQjZtdmcZk@* zpdX(VoTs?&M)p_d)#uDC%&U-F|AFt+4klC=qt3*Sa|hmk`!n|Eb>LV!t$3Uw?{WH{ zrdXkPwqms+PtJH3DQ;Hey+Hq)74IbCz5N-*`_%tyieFcJPVv7LpCBR~@7*Df?LkW$ zs@`P!@nu6E+jH$2T*la*Hsv|Cr%ic|p*gnaxE_~cpW}LDH6ku!_wV<87-M@p=g`6I z7~hQP_vo13wMXx#w}QEg`9u1;K8)kvL*w<$(m0;C6zD&Ozy8PTpF;?S<_aHU}D&{2v#l!H;F!G^}iuByOTy}L105{vi8!*!oWn^AQbScF~2 zXfI)oXK-u6WsKEP3i0f3q`p}~%-`EHQkNktPx&`BWH(o8{|D?Js1lZ)Sz5DxeOF8E zhV@|g4%ziLM&InDwqwWaG5T6OmF-v*kA!fncNC5(V>~79Aw>%eqnnB!(+?Jp?_Zk+ zhw^D)C}VVf_aDj_y&m=8yOr-zjuGsbHG7PH1a9b;5pJC=Q}!5rrZWcK*BG4@XWgu` z?VLSEpX-c)InuJ_%O0b1%+G6Soh@JX7`?(NABG`ee%WJmZnu!MnE`EnTX8(x@n7zg zZ(n2d4&*n}W}^8~yi1R5mUp9qLm8w07vddh6FGVCBNR>*x<4S^P{!!AS2L6`I_<@< zk6Y(d$$AO8{_n;Zo!2sQ?%CNM>^YHpJI3gvG`r2f{&WdujBXz1_S-+-M%m+Y-UIK) z@%g`^Ui&>hZ)@mkY8cwL_ZhQh&m8KvckYP@moYxyv()Tsw)Fbfi-F|mR{9T91n0)2#LqYF?C5+vW4<{FjaX!rbmdc&@)xCw} zEy0o;zUzN7+%rrpY%IdaKGB~>%MN{^bT;OPQ|Ti#)@&dY4i2gw6Pgxt1Pk(MJ`w+&@jQ{aTaMH!2$>wI;SA1=FJwl!@peEaN9qKo z7{|XteQUtDr`FrhSPNF*y3m!wju^y5Ln zq8EbBEtJwT%7XSE;xokFdWd2)p>@2}^G6oXA36DY|C-p+Io4@Nnz#7zdUJ9Bh8X73s&@OiU8VI(vTf*g>XV%x_=wBkm96 z&I4>aXU~tGLVg9vi}~$qenh(y6QxAv&lWX%e)POkK31LQWjV9wN8GC`34iNsetciK z?f0TnzJ1M)xOS@5W`aC;$lqOx0C5vBNp;)BCb=J>xCEUV%{vG2hB80eh)VW?x)#uWqG`c#jbg?`e(q3Xz=%?Lzy~=zja9mzl))=woaj;)#lU zzES2_mRPCyUgKmXQE!%y<8?Btve)eYk_?nwCM7c}gYxmx-YeL=cmC!V-{UiykYnfvM9ynC-@iKb@z z!NKxJM=UIB_if)CtPxn)qC4lx!j@m7l~4&dGike4jd=mQF4M~0H9=j zno_QX3n4+pa|k*>wu6WI2sq~DYJI9RDi{Di|P-o-K zgKUo(#1(|R`>eBJd=$I&cp3HJ7=-oUn8Vg1ThCLD8+s?gt+V-M&to2N^eAi(n_n%C zZ5rm0#GssYv(C2jdGK({_mHDUK~cl}vh_Tb$ZwL(3~0}lJ&$?HDPO*mU-mqPra_ba zd%D1n1%uTGXEfn(LA%Ax%0>nLuh8W5`=8uTS=d5)$YYZtl-wEAVj9rE@ zkC~53l_L`lL8-&w^(erPb#?RGhKo=RKkMvyt!&Zte>dhaR_|iY@1Fggna5ygFOJU& z&STtb!FHQsg5{sG+t(?(*O;>VICmx{`p%SRy?IGtP9h6K8ro!?2rNjo!l03?S>e25 zGP2^lVl@$kY$am;!F&6?#Pj+j%Yz&6P9mNypHaL|{lBL8b;aitpClswe$5NeW-XmV z)E|`%eO>%CHY#qFnF6{l{uIm$%AxDQ+<%Bte6xrwA zDZH`OyK&bXzULI9Px3sJx!@D3m%8%6xMQxmXjtZAc{{<#&0H#<$XqJVmGkZd;}x_t zY6xd07#w-i@hW)Uq@pQF$|_ z4jF<}m3?yPQ;!c=We3PA>tAo;c1Mo8=(6Vydq69nFY*4eO=;K4DZb=9cH(-2sXea$y6#bch2 zZR>1)+4GIbcwn$z%#Uc>r549F4Gz8as5t9poo(my;Ng}pjr^d%p1veaLSpyt2bEKXAvQwjTH6yvU-{ z7K!$xFh&WTjh8*&pq;6q%r|aFr7DrhVDpXFa1rK*XN}s~@sdMZ9t!Wqe1mNtIrr@E z%zT6GOvh)%+o3m^E4i6J_IKyC=}bS&YcxYILWKyt`GZqG@Ya9++i+7&k_UZQxd;>|=ne`JmVyi@%@ulTUy_Y|KXA|9U^Lt1mv z*@X{yjdsaNaxh)Rab-i_52wdWOf%*rN$4u3_3prY;P$@!$~*h~Ug#Qjf(u671?L4= z8rc4$~E2xG(gK-lj+bhPr+mWnH&x!pPj&9O^n3TH|k%Qy{NV&TZd4OGX^bD~l5Zl>B=UikMjF&SNd3g<#CM`!+ zv7)#ar^!UKi%xtR3K<-gLP&l*{tW!hE;_N_Nx2U?8E_wd+(oAsn6-WV1`|#- zQX=oujHpt6-ZDoT`Yt-(K`QQ|BX{g{TaVj#o*DM6oPES*+Os~y=ALDw{5+0EVzZ4@ zkk>}(I3tb8>t-%!8PcWl%u3#aH5_v4k{_Uc}O^mpU&YxJ^ z#&1bJUfvDNr%BJ@jf!85(70^-)Nuk15BdVj(}WEY*wS@q*$%p_Li6&{SZ;kG&P!oU?1g?F)K z?4~;Th0~b!Bu!gTcr5dXcF_^@s;6jZy6_%m744$)akkui4V_c?VP+NWq9Z0_qg`}J z1I8{orjYXsALNOmU36|^Ru!?YB>+Vgg}-Fvr5d@iu!dr^i;ftfjds!Do$2nPBjXTf z7oABg^+mC#k#|t^Voo8AD!RMq-7oAC{xa^{HH}j8n(Wz#-XcryshPIDgbYff>+}TCvGRphd zMJILxBJ9sDI^0Lo*+u7@JpUlO=uE^ZG|Y_i0Jm%o(sx4$Uq5hwyRbSB|@f z!J|c3JMKP)n6IYijr##Z3MJ%hZ~Sqr^n^fm*YUj+rT6`YIy!}r53eu=*1q0Y4Xu(* zOw6(Db1|?j(Lz7f(DZ0bR`TM(fotIIsWX-rMIFbX^G7DG_b-pF9$A378)RGnxYKbJ ze~t?bG6)Uv+H)ZOmYQq?Ux_Jm)Vt6JJR zH*__KT_Wr?Q^R)Bol~kd*0a$Xy0Pa?752Wd+rD%(Hg0eRpQPtEx8EHP@mTtsSf_O2f|uQjv^L z&t}6Rv;R)J>;lx!H|UHVjxsj;G4(ZPW1+IP{;}I1VH2K<8fviN5UHJLZP|CI1GTg} zw^Vi4x72g1T=YNOORX)~Ey!#QRI&8b#Z}8rJ9Wjfvlp&Bt!g>jxTZd;tWa~Rq~r~o zu->J+y9F6XDg`;$MfEio;jG~J}tOf&b5K1U|eQ=-*4>b zYJ)XfZ07{)Qte=;R<+e^((8`<-`j|muaa=61Bk}%EjA!(K#yRhH%dWte$kd>= zb)D%0(l#yZ0SyiHUTaG`E+4-3L_0x++a!_y8t#3C6^zloPIVi)x=^4h*xqeu>VQt7 zYD4>m?uL4~sqLmqc8eslDHSB1v~~8(8ZLyCZm2t1*-e!WOvi$ZX@*&!PNitdcFEtA z$TW-D9*Vn0)wHf}fe~YgVQV4Ydds#+1M=Aa&9)`M(6 z)Y!)7w>AzO7!NO?z4Ra)c)3mn8St2jALC;*A#R{}X@uG|jL3M|>k#Na4?j2FixBu$ zw9bZQ>p^-@k0c7udhAONG6~~9~nqgxu*hdn8BZ^wFjG_yE9JE#{y zw+J2Eu{e}WyYl;ibqx2SS3_})SIl>s9m+Pg=$N*q78~o~B^(XEj4qKnj+w}UIu6!3 zh7Za^(rIArldKa3PGUM>TJc0hK3C|!Q1M*FX2ora*C^hmc(39=DL$!4(hKu@L9tKq zbw#m>i*VW32T0C5f4zCJ+N*9R#3 z`T%8LA7Hh{lYM<4%f3E9+1Cds`}zRo!xQi|jW7H9K$d-dfU>U-Q1U-Q1jRX1eSosB4^Z~?0m{BUK-t#^DEs;V zWnUkl?CS%ReSLtkuMbf6^#R85vShocLDah^?Co*VeH$Y&G%8_Z02=(@t=X3b8Ds~&OLX%(kK z$A+AY^T7^{BwTA20!_eY7+PHR_2JQ;(@K8k_n5U!)C2A*e*yNVm9ywA-%Va4?Op6i ze*C3;@1|Eu(Y;d1ox8;rwZ?k`X~0L^C2OSmN&AqdJqBrQx(UdG=kuY5^pem|LN}SK zY2O?qzk1DYl#}16edH(Wr%p3mM>%J;snfHtd*RAI&yv3nnQeqtD$h?tr`mfnc#_~( znsQ25zdBPjl@Yj#QrB+A2Rc)C{n^6NmLNI~1W|_qIzE#xdgNY8)F$3&a)FEzm4hp~ z9|QfrM~J0}{tlk;+==|BP7?am^8wJF@>Kxs>6r}aLV|d1s6^%4IY^#@|J>yW89<4u zsp7{YilapR921Y{384hZBN;SOq6YtrlNu#zFoHQBH5uXg@c_dX=EQ6*RDUsKSaix{=^GL!MTO4KT*JB?b_plGw7_bmoSO4RK<;~+{@>QF?9DlHo-QRg$`Ri+5>ycNthRHBM@ zXU$Id1x4F^eD>yLPkaJ@x8f(Cy(f4F`=jFYI_O*YtHCv;67?@Qj+Cg>sKuJ}9LVNs zc97?Is*V{r6ea2th||9kRnr+Isu2=-Uu2e{67^B$HGmTJ6n3*Om~>mww zg-X;Nj2S9XNAnD!5>+%(`=LZN=bM}NRpt^ZQGdlV44_1v&6v-abQO7*Fy^<7RGIgL z4=Gfll8_iFQRB^ws!CKQaFnPN(cV;v3YQ^Mi5f+wx?!|N9*PoGqee>9Fe{vG$V${( zaaK{Hp2>@HT&O_%7+b=sN#lh_GSrHR!V>m%E9Mt+#~LV6S%6qkLE(QBBPHsEjC_iQ zrVF<-a->A%Y#mBelXgzwXBatBq8`S`krK6wkr!#?`GxBk8Yxj1`w$}~>dzQ?sYb3W z{3WXpDN(OudV<|t7wV{VtmPQZXFDB77*IE~?ZD^Z04;V4nR zh-jijl?OniL>tHj*UFhi ziQ3HE93|?ZEVrXXeTeBDCF%~I&QYSmpz%JHsPT`W+4e_?`fZ-DBeslVc{J-hmS+$p zDldUtC0B{cd(|pY7qO5BrbL~Hyzz(_Scw{c0GVTJ5>C$Jah#OW5hWP;_@hyEe~eG9 zE8S$ofLgT+JU&s6R*wG)lKKZr+%-4}d)pB-#O|*`KK=wr$yDW%(nKFG(JQ?pk7Wfz zP3vq#dH-u#bprMlG_9lkrc~_w!n$BY;(;xyaOG3g)wd>jwbZfs=Z_r6eHyn1SH`c% zxqR5RT&8suoEu%NuORw2QrLpSyGW1rFBH5}VRTH$giqB{wBmG>4+BZYf6>7^w z0~jepLoFio+1(yASfaPH8aQcb`4e5KRe5KqHuq9y@>E7q6{QUI+eTSw^r)eNPW5~T zpf|TFH>Wp235dQyts=_N-2gor51O&HO|~*r6r`$LR6TH1;SB9>hJY?-E@_4?{H-bd z!aKJ=t+G{-TWz~h%o~lhQHo|My)%@UXbw@3i?tx5eP@FhJ+mqoLxn8VmdbsrLALsOs~K*q&7>@3@*a$mH{@DK1w_MX72`&A z9IDw-!8Yp6oe$wvq2@T$Q{!RaFeB_ED1-AMdNBKFC>G^_T z+@n;+h(jDF>#nn6woZ1Sc+`>DG|Y$bKI(Yb!+BZpeuMWO-;mbXc-cDH=TVP2C_L-I zHn8`bS899!7@vURctLBX1|nE`EnTXF1`Z!YrV zcWagpNy7X-fn%oO^`k36;81k3zg4}ONfn*TAj8YEUUOV8qs(ahTvb)yVFnOhYdy$aHj|9kAHEeJd)n>ec$|9Raw2s4%T?wlD#|wy z(f{sI|7X>Ir~2R28wR28weG7bD zMVDN>+KZr>?XNMG6)68fM8DQTW4nSJ~zMl&Eq$Z zGv}N+^PS&sKm}h06?_>~@MTcJmq7(z1{Hi6RPbd`!Iwb=Uj`L?8C39PP{Ef$1z!dg zd>K^mWzd&#qp+U^Uj`L?8C39PP{Ef$1z!dgd>K^mWl+JFL0fT;QI6otpx0?$@MZAd z(7fQw;D4fd!I!}cz6>h(GN|Copn@-h3cd^~_%i6rm?*HkKWX}=rbF@a;e9?#(-bMv z&DNCmn;5@H)3bH>T1|_2A0VFZX6nGoa{_#s=DB}{@$!7ZKSRy)1z$UjO%V#6>QQHP zW?BB{FucqcHM)w=C|nuAp<~2Wz3V#0y;-`Kp#zvI?)hHpp?cP$r-P_=!b}S}NZ89- z@st;xjt^D;r-(6_Dc@2WGyM|cfSIlV0cLsz9%}|OtwII|Gv!s)nCX1P_s95VAhTZZ8 z7mX#p#;6E0JstC5!xbh@a^mvGOcx>-G1DaKXED>0SopLeR1jD~LZF)nGnIAY2s7o} z(_*HRSch3E->3wSjj)($JL6`nxG{;F7?+8eUW6(LW?Ij<2s4!>U5l9th-NWUn$745 zGd%(F1T&SMjWAPrL#=xGjUpq=^j|3}2WEO2uU~|j-pYzanCVP%5oUT5Q%0ESAK9l7W_mYM_5m~9&U!|e z=}Rmj2WC2iDW6amVp(DwPaezbV%WmuQA}(x)1R|5EM{8G#1=DM!Ne9b#RoWUF^#pA zC9h^;ib0&!c+R320oGu_9;7Bl?}n_w~1k8`+M%#?Sgi<#a<-oZ?- zpfCqBZKN~@GvxwK7nrGFp$=yHRU{M4R2~2pGYwdr#Z1#=yTMGKL$?TK`tR%?iVy5#MYcW%q?OV)rF0Zo1Odn=qi&f|;(QGzT-~_o0iK-p%w5X37l;E@t`& z^LL|o8e4*H>J4W49TsRY)0wPKUocbNs|GWbkEVl!nI7+7g_8V2|F4))({YmHuN@v^ z7msOV^&?>OWO5!YhWC>}Z<#&!@iZMQtT$|}tt)Na)|yK~pN>wF3H+D30?GuHnUI@BCI=8n;53dFBjFhWDBXgQRuRym zav3nB3+^0-kmTP7hwOI%v2Vbp+%%=?QydWN-xq{D2)Lu!YmftX>XC7WZx-%f}7Sl-Z zjN|V%O+myxkH&H>)HtT0yAwZLreZP~ z1d;w`RoU-ss~OAidLP1gDW*p|BhT=Ly5WZcYjm#(Tghw7pK@+(*dC4~>-t0g6HDOY z*k{E4s4rn0!vNcH;o2g9`T_1ta}<__>m_U6gH-)FXJH|TUbH5F_P;Wul3x2A%vA^cIzKdtHWnqpyG%Kg2jf~_I_(dcg0N3b0UIB~^ z`Q;3|^sWxCT1Z& z8H-2K25pLCzeodwu+pn7)BX?d6d939sj^-Cp0^OxZ$pd$2>$}V1_&46t^z>#2P6SN zxEqrh0}wvX7^_ryKJsXQ@HdFb1rVxSF{-gR0O8lcT7d9=a^qK`NLr>1Y1B>wgrCI3 zDgp?{fzbfr-=r?0R7tFd0HGKg?HVAw4gw7%7*Bi^84OpLxWM7^2MB+PTm%STWSt|W zN_jIy0HNr|L;#^!Ka2oEF>x6wRbI+V5dnnXWo;v+%30(hfbe#9K_);*H5~y6Phnjm zfDnwUR5^kfEkL-Et?ogol6sH=5K7NR0HI)u5kUAw3W@+iQ5ou$QsrDUj{xD3loJ7j z_)6#u5I)VGumIutV0!@&p2Y$pfbc?gM-G7STP!>R2&Xe&1P~@zhX^1PD~=IB_-)2T z0HN$;>H|P1Rzo9z@J7}%2SB)=h@aJrS1qfT%O9ldriGj(8jVJGB&zRW4WE1mRfbcY4Z3_@iqbLgyZewB#5Wc{U zv;g51jI{vaa>iPKu!`kcfbe@P$O43-HfaIE|6yVa5Vn%F0O2}Hwg4gTOcx-$n4%qk za0eUV0EDs&(E$jHD7~{%*wG)6)bWklo zxQSvcKqxAy-2jB5zwQ8pOV~&Y5QbzeK)8^?EkO8n##(^zTkHS}5I)XW3lI)xUJDQk zW^4gMekMBrp?uw0fKc`!I7*eXDa!!}-@&3Bfbe?O!~qC@K0O4hfca$n` zAm1H8_!T7R4M2D~D{KM6r&xYp07BlY1|Z~0&OuYEd=m|XW!lx4>-Z`9-{}{D&~Ziq zHOl5KP^2sqMaorUX;#@Un}r(r7mi&>QYKlKkHLvbhFLML1@<@nGbqTfIKiiJVt=l1 zDe8DK`|)37iJQR$%FlBrszG_ayl4w4;T*1MA?*jv?_Z}%2_^(E@9CEs4y@a-S#y>cdZTjfAnZuB8-<~S+L@HHlI@D{m8w{)(Z)YXpuIvD-;jaOBN6*U1_6$tzcEwrZ<*=^#dYO(mX(8z_4+BQKm&;YOijE>1n0KYykee4Fl(G z(U%P$u;7bb11(-jP1EMhG#Xtpw~qjBwyr4OIqtgxvkY? z^O(Sh8^uV+88#cg&6SR2m^>82bX;OE&Uoh`!1x(=A6}e%YZ_OHe##>?@~WLY@QPw(t$5TwrlY$MKd0K>^^j-! znW&qQmyO@n0z56F0PRfuvhmx;oci&@#mLLXZ*PITlo1AM06S$Mtl!7g-{C z+4${4i2R9ZB+^kHf46B0BJLXM${7aKlzS)q7*owA>ibBCq9bS0W#hLUNcTXL%F1JU zHMdfcoTS}@K;pM-3#-a@v8`q-!|UyVuIPMvv@_)z-cUFE?}gu1n986R*^ZSC&uf3Z z!!w?9P~{Z<`%A+{S3w0FO#GL1B>szTjvTK;QN*e1auRr^U4S3cmuAJ!0MGVtPR;mt zX2ompC&H8Mlvls~^_<1b-}IDKO|oUO?Wr@`F<{uw0dV~W&@mWC>{s&llE?Ff{YakA zmtas2xHJZ^;L@NcGd<{ZO$C<*&u1OO-=nGE(%?5}ey65_OC$Vd&F|J!aA|};s(Hbs z!9TBg07N4H_nHbWjd;POK?Rov6ug39(~P|^7W6`fDebvm8se1aF9PtbdH_@kPN&L_fU^&eDlX;9Jm1Qm@M zP|^7W6`fB|(fI@wolnr$@DO6XMCTJ!bUr~v=Mz+PK0)VUOfjA4e1eM3C#dLrf{M;3 zsOWrxiq0pf=zM~T&L^noe1blw<%!NG_}4Wb#{gzIqVowVI-j7T^9j00$BWJ0(W5G;JisSZ&etdL6!7({JeT`!)T64u4tG6z?14AI19>?^!&8 zgimW;o*#%`rg?c@ftTkI{u#>WEamVF8wVEeQAc!EI{$M`mmP&d(6y`+pP)y3ctMY7 z+ix)Il-3uWlfD*@p%welwBwA;;^FOWdq+Z#^nW$>-6h^UaHc7bRK*?Jzh|1JIM(Ev zDdf0J{GPWB)EA&}Frw|5rau#IB4UFUTtl2`N+l)$$SrtCW}j*LQ6$!9n$qrF4&*pc zB?SM4Bo1;+M8=+J`cZP@SF&6n$FT`yi$4W6_Fg2UcY$3Ds@ax8Dx=uFf5SWa}N=|W15&NP+P^BJl} zg^7ER-=1kI>Wk5trq@tPbf&4i=b|%B1tZHm({v?@>G@1kQR}kE@yA%V9*|?cc?CI^ zo{f;>#jIX*rs(*aCZ|X*qkzV8gNGRF{n>f5DzHv4u&QAlfrc8zIs`j%B)M&orgl zT40gmN7#|}Ow$#thDDCIG1el-*RWiBrs=CJ$Rfv2F|kFCi^$qDO+U-L7CHVnV=Zzl zbKYj$;coTZ*8X(u0Pw;^W|eK-S5n>9)l| z9NmUK<2sa!qmnm{b4=<1U>LzoKu;3`<=2S>bOm#oX(pd))9tfnjp2S*PsVPLBfI+ORzwN!Im; z4l1ub9j_fRL##|kj{P_x;#9w$lEtfqa|0=w7iLvMgPaQA+|pEo-7zY-^IHnC*nXZx z%5rFfmTez6i&W!=(C-u65L9qOP{9pB1vdm0+z?c7Lr}pDL1q06RB%I3!3{wLHv|>j z5Om-yQj9nB!@yajsviV5M1Kfw2r9TCsNja6f*XPgZU`#4A*kSnpn@BM3T_B0xFKk7 z&muh%5AeR|w^lC91oEa#nU*e_nNClgol4E%KmC77Iz5wCUZ+loONBScM9|dIY#9<>7A)ctg1TX9Yld}qoCl#6_A_rxj3F%$O=btJ@9{#FG;NA%H zzsJZc@h`%h0zQucG;v)ZK1jy}b>RGXaId5kX~Cf2>niXTkf0!F1&J2~e8l^MV?JLj z{-mfxf9;^pFyxep{9mE=AO+rg!S$0>F}=*=sp}}MX)}@5w_hj!+qlu0{$r2ld zQ)~t!Uuj)fY_b9}k{{3_j_LXVLqPqwkJKGw#?Se^JNItGq=)k!ejD(XV>;D34>%)_&puNJcx4YH zpBKiNxa@DR4Nm>K`v#-BSjq?kHS)5*!J3`=b@vVSG6YZ~);N0kyG>IQ&ZAG=v0$>? zi3Au^%_be8-+aEo&O*9;zQHajKtH1}euE9ikNwPkNAohi!8ivPjWFX({S0rY8-6Ih z!B|i0+|m!uHy6ha9s7yjTxxre1WCU|FU1K}`i-W(pqOF|I+piZk9#Uni0r8Z9nbWj zX-#Ko%KMq&3pHJ)=?YEH*R)F04Vv=4V7`kry_6JV?_-)?p~EFT!g>GEUJ0)~(@FjD z&rpsPhQqSvCCyXP(Kf6e=Wb>B+a}?DL%3+}Hd;n20@^2cc&WC%>#zqa<}DX{BHR5P z?HKx3hTgR=(iTaq{qrx-mOri(_GZo7_r)~qnBbAZxnD}3-A@0XutzI|4H20WA`Ruz z|NH3N^$F!t3#941kEe$98uoKX@54np+ z;%+SR7LP1Vpx*C*2le(E^Ve5A)?1;asN1@TXUT#w%ndSadq9?C33 zKa77K!vkf1%Kz)IBQPPvlu+v9AIP-F4ztWj=MX;}vSf02Nl7@QWO8XZv?RQ^K0P)3 zKuLPj;-%POD220Lbg!JLsJWi!l?z{fjiQ%-ryRFO2FAyGz&Li{f?=_WVezZ|jP)nJF6w;Apr6KjV1Q(Phs; zQ+RevL^zg3`-qP#&p~cOm@DqwZDc9l*o> zGmdHLbkT;qh?M&QV;OXah zpc{r)1(za>V;q0?Yih#pL^_UXg8#9r29G1Zw1wqUw>m z7L8knz+(_H3P1KAuMhhKMMdrv1e8XcmFEPB*OWu%P|RuF@`)R8Own=7`rz3n>xO37 zo@5HfZ-^4OwP*W{G?gIqIKr$8G<4WepF4?J$Vn2=Q9oF7b42OV0gWp z_6wXv&z5_dE6Gca_*qoXM-GTN!?ARRu4)6>DnVBVVGzJBB=IKs)%#f&yOTncFuHfC z1VWEs5-!RrftXL4`7#p?XCjt5LMI!fk{y}!PQpy?s3bCGQOGJSV9S`y4q zafJzif;Tof3jXCnoM)s(baRUwvWqo7EEfpzJf0t1y*sKD?9b4CgbqCJ^?Hr8D% z*qXk3C)lnP79f1UE`tD_NkpjcZyl#;K!~4iZ3JkZf zevtwL7w!6THr97oUZlWq3G11|^xYno_k?QSvP3J(i%j1g#hOJ53>T7%6c}QInXzZn zcMl?2rUC=YaugWI=BdD-lWs+Gj`}kG`H?6HxB&t22l4Mp$djGWffxUQ%j3b!-Nu)q zMxwwV+Naj^-Abg5R1{*#ce!jl`8D5(Eli4Lt2KRh3Pd^z3`NXqP2XL>uCfXY-(^Qy z(|58X-zqRHWvo?TsA9R+^xdT_$SN>A!^BpB;ZIC#P2X)IYZVyIV`8hoz&q15eK&)m z9R-FuHo{S0c$M*v0>dxJcQ$=@DjVx4FuVt1M1esb09JuvG>f;U?=XMMPk}*{sH_4* zEyY*`hF2*jw*o^<4DLA!3}U3vn!XbSWUIg+`yQ+U!>8CIR)OI`cCR&kcRypT0)w2b zW)&C~vSK+E7(UIuvCH1*Ylv(VHyL_puI zy5-b}h%O?3AKuuLkqN$i_up!GdoJX}J!E7eCf&F@3@>8yBfXnCqC9 z?o|Ak9&-$Fxzfq3L#H8Ox?M&H{Kh-a@x$v;^_Fi(<4iiv3!Pw(w!KE9@@xm!5aE@2 zW#b|fu{Ji#2tgX-&BjG0;$6#jQ68z0SMB71*IS2|y1QP_bab4Cy7fy#UJ7B9hn2HP zUMu{j4)A(6LEaR4v@>x{;9YqYPW?EqF!jsUk9Y!+DJ_e{$m6`*mA3}+I45EKhT&)A z-3UMPn6dO*$a~Z@QpYj=Hth!y_cg5by8U9xy%Vt*E6qBYw;$=o83xp(LvS>v80}+? zHlMvYlK?2uMiuwwa9NjCWxLo`Ge+U{Zo#-;Nso4>T*Djch93$XBNJKhrS7;i+WCS! zqzsGRV%sJ;eB_1aVCYX^NmyJ8|A|YG8ppbDPHPJxZKDmKpI{!K zCo>=DbWKm!l+P-L^VvbVR?`id?$q=Xn%=DGZcX_m$9#`!`n0CcYucgd?==?pg)$y`K0{&&qi;Xt$VzdKPY_x%jjW$rR(FQ6u z+CX2#!-Mq^8*QLsqYYGSw1J9^Hc+wA1}Zk%K*dHIsMu%&6+Xaf}+ZJ=VK z4ODEjfr^bbP_fYlDmL0c#YP*b*k}V48*QLsqYYGSw1J9^Hc+wA1}Zk%K*dHIXe;(h zvc95g0V=u{prUI5D!LY+qH6&vx)z|KYXK^{7NDYQ0V=u{prUI5D!LY+VxtXIY_x%9 z+h{u)F9Fs=Y_tWKsc3L5i5nR;4_F%G-8y^I2X(-KWCq}j{Ec4{0X>3#40`S-2JHL(6aQ6c!aFjpMw9P z^s{@zvbMeR*W9xg?HXDPf7~0n4{bYck~wn>XM&9f&$QdUk^AuuJuW@sddN6uKiWLB zJiQa!4$j$odHPmFU6({z$MZa~G|n?ypwpq7j$_zE>BnR*;2`Y%Yu0C*4Thif`ww8I z^p8Lu@*Uu(YnyOVf8<{PnJ*)JjCXy9u?Yt&ocq0s_HX9QGyZd4*iTWY2LE%S{ zs!MowJ)YzSp1lRR9eDN_hXH~A)XOY^0XZa?v@GRj|2c8{8R>89iQPT*X z#l2wQ*>6i-1fIPZUc$4FFgDY^ToKv|i*<=LjEdmdjmTiQ!bHm9@`qH!dI8VM(Pt4ndo-^`AK=;R*#8kc zTShK|X9bXm;MsfFgkIQ}E0VD~C-EK92%g=}dgg#JnQ-6 zN2G)`UQ7^}p5fWgL;m3f&vG6r@a&Cjx`k&?VJ{gAa{nU2eC*4~=YoZ2Co-RfXMe@g zyMbqEwKj0z*&%GCg=fFd>=vHow9&CIcM}s^c=jWdW#L)cpK##WA2Zg%vnNqzglAW><19RTHS5rYsGLLbR0Q^^KSQY*J?Yp!cm{)VQSP09x??%KL~_;DTJ-`E5%E-WUc$bzZi_dFk` ziA|o8{^I597ni0ttpE9jigamMyCfV|e_6QgfgOv&<39E=g&JcJAd9Q-&F@X)czG8L z8*#ONS+FbI8I!b(V>r{vK3qxMih=QGj1apxHU}YUflLy}GMMPz7C{i3>g!u^U|{9u>QV+^uTZvT<`=r9$in&IIc>b9!Ck#qLYNyehKs;>V6vXW?);60ah8`{Cu&2`^s5 zNXHpA8!yh4j%%$Z55+LuRZf8M&dW;o0$#*?BN}JYW#h%8pl~x0jbuBxp3C;K9ocyC zYP_V0n;2)j*?93BfSAlrd89^OHT)(Iyxyw-_~y`~o$2Rnym$fRrI3d5y2Fdp0BhN& z#+kC35a4u!SL@V|^A1zLY`plrke4#TK#jZ|@VoLFAdmPR>xV3nyllMqgNS^{G!p43 zkH6bA1raw3cwL!cKux*XcySZbq3Fn&blG_ECy_26y!e~If!iRYC%kwK#{K)EQf>X5 zAn}^|kU121F~^2=3Lhp;s2nxl)SS`q#FtY}yb4$U4+dT=7%#+g-b(xzw_W5ImyH*5 z?Z7z3FER`$`HC!lbrxR(-pr9%o}LKf1)l*f%l@O*`ewdkHdR*DynpM)7R=muifCpO z6rk&>S`k&*y0H;`Qoz6yeWm%Ib~5 z_!C?glln2>iBqRQ1Mqw<^=S73c-8<;jea8D$9@AHz^PR~4B*tN9}ZWX`ejTMWZY_6 zfEO$m3KN_&J)^>G1b)+#??zEg86VTJzIM5iidZ{4={*CI7R)+PMh}uR_+r;MQs2)_!~2-tzKWI|AUf)Ugdyupa~bnb`3#;I|&|Ut+<& z*DP2z^>5P}NA?U}o!*svUE{w4IB!4Wybh8(HWSz#XYD#J9yte-$rHFBmC|r8)QZn6 zWT>}}!;@EC!@VoT?|Ixl<%{a5hI@IQm4A<~bL9T^+SCJdf+VMEC@b{Fg;NA-`agE?!feS`bl`PgS zbrHDtCU^<=UI!sL;NB^Wis0TWk->0*h6KPpi}DG}WJQ^w6!abps#l#&Ve9*tr|8#l%L3#gzQ6f1iP z!9sFj@peD)6$-U*?*i7X2e|iR$SZKK^lSw89z{v3RfS@SdKMSKy{t>`v~m9v`3d*> z%o%Cpa*o;w?%m9SE!_J$a`po5eJ2Zu;NHpX#~g6)-7NfW)xgmSev(^l+<#_sBe++# z+eL8iTGlUudj&J<1Kj&pmL9>qqF0#%?)@msi{RcG)-%$^eT`fM_s(anE!_J9vOUAS z+|+k?!M)sRAaL(iHr>L#b9prlpc_kyo~B{r$!pmchAm7U!Mqmkl~?qc!S$R06pu=Z zQl5o-k6~g9_g=}Kvv98fffnvfGuFbr=dfH0_uj_~YqfE2U}6jRKF7os?tL#=3-`)C zPYd_*&UCeLH&e8ujk}!v;lRCI+#X4{=QDcF7og?qow`t=3wm0dv^?%l*rIaqM-f1`moPV8LF zb^K4FAivBnLJ%Ei6h<3&n&7dk#?;q(zU;{IFC0^|IbxQNscKnoVpfc80j%W9Ti34` z=eM9w{5h2BL(3<1Hrb*t+YBE^aRDl^1Tou)?eTUBS+xeDuh z>l@(%ba{9mErzN$Hgy5Mif*xnUFDY18kPrJwf3L`r-#kCV|{xn$`chhv#hZIXFfQv zYh_~wi0UBmStzPhMAoa z;QFFzM>d}Nk%Z^XHbRijc;AyHZx1?({Xlu7MqV}iCJ(&cH?h(*i5~5kj_yMI-1fPr+iJ!#yxw+< zmv_*ko#_|D8|sGtz3|iuQ<>=Mseprtm-5*`{1UKpuA{mb;C z0}HxA^E);Dgr+xZx?9uxHGNdmr!{?E(+*94uc=_AkS}X}pt3*)Dmt*Bq5})sjDf@Y zhz>01RhkzaSn#_wf1jq0X(~Ffi0{z+z_W2zrT2NwMyIT8>t>l%B36_!oUTgSDQ4<9s@&lrOhQpYt8e9&LlwpXyi z)F<~5Clo!=a^QsC%Kg+ajiuZ6BD>aqg`OyQ)Olzu{rQfE%J)#$6*{TU962X-YllB) z$H<4$dyb^e>4enwjx@qj>Fphpz(2fh&)!K08{=*7n20dS;Tack;EzU+RjTLwqpjf4 z)IV*9{wdP?skXhuFvAh37tYc^U0-7I0gUn>Vw9QZ%H_~S)rW`}tP*C7HCFj$-VSm} zW4Iwa?+$_b7N_>P;BCL`CLKtC{H&aR`R>`?S+z;m`Qmjh` zRvB8XlA2qg#VV=$8TNoxUW1aa^}|)FXCtigWJ+4CDjQ4OPC*e?$-0E+vxCCo%YAg< zY{-b;h<`WXCmnc#ccec&#-JmSMQ?Fpb7ONZ%_JZ&$!z!D- z@T(Msku(fT0O9T;>GBvY2ZwhkCZ1T$0wS!EdTn6_RvF&)1(7i#@gVy#!YZdSUt~G> zaij?&tg?|@gjH^1{UWUL73RypD#LH764Jvex1!Dut2&o~L#4m1>NzJdg!v+@@+#Id z1FHpxu*g9 zBz~Cu6q|0b%CYPvgGR=Z!(BF>B-|3k7A9${I?Ti>LyJ{XbuhG8WeHh}RepvYX|YNw zu7(z?B!&@MtdcNOXtB!2IIJvIc^4B~tnxJ`wpis>vKFgc%fuF|#0A2n7PZU~ZZFulbpsYDoBta2WOTdeZS>=BDqew!U&vC4-TYq82B znb%^K#H+(h)zt99K%nR1<|KEkgchr$I&bJ;l`|>JQB9=+Zs=f@H?k%UR`~?QIauW` z#yeQ$hZ*l+l~PqR}F7FPK; zG|(R$E<(o!N;S0-(;okeXa`hN>8HCLKLcATBf<){oL|I`*R0&>cDf=~2 zXuSvA;ik}fm{~YhUuXiC8XZ+!VWZoMs~73E!jBY6qZJoV>$xH{LQbL3x@1PU4Zq>_ zVN1#6aCphm$zh@d=fq8)#zW&S!ufGaO4FyN=|edAl5ki_>Hn54Ub=L$sJe2E$;Da; zm>S0+06o_Q!$wD{uCfNjc*b!;3;W5``*w6*@4!G(ITdeAgy-@ew8 z^HPsBLtC^`8a7g^cG=nUmsT!cIDggh6^qYZShwsX`sum3hNv8$~f zi-F{Rw0*3NC|6x_aVTM!EK`V81S1a8>-kL^^KyZ z5986bFdSLAY8eJP0R6fxIKHs1Qc(VW#aq?A-!~vwD;%50b7j5g9-$HWLbuWp0|t}( z#b9z*_LAKf1YU>Y0Lx|IbT0sqDMuLA8iCH>8wZ*$%Gpns#L4wF~g_zSjsrI^)g8YhC?P z_J@&I?c{;idmU@fi|Emg>FBcYTI!dk5YGBxSvr!Jjn|d~EM=b>XX=-Y*IosAtQX~R zK4R*Zjn{61ycFV%GxByI!0A@+ddTCNIOQQrB##>&nTOYp?h}Z7!ZZ>*4=*UqPUAF$~ok*7tUi&O?Sk9??(tq8FaetvIO8%R2ouE$Pe=ofD`lwP$ z|Mhl<$MEwWclgK)&%wlVS%Yp4*#5{@8kV|c)pii8_v@;Uq*^} zgKHbgXCuSw>ze8%a!Umx+PD)*ZHt<6q_cSsXd5kD`saN6`+PKbz@z8Wh|C0ucG* zSbGDATm(*Ox&l2uABkfriYy==n*%-8B?SM+BK5hmK#yspHa1pD0(wk4r4~JoO(!ep zajXX8EOufk3Mq`mIGI)GalqyOSb;Tc4D|Rvkt+*5R`O$sOBi*k;^K*o$ZI%d*w}FS zqsO0t45G(vs98AGwBrXXXPPPXX~s=ArGAc;pP{(I#2$1im~YNX!b!5=npGA+SvmbMy$6HyIyH&o?iI>Sm=rPr6EqZ(rxd=V}0_zu{$NYHd4SKA~ zQ-+N#dfdQz=0J}hWqD7ie9IEESl*M0t4REeT!bFiv7Qln9Eh&6)^ueCb(HKZ6g848 z`um;m2j7DHO!U|$CJ15@zYqRV%rQK+1pkk^2LJpYqDUoId|IwOcQz7*TzQ{6yB#$W z^!PqDeO5pr*fWr%dSQeQ$C9VHtTJpI#TF)4GVd8W?}+3nkl~=mN#>oaW7EkCnb@Mo zKW0ZR(6MF7M#ft7csXM&dVC_U!4jQ#LGn@-WYJ?n_zrq}KNFv=6IUc@*w{gj*D?#r_w=>|H|0h=yBj0HYR#}5*vALPz32510Bq6(c^^_Zqegi zOl;BPkFW*j>)u|J{4!%LdQ2sC2R(i_CFewsKh3_h=<(SU<)FvhKI5Xt)I|uZrR1=< z%}-XaEC)T_L2(Xxd?w=^^!N#7{1~xt<+$p^UiqaY0bS|8GOKajV6F9yxinwj zcBj%FG?din5M$wv!0zFq-g-b7nHufVo~j0A{k5vK#+rgv$M9k$^5PoU;%ltC*b_s3 zK*Mo5uctssvwBGgw63bf>jPkaD2*6nRaIHJeG8pSE02J~0haAGmKqHpV#@=NYQI3L zUFyKPF9OU1#ARcuZFsqG{f+M)%mgAV?L^IEh9T}lni|5iblI3{u5`pCOdjTAI&KCw z&Uoh`!1x*W7chM58E4`+M|6U{d)N*%lI`HSBHN1>rC=~74_I$@0_&GffbqTuajv|4 zbztuWpgEC(wKM(9DXA+jUme(ALLRS?ai)Gv2yo@)s{{KQ*8^;XVnfhg8s>G=tFo{4-I#M+^Qjv@D)PcPOKb& zvx68W;Ka!BIpK~?@@moEAe!o>q|NnafRl5Olsd3%OMq)BYyZHFSmS(jV8=5Z#vY#| zq^E1j=LPx2nhxl|s{W|KO~HPVPe#x$Y5r@P@)MZxatRspxru$~my0atTAF%gH+N=PN?gz9y}ob&SYaw0zzVSw;0Q0|VWm*= zEW^b-dL+QU5Qr#)4x%1vU$Mfac=-7QsIsua|3*-kSmCvJie+Pki?BjkckB~Z_-Bgg9ai}7sFh%a(z6j(Naf@H!wO3w zEl;fQeim%8LaG+^87rjzP+zb@pLK{dO;6)>i?G74GOnMo!e-Vp2UaM^bPlZWS9rZx ztng&k(_)3kqoPLBl;3hWu)^;l+2Ms1QrB3p!f&&yEmpXUy<{~_Ik$?~PFUeu=FN!} z9?QHID_qaS7At(79ci(`iy3RNLQ(I{7c1b)#uI9v4lpLea9cSYat!VKq(Pq?m57!k0K>ax_g( zWg{(C_*-VTSm6)~w^-p7Oq>%dyo0e8E2M>D2P>?gyAl$b)flASy;@F061HhumRy zqG>LqueGJ76yO99zR6Qcrc7^csnaY$zZ!$?^*>f9pC$c+7C!1_z=e6^g|u6Ss}EO> zuPcQYvRV=}2LDwgF1L1E>@jWtF?^eyNLmj~JY4(Amg!|sy{+0(1<+1Z5tXju)<&(8 zD*B}K{~b}k0|PGgt(TXAC)6c-q1IXHbeQy0C*{t{w-9tVfEvzt|Fp?dPWI-G#Z#|} zdpEoD98FiUg(|Tnaz~X^x3

yhUjP#hW#I)!EJ4AK;x{@}h;MibLj?NU1f@|WUm?DRizn_y62lcH_$)G2u0Da1FN zskjk|PoOp7EX66rH!M?}LVUy7ic^Shc$(sX_)>4?WE2zk!}*EhSeFG1VxNNX!iD4_ z#5a65n*laR)Ua+#6uT4n8V_{%IU=QvCwL=RBZc^e3h@okWe^36hU;oog;?V26m%X9 z`~}7F1nUx>&khQUfn^MjQEvP;{QDAqTKJLv@EC)R;K|B@_=a_fQOr}%5SDQVx%IjX zh~a<=i1>z03*kM2n#E^;aZ+M4d;t47Og?BQeL43onDQ?)X%IbPA zyo(CdLGg&h9+VK?t@4dd%woQK**8J)m;@2u@V>J}N-BY#gZcgs2sa@?#5er6n}wU0 z_$%{0aF1{b@eRMFN>GSz_^_(8LVUw-tMcX~hB4ox_enm5_=ey4o^bPrRW?+6;rEmj zh4_X~sC>&3A7j2J6<3icV$FUy4KD%!hKbGOe*BcQVT~82P*EVh^B~n{hLLRDNU|fz zqQ4ix9~#7WBABC^G82-vjesTKSA=a_?Lr{XHwdw!9sLlSlm7+$?ux*Bf)=4ydb{p zZ9#mYLb@Mfj^2*6g7}6S@eSiX!*F*dPhvSkKx_v5&pEN6IZHvS*|ef&Ea zwUZ;siTFZ=lwlOpN-+~OJ2*+i7b>Jbm)JrtP7ifoDl>E4Ru80Nho zxJqiG5MQW}K7wWh#T$}^?Cc9Q+noFr*-Fh`k|g3At_zaVwcGvVT*|5nP89xfKS{(l ztd^1m@#XfTutu_n#kc#(A5mPb=I`>8S2Dg%^Y{A6D;Qs|`G@@EP2|^W{xRQ+vk|-* zrQ43h0}u&-__6{~aDf+};qu3L$E*ea3e-FW@r4R0d0wPnu>9s=v#>yX>EVM*!~^l= zkmM!M{Ak`suVAPO;)~1lYjonVM0_EeWqR?i<9}3>(cW>qd;F2Sy)kGQIXuQY=s1pE zgd-RszmV|nz$PFxtP6^8M8U{w|b!tHuHV^86)5j957qIPg+QzJ})hm$B(E_YWKY%6kFoM(l4K z=M3QqA)Dd*-Z#Mo-hl4uVoWfWzjst1IurXKrR|c1dACFx&XxHGK1gU=hygt>sbMb(`y2*4H)GZ0n;jJB!>AWgkF<^F@RW z8h@y9;e&Lvx*DSDbn%N@HWC4s!^i8YTD(4NENH}`)%8lm=B7q7tf&=JyRlX&$kY#< zjgH*~*mSU|@+|`Y4#2+s3H!=f#eDR0zC*`#M)zG{-VoWiZ^N-jhqPRtWPYZ@#6$2M z@|atTt99Nh3^44e@H2f+=~#xz1FuJUUFnm~%SyKwFF3yWj59LMK!6kM-GX-HqsLl@ zdGqkM4Rz=A*~@ zu95lSzLz51I3-&CoB9F%i^dcqZb7;SB!&8C(vhk;kP3hN7|&aWz@Bj5i5M?)yO8Gu ziPw}v=1}0i?loc0^V)J}wQ`Y1*n@%l4%a2|+0m6At2;J1o{M#Q67rL?_!(Ke23ZU$ ztY!+E>o(VHXz@szxADE+QdhsRp@Ba2de6j%S3)N7;mb*}A7D2r#>eBNxWPuF?hKb5 z=@WQBzu9WBL;{ovZ2Dn$n;+<2Pwa zOK;>qt|`yoCI3TBf2-+hnhwIlk?|un9k1zPP5(pF7c~8orW`ZOcci8%O-nUBL({V~ zy+G4VntnjjD>S`H)30iJpQhi{^jS>-yh*u#(lo>XmilX2tm$c*F41&_rq!ChU(-)% zdb6f?X!=b}pVRb3O<&V=Fju+I{-mZ8G@YjDJWbEhbe*P6nqI2u)tY`m(|^+RVNHLe z>8~~YFHMKXRrzOX`W{U`uIY7}zM|=Cnik+8%6cC~iZOPyrWfh(jU3+y=eyX&iP7w? zap8?vyJ@n9cze``osz#k>~nZd!DZmWw8NY3#ttv4KJ@>*XCu8>>c|o^{Y!WHuLJgV z4~>1@(>ci0HN`OVymIklaR-6^3OG27b!GWH=h^1_AtZ-=-5HEJ1on01+|wLqo8O9-So^x& zoo#+MYa7|u#R zCKsv0{wuFWqz;>Tws{-t7pcSE!}2oJVZ#h{*f2vKHvG0KZ%*PnEH6@rZRYjPP=^g8 zby$Lz`PtVU&ss<7umKIC8g*C}>!`z$#d^PJ3)2*6raG)mT#I^*)QR&^ht)}~I&35g zrRA*-`%ctI?CWxt<(zH4jJ;&lVdX%0!*;T-dnEJbw6A+CMOpj0$1|~2hrOB|Y3=Kt z%2=xod)S<9zLt$})L~ymw*egG94#a`Dw`rYtHTOj>!`!N3u45+t~>y&I_xhww1@b- zgak*QV5fAW4m%#{1RVVpyUVJ>iq&VU4*Mo!bF0G!`%$VvE!<+rI7< zOl;L*sh)~dtCC^=Id7U1Z8()#A)r`fkw9d-ppIqI-~rYuJt zwvh4v2xpt~Ud3hl3C7&97qQWOQ-{?Lj@;_7!Tq=Z{@|Ek=Sm&+6ij>kub_N?mJCuP z@XDEL?HE9#GbDQD*qcx(UtY7h%-m?kbkf^c0sT){AXjsgtDb3Y27K<9Y@qyFeocki>sbByj*k%)_ki0cqKq zr%7eyMO6)3fz-mv?j{e*uUPU>nCr!I5_dgS(6LnjnxlxQ*#IcFvbtfDLavGKZr%uJ z_N{B8cfh>v!7#7eB`#TR-UXnT5QxjhC2t3gLp*`+AWR7&JnBTvW2PZ)i>8J!EnPM) znJZlyX-yvHW4e5B$v+?y-+sm!8QHkxy=(^>$#!skk?oD+w;Vr{2VO6Yoz)+50*v=P zh;xeZ9z#blKjo1cdDZZnJn(vV;bkuKI5KdipR;kvry$Stb9cDpvyex8#5hw{HZJ)~ zr+%DInEHJjev^kX{(#67J=&SL9pK&ezTniaJ6!TetoPn)8VMPc$KP$5f{6PraHBHA zfSPi%^-=$Zbot8~|? zS=0a3G>+#8^Yh3g(gFLqsvrJQ?B|Zf3y9Z!il*E|gFl8}9KR9xjlyq?x4naBiHmgSUo)`CkCuP5edpY&_Sjt5 z++EkUw{XPHeWIh;-nPFmy?x&>uVSx9z12Oi#|xd)kUF0!{HRO1ZWrwJ?&^p`&y#ru zAx$CTo6D6xD9hxJwtYv8xV3|NuuMmtQQGu1b&9bq-gT7m602wOy@L9cRb1QQrB?0J zI<)&^(1-QP+x9-#w0$4#1mjW-6&+Mv=CVDvc7&+=oIN``Uf8#@Bj#P(@nZGPjQEWZx@e?98E z9BIzl$G*Y7nxQ4{*$LfOo}ap6ALZi}v*eA`GwAc>`!Syz%J2(tt~+qt^Rd$k`78Fb z580MiPzKLgW#7CE{~-9;PV!8LU2+|-LKn9%jkbIEp}#SNU-HuJ`yWp4+3O>GQ3}@{ zzc_v|{6^q63cu0#rSY4N-vay|LVC6>t@}$2hqnFdS}1C4F-!Y!U3l$Sm+b3Si_XtC zZ3EJF*73EvyaTqIk39kh<>GYLL5s27>9{0Rdr!h7<@geKLebtmsqjeuD8C#JsWF3~ z18on29Shby7nWJhEL1@!6)qlWvYjwJBU`G(v#Cs)qRh-Dc>GXZ1Yy5osgsoGik}e4 z8)U0`BFfCLDg6!|fJ1D@;Je5x!#|7-xEMrx-cyS4-U+|Y5oSzGe;RM_!OFz+ZAb|d z)2s_Lji=#0GA5>}J7r8vL*e)+oH?u`T-G1fIP9iFP>#}X45rMY-w z7%~{HF!5c8Fq~F6UWlL`Oia@RLR>KH~QrY~kWk%{TE85fzD-i4Ngk%{RG(8O?N zk+gqALNNbXiW`-vpp?kOG$&o*Y!x>qv4&DIO-$1Yl%sHbGHS*?g=i=olM{vG&r+zx z)W3yHJz?r~C|S;|m7a|-^+A-hT2&~P7{US~6Vt3q*ees$PoWTE>Wi5(GBF)eYPN~# z^I5PpG5tH_>>5+obyJwSV&VxJf3cYQYm}7(Q~x@9?rxQDbmCLY7h&pDjklP33AxC` z^b*R9F!fbzLN73NRoN9w~b71O?Ebj@GZ&^Zs&LWVtOc9i>YsBM_Lop$1&Do z>T+nG z3@RMs9hQNqf0oi5Or0C~pm3aRVp{AaIGFk%h!IR(9sm|o{~pV+CZ^?>-+VCj?d&d# zsTZ>q7E}LM#^%P?e^`Gt0-)th7H)j8LyY!L&6!?iyzL0Ta*nx8kdn z5+71hQA)YCSPeDha*=rM3F|$70TcSGPJo*7LMe2Gm-2tZOh5IRcaP*x`Cmjo`TyaQ zeN2Lio@Z&NvQ?k*8T5h#E9={{=D^lK*d?2`NrKTeQ{h-z!00@$*Rce=O@S zl8$M%kk#p4`~U2H34B%6wf>os+~i(E1g;D+Tu4wrNG_A0Qbml4h#CN;K8sdkt95?$wYFMoTNG-mPp#J4)}gO~m}(tbUTdqZzWV>Zwbwr9+>ijG zwZq^2%guMzp3gq}jNe*oYrZn~du$GYsjZTu4BbUsq3crSv#xvEu)7ciLvZP{J8TIj zV#XhYrz6+x&B%RLuv5>lPtHD*S^insmdDCZ6)KkOP@zIT*L*w*6&3E0BgR!!_{+-2 zj2%O$s2Ed`9q;dX)7aXv$BrH~Iy=rkw_)t)Yy~o1>^6+|@4tYi~G& z`Isa9WVv5l?$0mxOUhw%?w?T(lXAbVVcdvuFg*8{mygK841NDw)*k7vzhL?V|D09j z6SCRW^^G-0E&M^n=wpv&xwFwU0vhtqD))Pp`@eTqm7{q1*fIN!c?V4{fbP4CnX;W- zdi-ns9HjTL7FOV+s;d29VOLHK3=VZ`H14&{w1YBQaatwtoogeS+>}85^)S1X0vM?bQ5?5vSIhMchrn) zH%!0bt9nJ_(yUXxybi|Ai)yV4b@)~n*?L%C2=CSz`L}FwOXK{-_46{+uZL%&2BV?S zJOQ@#IYW?h%;=$=9@}mG+aEskAl?CLJhar;IZ?xGPn$N{5z#@#!aQ&g53Y8jN8_)6fMK;|IX@x#C`uUoLI>wz~kEn7@)?0PCjp6zk9Ks2>zx^Zw2 zPDnV?wZ0C>X*#>+@80aC%nR|vASyl8EwYD=O|?8XjH(ruF5r>{)by!tu~D(L3$U05 z<`H+odXN8STLU~CDa>$liQSP4e7kPB-J3e>{QRaRutHt7cv(yRJW)o(n9ES(VZ3P> zMn=vwTq@vv0+*Qm$Jdytf@xFTunYsFr(1(uT9JRTjI*hbQBIB zrmlX;IhjLe9+MfH%}zLL+~_eQoI}ZC*U*;^+#+E!56Kf}RUUJclkX*5r@ZByMN4aH zf$%ONxWI0q`f^;JmpbKgB9+&+v|zKocG>*un%deW^=CWf%wl317dJG;<%Nxl>*I36 zlA1+15zWhL7b6N)MwQfHcjq(eV|AU-rH)ekre|-3q~35x4ntWf9@!!BIf2hn%*W@6 zVJhQ^+=Ot$h|J5dAAZaqCWjkLHFXlHS76IfW`T6nLq5 zb(|H*%l*KsM7STFb(D_BgIcDGc021RO&$?FS8@OBxYT0X_5qvDQs`PxC&mUl&Yg9X zDp6k>GO>SnZVBt7y>+a(b1UZWONg_?ZD4);-J)pY59q&ZI!b3D->&E=eF6C%vX#f$V%xF9 z={$_erf_Z{p87N#7w#AL713dMe~9Dk%fcFBn>I=?9{)+|D9u6Z9!8eOA_}f(70n1E zOgi(LVA9*HsO4XY$<#{P7L!^3+cBBxYr>s2_49qi1XKUqaKK%eFZP|p_Ls8F&tq%f zQJBv9uaBj({nnVw^vy9DVi^7&I$4U5m~ zw1Me$Rsd2y1HXsy3JuAi^KC4^m7B=t8Q3cvk+?G+N!?V@JVRJnx|%uJb8kfjQQp{t)u; zTZK13^#_5dTIBJHJa3pjRq&CbH1RgQ^9ss{+%MnoB5I)KVW~wgB6cd zBo)c@I>oaTzp8k*;&&9ER{WJBorO#Niu)_l(w^}%73V67{vhH-e-J48gFw+A1d9G3 zQ1l0ZqCW@}{Xt+KTsT;-=nn#)QCZfhfc%=uBypK9A9IGt=Qd)Q;yA^ripML?RcuoH zyyBILH!9w(_>kh`ioaBRP4QjD1ST-s@2gm$c!=UO#gi2q6vb69%6&oQn-uR=6#YS@ z|4L<9rvmbODi`5gVY~elhbvB0JVNnA#d(S?imMf`QT(dnHx)N2KBw5O7$i));}s86 zJYVq=#SX`~!`#YO>`z4h_f;IPc#Ps~BJ$5syh`J*SNTT8TQ&Y}mA|g|U5$TK z<;N6X*7$anUse3Q#{XI6zbew_3Hw<{M1S^B?5FV=mCF<-Yy6QaAFX(S#;;ZR3o36= z`6k5&H2zVQA5(l;<6lwvHN|Zj|E|jKEBbhsVZZlOEK{WI1mn-(bp-pGL#wh05ove2L0esC>Q3H>!Mx%J-=JW0jv&`4yF4 zQ~7O`-&Hx_exN^cJw|^9sGQOL!|BqEpPJ?+_{7s-HBWc$r)JmJFL@vDY6v-cr^U|b z-%__PDETsU3a>PJo6y-zL3fb4f?ewJSwA%Kr8|NiP7=p3FH-f(*JM$2E9e7dwItoQ zAX7qB;Gi3Z84TjA7dMKAI7juWKytEIEN?2xI|*}W52pF(fT^h%sj4Bz)E?{v>nhP~ zc_!PQX@^R7J&m>2s_Z_i&X9+#k|h? ze4N}|r6Z=}7t`HCVl~fp9y3*%%gDClj6|f%(jM=Va6~gOfa;qpY7qo^{6vTaIwoSO z)--|`P z^~_SR#|(6j&Pt#`ml8F!k&J-?SuwtF`}>*tgOoV2P$`kBV>K$JQe2tbN~%FOQ|jmq z{+!Q9g?s>d2^+FUm``s(J_V(qL6?%n5XRd5SdJ8boNe`N^xYqCq(tg;wll#VY6_)^M(UmV25XsQq`s;DW7+{m8j#w?v;&QlaZ2__6MWvG23<-tb}AW#0Z7f{ zULH<~8g!|C+&GfE0ntlc!dj;ragFB`9)aW+>^@@2jw>NIpe<_9nUOt-QLLECkN(M~ z3qk5OcIcFABrTC*U;I-!K)PfH>n-Gy+HLsB01kGzWCx@6_!<7)f<~c1m-+zPegk9J z#(%Pn`Pv4K11FR}lv$dN#O5BDC1Up#YS3vxvt);sGa7V8NThCIm3Ofqmh4FF!Mg4? zl3lVx9wbXkQWvtZdri5%sdt$3evS>6>`1Mn^zGxNmQ3o`%=y6iB9*0ju!Zm3DAMp$ z9!K~gI?eP-?UEg)1-oR2>9bw3!?ZU!bq8yC^g$^%B{haax#`Cu*(EznEtM(JQF+{y zn~{2$eR;x2RjFR==Tj5-h*df(^$Kfw_G#IN*^Vc7s=S_+s8w_+#L-hPioIAK<4t8i zj}Ok&pc@IH=UKU#Dca1-vE7>`dITrqe@~8p`yx7E>Xj|6cNNn)CQ-X6MJ19#?qhh} zz>K6STPWl5%ze2WaiT$YEq8CCXZF@fFGW0bJsk) z$vivFGZPwgJR^NB*%5H#Y>y|KXwdQ17hY+eM|N4V<1r?D-a8WG#E%Hi3m2YU!nGp-peCvb;9dlEI?lM+>iYM=~Sh7Pr6P>D~JuOXLQE1SWNam_^ z9?Q=0)=5uhr>j}^G;b4tOLqK-?Vhe;bNUdLtyXbG`YdLi>-CYL#gZMHDc5-Wii{;Y zAUb}nv@9BQ3s_s76qhACPG;NlRK}7Wd`g4{9UJ#cv1G^9Y_36NEZM=gQE1Sabi8sG zawm8)%CPlwysu!`5(S0qKp0)%6i$rGShAxUvMkwA#11rhlzEUYqS)*;iMYZk7Qm z<|}K<;0KK?YJd%p^r`_3i?9gC06ELA3I+~Zg5})ZVQkv18eD^X`}n8_-FO#mn-53M znW)rr-^1f1^|+W7e;k2tLALudp2`2gAOo zHpaQ*`)HhIHVOx!W=ki!*t+pB^(NS#Ccj*Fj++B)p*;AWAY; z>84sVDs***oYe=SbwsFKf?cs3_>AKYJGy%2;fI|#^Ms>LI=p%o;ybAyY>r^(9eGqk_P+!HU z8W|42xMmTBl-ihLQka+Tb~ysR`5RS+96h71G-9lZkkvLa+DnEFFkP5mvuIHbzUa?i zjIB=E6W9;*&1k!*_K|3za6J&!vv8K9ccOK&6s02t2k2$R&V=o?G*qRj3w57Riw-AK zsM9jFaXv=@gvbg}f?8CYqxEGKa5}4(sb3qrOpbKksL-4^1Da>*G)Gmc(Ea&~m(}4! z)R`B$$%&L_a+Jx8n$5hHrs@Sy=b%oHXsdB7&C)zZ!^0|^*g=pJADN*J#9iv7A*VVh zM)OR)^caPnPc=nm9#dYkbm@}D+GR^|rtWeeC(ipjA5a*^ZPNITaChn`wMP=3USR zn|3fFV$seW*pFTDWitWa;V!Y2pboo99xGnogBU0~E<`&nwXrhTbT;Di8~4oyJI<#g zB3|D{)K`Kyjx)Z*h4t|e+dg2^*@pUfEN!r9o%KYXiS-Xf!ul@8wk^Xtdf;U+!wn5K zZ8hY0|9%_*zeTqJ65aseKgkL}+wNW1#$0K(Nu~I9 zOI-pRY(DA>*g3_tLy_+xn+a(15zWJpNn8kDHYJGUD@+gk*j0`@_cdPM`Is+55od#~ z&&n3#@t=gA2#;kH;;pm)oH!RTI7SQ^{HO=OkFPdx+`{J@Jo$n3x6gsj z+2NKM-vP+XYtK%(W$Yle`aB@VpEyGCGm6s`k5fEJ@eIXfidQLKuXwxSw-h%k{zUO* z#a9*op!iqCG=`h~p-B^wpS6hd6`K_4gNyN(E7J6j^6iS>Qrx8YtRlaUFy9{(`SqGI z?R$xR757yJjF{D zA5r{?BCUg2-(M8@<(o3UFcHfXxu`1TUn%}Z@lT2Y7zd_anrDI~5;P{E_0%6+0CFq?m^Z%yMbPVTzL#XDFViI8U)f@fyV&74KGjNbyC* z*A@Swm?$vq_EFqNae`u{;t7hiif1XVR9vsvs(7E`M#X0o+Z4Ac?ui>5_xn)AD#c3` zuT%Vk;$IX4TvS=Ex8h(T=31$u_{)XNdmi~{A$A~Rx4Yp8Tk2{ShZJFErySvgU0=)M zeUM@ZU2=pO`bF7zO@~tgza^P3chCn+BD+0j$O=-HSA_4B1oPT_;1%f;Cb1)aF_BCj zjOUL}eTDp;`Nd3Uryb6ZIVE}glyICQ+faE$r1?aw39cO;iZEL zHr7iAzX`{@bnr{Qdg*wFDcyMKFr|VFDvEjO_%6iAOUEWkL;0{R93u@x)k_DzREAzU zhC@&<9ps4AOUDnDY??M_xMCQ<`YX^-ey^T0$=!2U7~YbdZkes!Ar;M$o9|WrQ=@oNI1rJ4t3*{cr^7 z+PIiVi$@xpno9FqbN604=-?pcrQ>pDj=XgIkpmfd>9~QZk(Z9sm>PNMXyFlwymUOt zX%%_tpecIHO9wxp$Gmj#VLRrfqlKxFmkyqpaW5UKS#``y$A#R9*vc1ESzF9Y$G()e z_tGH_8e(2L&OkN7G0FuX^3p+lm6(?f@l~@cUOHTMEArC82l<$n4if%5^3pK|+2bo; z9LM~TmySIsMqWCqSb5~7<6fplUOJxQ07PCo9%E|crDHJ5MqWCW@+f!frK62wA9?8@ z;qJ%0bX2mgn3s+$(_>ybZemYjUOJv-bulj;S28{3rQ-^w$GmjhKzT=AI_^P+596hS zuTL>A9WS%}-SN`FbJcq3*ub6sJ9+8wX%|+o-|z8so`SX%x(mV)YBTDx!#@xEU(omp zk`3W_CX(EJ-64o(7>}P4j+r>&n3;z@dm-UCocWb-91$ZN_x>IpvD`-Nt9z)_$@=)1 zW!*{~FdWbQE?7)3l?O-z#~ViT0MkH18O^D&1`d-3GACePLI)GhWsp3hQ28mdIhxjy z6=GCbVOdsur7Y<7C$;Kb5#T)X0bCn7^6Xz^E7;6$hRuRZ}kS$dd!mLmd5_KUH2o#HGgVMU)Qu~ z5y|9oI04u#inL2x`uMHF-atTw<#1!~kF(@S!{hF&sAA$eIbjjFHmfKfnw_m6kA`Q*!lv+))$z-iOu@^D2lBwkAZHU!d6f0>#!BD7L;pvGoOttuIh)eSu=@3lv*lpxF8X z#nu-nw!T2I^#zKpFED`#%>Ik5FHmfKfnw_moTlkw>kC?oSNH43}xvmA*ut0K=lYIu4 zk`vmUjjen7nO0nuTlXA-)9hjA<_^1FgqwZ2V+`_)%^v2t*^Pm_@d^+7TXZ8i;I?Zz ziZefb^@9?3t2^exw!rDxzIsaQmfwBwL6MtzxuZDy(^mthSNjJgK~FDxVM#W7SkDhi zd@KO9v4d@+E?k9AXvYv2xmYX1&Ai|7LDt*KIE+;hw-3VhyQpt8Fk3QpYa7@m8u$@9*^000RWSD@ox<6sMhA!<^Ew2n4RW)G^a+g7fOf~azmtM%vwbCrG zcBTnqKUx?qc5p~)GVUWq)~GdUjapMt7TRt*PvVEUfDp*>dt0_)iwJb_pyk;05Evg6 z1fOI4jr=#<|B%Ye09|Ah8=z`9TVTNB&dv9QtRlRe>Mequ`og_BgyWKv#GP(z^b1XQvC(!%q|B=67$rOw%x5$Qi8NDVyb9*Kg%xP9X;UHFZ6-YqfoF*gHm&nJdj|Wl z0-3lUyx-dWn2Bv$2Aj^8aN@nk4GlK!Sjf1&hv9nE$8lhNL|Y%<#aYIjzgXc317x=m z9kz8wY@6}dBOlLu8|?9DKt#OV*4XjDX4vj|*tUIT9h*@f$J7R!wj2@h`tFPE2k$C& zKja2s3j^OqeVLeS>$@Cr@%kQ&^{)rgY<)Ljn`LaDdL!Wx$Tl#IzdIFe{PW1i=Or7M zhk>^obg5Yc{M!Q$E`zK9wE6f>iF{$$5BVMqr6?cs$B)w`*r_Rqgc>y7EzN$E0J*R6 z`hJXi^^u6P!M1B>_huLo?=8!7rbWS*l|kb& zk8~8eTH7;9WqrNGij;A@2JzkfpjZa!Yo}XH>~2sdi+y%~~# z6h(V+&AIFq9e5W&9Lq9E;+y#*n8C=fovw5L?HZKYtydZBf%1d7`DdX4X-^%Yy zr*-6V-))>(xCZhvf*B;&iTh;RoD%M6M0q`s45u?j6*PE7q~XZrU5HfpnRy-CPz7C! z3#s~<$!}qG{?LNUklD{ngH*u9IQ*`4K(z($ePppZpnhrc3RLLR>mQBTlf3o%LuZK; zIKfzovQk@6gPV#!tO6-e@c0|zJ#k*)jg_9tN^P&8r+vK<$zL%wt^?}rXX+1So8gJ*ETd-J#{E1M1yrghWzwXhI#(u^h)79Z>I{n`Goll6))n?ltB5 zCeLEWLLJaQGf$`kdJCmc2lPhvFVq1oWm=97sP{e7g7Gusec$xi_?hv3VA`9UyPzQr96O z@m>7mVV1KD{z3jbF5}IHx>TP>kDS1JDt$lqV4}xLFxS&ZAg^b&JcIP4xR^*&jV(+~ zrR7`m!CJN?eE{o-R%+|TvWIGFHq8|ky+{Z2CmhI1O`Vip$ka#&bQM!09Z;(GdDAs> zW%>tfDAEC?`yDS@sf~J--f^0_Dt!mbMk}>ZN!*KcKxO7E6W?9pXXb2H9n%3lnL82F z0X>Jc#dJXXQ{G+&bU*G+Ob2uds!4eTZdxv_kq+o_>`kE@Li(BE0(IUFbU??Tcg5aN zH~kA{jC4Thoy?0?Y7?8P?pJE_PGWXlsm;SmZNs>ek)N4%RvzhqE@SRU2Xr+vM>?Qy zasW=%(Vmv3XCyDu0j1ui7wLc=&YE*|K)ustZ8Wd6IsF{RKGFddcPB9&&_>o3(*ezA zQ?=5v_?h8bu@}<;-OTD@I-n0SJ*ESC0n=kTpzA2_KnK*j85wp}2h_t#Z4a=+P2S7| z0H>B%?CnGcbO@S|({`ZK_ga+OhN;?*=PC}H z85)~*^Mjv$ApO{V#mH-od}kFECG(xNTHI-vZG34w(`=#p^XeP0jj_dpA_f&tZTq@M zmXGm!uR7ZASMJZ8?)RDQub5s@G2Ty?`?DKHXYq;lPy9@~NWRpbh9ob*C)n-2zw$lI z1|HBE#et}5@V!`Ca_GsGE9%i{wk)l~>|JR|+UH-U??6k^Rs;VT=fb0dbxC6VO+@Zg zKKxhJ>VHke$ld!CEwj2p4oNxOrF5%Ysm?Jzp7oIEWrn^v#KnnqFw)5#igi>Y4pJ~} z;N&Fd%ey*lfwG=>byuf3e_vI~?NlhMt=AtY|D8kMEKTwi{+~+&GRHI0KSu3w5mwWY zV_3b2u85#92?zWfB~AnQFFLb&VGTVFg|2{V=FvmHx{8@!4{ugjVM(To)z+*-%tu~! z2+MqN!8x?tX~7{J&#u=N60O#M_(DSe4vPr!-hjKad_&~Lems8hi$5MeBn-iS=9Bvt z@D+)T{xOYVU;J=`*=auV0=5h`rM~lG5q6WDhuvnrYTU?p7qh{p@nts_?W~6$8+Bax zSrDH_!*BNFJZu?kIuGFWe@-mIZcay9yuRx(P~0!p2i1(QKFf_DNd@pikDn#S}m>$YZdhT`LESDeS!kO6b5+2%VH z`F4f#Sb==}{9uFK52AV2F)1td0wR*nM)-6s3wbXaY<*U?7?0mM z=MnD-+l#kIIW}-;z?Ye7TcQj%myw9Ac!JB0l0vdv7TwFobMh z^ap`uDvSOgWYHf4ivA!_^ap{WKL`~4L7;qg0E+$~aI@AU`h$=~e-J48gFw+A1d9G3 zQ1l0Z2V;t`KSwHx{vc%09|Vg2AW-xNfucVM6#YS<=nn!#e-N0$6k~nzF%&5JgFw+A z1j;uZ;9Sio`h$=~e-J3&i-4j(2o(K6;G3FX^amk}{vfaqrZC$R{XwAU4+2Gh5GeYC zz;`sC=np~`{XwAU4+2Gh5GeYCK+zur&c(%>^^5)>Q1l0ZqCW@}{XwAU4+2Gh5GeYC zK+zurivA!_^ap_nOkmb4`h!5x9|Vg2AaI(di~b;F(H{hg{vc5F2Z5qL2o(K6py&?* zMSl<|`h!5x9|Vg2AW-xNfucVM6#YS<=nn!#e-J48gFw+A1g@rDAW-xNfnQZw^amkt zQd#r|A-Ah6`h$=~e-L;WZZ@n(^ap{WKL`~4K_Gq9GW~rb<|Z#S!u1gmKSVLZd5?5n zUw6rmOH*_G;t#o({Brr?joZEoG-i4T`6w>ooM zxBTsc58j||AVwPcchC{cv~J1Z@JRfW)-8(;0Z-@5YA-+;FS~jx^90C)+e8ulz(_u) ziu#0Gz^k*9$+TvOi+opW)HLgd&wxAdIy0nQh4`(-<{-cgRl85XR z$anTtokb@LZW47CqfQ^~lIKJ{Ql?A3(drAvNyZ>j9{iMV#9AD?vd+a0`9`jIQOspJ zj_O6l$c&0uHN>b=I^W>wC5M$P2foqBe_WOj=`P{5RDII$yPW!@@sS5UX?W)b5lM$# z)+bFXQwj_p84NAh8)eid&Am+NnvV=jso)7VnJD7J7S_E;HlW_fCk<~OF`qQN`>0Qv zL($35C(SPruRdw$_)LA$@Ohs;X}JD{ALk>j->v%4R7C(Pa57tBcC*HGcEK< zGn=&>X!ayy_((pR?A#~K6Rb4iBRLcNo$!&Dp=I$&BO@E~kz-iX$)*cIasev}`AGKV z!}+B78ycZcnrB!t z`zHTLDdZzJ^Js*8}SYF2CqZ3d?bs<_(+QQ>Q25OxDNH_@{v(y;UhKk zuJDnXHR2<~s?gdl^O3XBBj`drm0rhPk9^W(I7$&8*)uLC(&8J&rl!)PSoUC#9q>v^ z(j$Rb_kuhM*S&a)sfTK6Hq8g$m`|FkIgpW0nj@GR@sYCFNW@2uaFH7Mq*=>`B0iFj z;xV5z-(}|GwB4%oIEoP;IfR)bK9Xl<+$YUsRvqIb$8Z2*eB^sfkMWUhl(*+2sg#a& zFMf&I_gaQ0SNgFMpEPm-i1^4hcCOGJf?CK&Qi}!aUYy5g-BPZ5aUiyO1m*a@*TeWX z6!~P`i~nN%5g$2<xt}h(vtk zYVJYglV&4RBR=wZrbc|^VAh<=M`GOz-pR;Eeu-ll@sazosu&;nSJoBdBimS6%qPt( zrpNfm%UE5Ek35X&F+TEerpNfmS(JCcM+WuCu&aC|{Kllu<-kRJWZ;l#nzdo%)E z*Px4J#P+_OO@Ep7-Y-qFS>9{i(@bmsC9R!cS~J2-C&M!?@;>u5_n6`!vdIUbfQ75?&7 z{=(@M$5!}*AF4R&=%Yt>&7G12wSkAevbc9;ab}%+v3HTbHdvF_TN9Z!T+$7xqwr90p`bqK)>L1h@L zX0%k-t-uFJS^FSb5X7$TU>642ZlRCdRTwNuP1;k|DA-l<^PiLU{MbCl?3^ey)3`cx z7-JR=*+s80i<*}$sW*mEAHjpnr~D~2U%=Wf+<$ycb?q{&tb;jR-LPzNouenohhj0vu;PA*V}3kGN$4&gxf@%C8JX{fScKi2+9}@~xIyynXoJm1ZZ{U~q_AUr z;N*VbX)xT6nb@{vu<6`_@6UI|BJ5^od$u_kQ0^D&BieDP#kMVjP3TGC!x}d<*l{Me z8}Hvd)R#dV>%&*Ou)Y>-$LqTm^^HKB4K|J3ZoIxVvHoF~!ul@8wk^XtzK8lU+|Xdt zRzr^0cLnMzK^*&sB4K@B#5T+D_%ZwniBuZ4foc5RqG;pq06E1rvLD3zdah8vRO@8Oe%JU9dU zK#mu~9R`l`kWe!7Y2QwAMJG8vM_B&oPU$?4Y+(9)D*!3;ys&}taw`BSuf&gi9gZLS zdlAqErkkg1D9)7`D?0lC9`e=PXm+Z@hf4a2!vnfR(*pg>>YBQy=fvsI$2iqxPmxM~%^g4vr_fH30KHOT-B|n}`X$nYfp6g)jhQ(l03^ zGv^1_PJfMvdHp64*TZc@ygT&9v>1q!f%C+}$;Mf?Q~n(Xy0gvSc$P!_L5jRqQ$AKv z_;<()R9>Sf{5#?|sCRA-Ah6{5xdf-+{uv1BHJF3jYoi{vG&c!n7m&JLCe~G|00j z6~%uK;zv;iRwc^!@_gP}%XJ6; zEb{uxd=0u@DqQVNYYe7p!J7E}Y zBvx})@nESrZAP{oXDeozI}9lvjb~s^yLW)8z27)y4DyuH<}EM3fFEhSyOAHZwF?1> zynK?uYFk^dQi=>sa83l76Y)PmHy6PWCK#VS|A7rzV%fLN!LkeOCz6|x0xmmsGcXt^ zEtNW{nUsds;J>V|au-?)N^gSb_h!w*$khaapNB5{y?(=NB(uO}&p`LSg-vkTsc}Gm zBx7I`R9t-~7;000kP@Clr9?{XbyZ5G4q!2rl*^teb=EYETaZsi zDR9}TGtobPtlf`&k>ZcDtuAHScq1iJw9@k@7%7z!;%0v%m81@4+C(GuP6?4a$w+-u z?=kHFBMnHkvV{YUlyOS-M-%ifPcA!kF4HO*g#kzje{eV@zjURWq79dSBzFU%ml9rh zx)IlSPT>*A_k!KW!A{AQkZCAOF58UkNsMB}v|RL0HeCo(G(7fCxkl0wDfY!bl>_9L zUgBZ^S#Kfl;J4u?131{()9n#3YLB1c->GO6Tz2aJuF|`#6MNuu3lE__}?=v7~5L^`=-yvw$}fFX>W4sYbfDA`k<7Xl6svjZ2GZChZR>ZL@ke* zS}Ic`ne%Z|ZboVub3S3Ds?;Wq)l(C2ukcD|rLLv)?9;LjvmLL78+kn|QQl<%F<0+J z(Jq-z3f-g4B)M$1)AOv{%oJ_r<=F1c50h8qaM`!;t`9DIDKj6csoC^7%skcO?s}!;(|a&;rKV0ww=(k)9#^6FN++jj zmy7jP%q3__`b=h?u9+*-bC`OxrcO&A&0{jd+azUYq_;Bjahka*{T6qj%HuJ?0Zh~1 zFbKj6B=hVv&rERHJR`-nR`e#$_IR@SrB8b4OIg`D-t)-rm%f~r77dKgdq-k?{L;3( zG^rDC*;^$2%{&|ej&^<_tM%OuRI}GAo)gv*voYrGEQzt`jV_eYG9aM^EhxJq5du^PTmfXg;we)<}AYMA?iq^6ugZty2p4bSm7 zkHBT~d(t!HvInuY$hP(g7C%`>EJ&|n<+EX<&9)Nh!@@GW;IcOXywU~fAF}M}DmJI7_5m*2q^>Zk5p%shGPEn* z^ygT(#@koqOWZU>$FG%^#kQ78UEs1=+%LV=O_#9W^HjdaP2bCedX?{Y)9cw>gUS!P z>6cl4zRGwNE96e_WRzj+=Xk9cwnRZ8I}k=gxqV_>?&I{ShP;hjw)CXQqs)V}Kl{_{ zHHo;wDdYw(TvGi&r;t-}2>PgUU!F(X$Yt|f#bIj0Aok-TTBw_CI)(p*|6xyHTg$V@ z?Zwj@lZJ^s0-izrIeQV0XvDlE@sHzwA@yT9x9q&2AuhOVS=Rp3#i1g^rz@Q-Su}ca)8hKBS31#G zl8?kTgCeY1G9L!Jm`EY>T*{SB8ohkSb@}Zs?gKH-BWIA-d3}@qh{ME1sKYa|tY2cf zDREtq#2HC3|EhD0@TyzpHG&grgyCEcJBDvqah?b(tS^9E+hF)leDA7RxU_LmyJ$wMmClW%}p&Zebo17XEzL` zL*5T_wQ1Szdc#EF#-eziDVt*m0{eQOSFmZdS@Tum1`St~DFysV{uUNz0nY0_#e zn~j01Xby0f#6Y;(BZ|kb+2wj*t$5t(=l{rbPR%=_mNEb3$ zR2!eOGFQ1mOXn4T)Iir7(@W>2d)6Y?e1#5|nVG+MSsl*i>V=Io;;mhHra9juTjQM7 zfQsMel;%0!!0giQ0* zEz;7zrn}Snh2@6d{fD_Z1*HeZ1CPae7vT4fjBXR;wglW8Kip8laBUwva6#&gAImcz zWj=IM#|;UobX80_mJI5{SCw%xlBfjQM|D==ubmg0r$C@F7A30MDUl^oxbf*VvYM(yN zwi`012OuNQxt;Qin5e=t0*5j`aD?J#6sIX3r+AX$8H&pkuTtbkE!M-gf8w_kH!J=` z@nywV75||4S4A3+uzacF7{&RDO^RGfmiaDM6laHQU*&Hp@{<YuZ zmnuG@_!Gr96vf9F$`#<6!18IuGDUgOMf|T+{*B_F6oWidu9xCa#W9Lg6pvFpU2&1( z`HGh-Zcw~a@j=BODgIosL-9|Fd6>Y`f5l;nlNDzuo~Srau|@G3#TymxR(weDMa9<@ z|Du>EFzxnH+(&VOVx{5IifrF9>|-gn}-@#BR++y#5zh0w1+ z$l(RK=7+4;k-4S=YIOZ>l97OUXAz@+HspGN@TC?a5IN(WxhmaO^1`Y z_BN;L(c7HtwYRy>bGPDDc*x1ZE*G}Ac8!p}DC0Xbx8RD6v}-$@s!dqm1L!>0Q3QKn zH@mtg{r#dWPEliL{0i)C^RP|3U)u1#z9aiv%TY#ryp0TQgDDh^ z1K=}oTh50Yz`q)vVl$#0^7l~TzwV$!Y~ z+-^ZB8r;5u@$o|kz`tNSp#$JvtT}W5OeV&kV0x5F(uJoVIsgVu2$IsI^-kW$T0#fF z!zqOhfG=b%xekDbq8Tx`&zeF9 z!2ijLLW5iO<--}=(%CZ&Zuelx(BPJeP=03zzz?zE$N})t5JQrZmK7_%o>F4BR z0n3F3w=L{vjssvnbO8J`+k4!Un~}Vb8X4U3%#0h{p2MnR2Dfv$6ETC^gIQb5;C3M8 z?G0{4Un6F4dlae>l2R@Jk-_agY(8=T+?S)U1B2TJ^iD|1HfD?rZkMo{$l%svr@J?} z^+qFm+~BsH`6H5&x`Z)<+Zn7pGPu2hnInT+QQ3$b0Ee#waU?-JBUerIQV z)(#}$Xik019m61Ew*=yZUZEI z7X0BPD*$buI`fg&>>?leU%SXhz6?Tb3K}CH$?;}ai98l|E@M+{`^IoXgYBP{Eym+N z2|hADXEtjBKv2K*fc)8*RMd=61J)rWVio$Us{za8RGD!VzDT*y6(#4h%D7KV9YM!zmqGt?jR#|K* zA@h33biPm%#g-B%wv<4zr36w(gXtZLVoM2GY$<_B&!mejC1kOs1RkmJVoM3RPGzyB zgiNyw)+;6iK(VC+iY+BjY$<^$oJh<^GKDC%l)y@r#g-B>KT|PXY$<_aO9>QPN}$+M z0>zdR$nPJ_|5rt^rG(rECo$v2mJ%qolt8hi1d1&s@Ey%3wv>>?mJ%qolt8hi1d1&s zP;4oIbMs97VoM2GY$<_aO9>QPN}$+M0>zdRD7KV9v84oxEhSKFDS-)o%ma!oB~WZB zfnrMuoTlkwO9@$QDS={32^3pOpx9CZ#g-B%wv<4zr38vCCGb71Pi!e6i!CKkY$<_a zO9>QPN}$+M0>zdR*g}pHD7KWqYg86nO32?-S!^jGKc}+TQbHD6N}$+M0>zdRD7KV9 zv84oxEhSKFDS={33G8f3IS3a+_GdrELlhf1?=e?}>jdG)=NHP@eFw_FA@X{}c)r_x zsP#?v&+anU*_WNbu8$WmHjpLYI^jonOJDjo2EXZKt`xt-GwA!bzg{qw+GIZ z9jWY<9f@bI>?pxDx(XijDqK!ZXvdT+3cyV!N{kIUY>hJo!qjY5F>w-QK1$ zZb<1zPJ-z#Sp5k9fA24N9}L`p?nq0rlxj6eKftu9?8H*WQn&XK{1PXsObA0-Hp@0H zgot#Td6gQ9n7rrt;OJ9>B`64tk)`(>vg8-g@X}8+ANnBXMV;oo)m6>sT-Iy*Dg?#E+nXPj;I zf0#DjNQq<{_QaoHq*U^D42QqJkxG(tC`~j{@8r#_Ws;HlCb``HZZbG@-pdvn|zs9no06m z#(&^kk;;-^V*kFgL8ReHp-3LOPb6z(X@nqOY{g%#Q&Zg0r5I(>LurAv#w-1 z$0TYOrCJe@;68@e4a~@&$7Q@mabKvXCj6zio}K8Ky>-%jHUmQ`k1n+Oi;IagtbL=@ zRQfm`rh~O?Nt*9r;4g1ZaHx8xlPr6vre@QpF!NN8yGtWWD&E1!(zH7%-N@7XLyfD*%|3)*vaEGb5(j8#VU`-ghrNP zE4{?~oMfJz=9vlpl4qnCSx#ovXL~%^#K@BK6a3|K$Sy{fq8#vf?{EyEPb16MnEwLr z*OD$qmK^OoQI+uBc2u+1O5~k{NZ~K#0+4VShqE*NCw8t-4k77cT;<7Mn$f3`CEMu{ z9Dx6O{Rsa?pf%wysZI#~l5wo&P^ceV z1W!g8wtgs!4B#)>fiSwjNlb{#FtR)ivKU#mvcpXtWezJ25^;r-;07;TQvE<*`jC@pb$Udjca%o;_|ap5B-=OvF0KXtY0P zFX9o6m=`4eNBE!kJ^pcS*?I98GPwDkykCxG!X6{>1oRj5F;UPrNglhPA7ijL$p%XO zhoA(#IrIp!h~ImU1^7P%-Axq?NS=?hf`N=-{-@FLfIddRA5PwFp&KkrwNB2-x0~5|=Sh&=kI)?3Cl^ERE zbhhIj#(F&v(>(&xZka(m1cQB!5J{{ffRmTXrouk-veunS8mX~ctwO#SD@wv%y-8X7p#<`-CtfWYsr-fS7(j|QA;Ip53`sSu#ZetI2a;}iC ztwNpTYv&O$4>%qkP9&b^JGD*4{KwQ5erKrSXhqB09-;CvinA0KD7GkmLGg=9C$h6n~=lE5&V!e^D&J z3B&w*DGpOSN^z#*Tt(6e%zwV(e=2@kakJtJimxg5!3oE5!xRryJ zEB-+7DaGF^zN1J_jI4(q&xk`6sfOkm2r6iXGk3K!$2E1sZOt9X{;Rf-!F?^JwH@t2CP zDZZna&o5=DKdo4%I8Je@;_-@e6`K@4ueeU}CdL0${J!GTivOedJH;Njp|br$6pvNB zSn(RgZHn(G=HnvHa`c)+9H6+r;=zhD6i-!Ls(1krb91%gEgJu<;@Lbukj{HF={VdX zM8>dn&G+*4p?npddynGAzUuOe;RqZ42c`aCZ9oD0Leha*iw>v9azZtAt`z_Du z)gCm1GoA}xcuK2VhJ5+XtSz|yj|?)cTMEGaIwjYcb#AlQbp)B!ZBAxwM;_v39a_|# zKX+bR(0p+luFw60Dc5zd{O>>b;K2M&<%7(1u#vs4!^k!+g0QECHn0r!Nb|dR<^}%)ba?nnI zK7%Z3H*tQ?AhW8?T{*9f^#<WwOf5>4#s3dI#trTC+gc9W!kgoo8z3+ z{)-PjC}Mpj=yz|{xw5srqTt_|ai{cPP* zm~GusRMNTyL>-8`liJ_J{&C-(DX6b?ZAZ!awH*(WW6ypWw#5x?0el*B{~n0NF(30Y z@27mc4=ZUn8_t8yPUv$PLf_C?GlYKXfEhNv8269gemKs|Ctdmv7_!|mzI=1R1qC6% zwFOV2Mv&D;+@JC`R*qQD5cIDiOGMB=f~-o=AIgM0|98j=f_@2$#R>Ynp#}4iInNOE zZzFSFHw3+D!RLM267+ecN#1tzLW2H6N)bWdkD?*yzlhsso+ao)qf)GqNE;e=s`~67*kXMIk}Yz62kN zpiiQGsxky2K~EKyASCElQwj-sQ920;`uA8ahoBF>XId}> zeenG_K_C3U^mB5O3YI}g(9?HwkVDW1kC|F3llO8wLW2H$mJ12`A?#U5&@Z7B5%ljs z+y#RE4%Gk8MbPu19m+vZrElS`M+E(O9Hoe$UlbP;Y5E8bQ&Z^!ST-W)Kf@{`f}Yf2 z5E1l;F>^%F-@}272>Mf)8WHr>OpOToGuUoK&~IWx5kW7`=p%xj&wxQh&@W}#h@fA@ z)QF(xnHj_g`g2)zjG(7EZ4e{qse}~72zpX}!S)1wPwq~Ppr__VDkyN%a%qhS`hD4a zM9}{)#T^jz6VSWjV5pnsyHyYo^fU<#B7%N6JG}#fejKvH!1!-?pnoQS7vxi!KO*RV z$jT#vp6`=EM9@FT%n?BkCL7nOkf3j4YDCZvVA+VEAH|v@f*v0QoFF3TsoWAo1pO*j z6(i{BnL3CO^b?pKBj~SVPhtf9k6B%epkKrE7(u_9=`n(ygnqCig8r+>u&V@p058bb zvcnNU{{q|pumnA(YCoQT--5*{;m*1&ScEnyC<$vco=G>znbb^ruJp>VV5 z)Sw?xXq9ZIqLd-&hfrl92ub=akUqIJe;XIWT5#dQirU7-73Jj>3ma=I=GWC#)a<|y z^6oJ^FgskhY+n7xK=(T!0P&h^N&0#94dB{wK*ZrJHZeEEZV{Up?&_uIG}pJ7ZLZ8^ zw(#JI5|~tfcHHs)xzo!p9X)34{{D*cisMI&_W#={_rH5Vx&K38^Yqnc)Q`^k$@0e4 z6{9PT^7p_Jz&BmcfVF|=U+SN`s$v|teEuuXj;-)BKljgk2+IZg=ag4ej2ky*)adMf zqmWuu4)s#M=_Y^vOq)0GZ@eM4Y|xAA)t(~FPv@%WXHdDZM3AJ-XB+s|BUYU7brZK}K1AJ`2a z#2-=P;2*4M@CoV{(ATsoH5gaB)=jZ>65Pq9vGHDP9axiLjodIByJB&?3|rtPu2rYr zv%Bz2EWWpm?`h*gTP8zSZkO4wnuW$Yc#gO0kh&Fz;=5*%EnbA7;UV_K^m1%w3P1RV z&dWcfhCp3Y^Esdk&c*KTTuH##iNg~)9fVU|=EE6To0GNrlQgxCJ4WBVYqwlkE9_-A zbT!_zaGt7xh|6~CMLOZ8O$vKYt%T~|YAB)04_sRn7 zryO2xVA)2QI-lBaL(l6I(i@21Yj8`J&{=Qb$B3AQ6!NUN74gz$B*KL4=L$Cw!@w4?kh*TWv!HrV>CY%w1HkJ2wlg*zDU&EH4A!0tEE zcY290ZyU#PBv;SCYY_DhN{wjZ@E`nE7?^*2D4F9hxszPkNempMbTw| ze1yu!D9%z`pxC1L1x22xtmihxZz?{j_>|&{iu}mV{M!`YRqTcRVf+w9(Pe-vx(q>Kz@57 z&Q%m$2FRkz02EyYpy)CHH)}r8Wq>TY3_#Ik0E#XH@K9W2Sg+_Z07aJpD7p;5b2MFa z86b-;15k7sfTGI)6kP_O=rRCBmjNic3_#Ik0E#XHP;?o9qRRl}oMAsimjNic3_#Ik z0E#XHP;?o9qRRjjT?U}&G5|%F0Vui*z}vN6(Pe=ALzP9B0kY^a07aJpD7p+l(PaRN zE(1_>8Gxe802EyYpy)CHMVA36x(qXIFI_>X&>7-G&1uPMVaFuyfspdHvA|+&ae#7+dyjuw{R@ z`DXaqR$KNe!>K2-|Irb^m$yIn(f0f)^VK4sv zcS>3@C8@XIJVfrC<(!SsiGaRA$~ghL4D+@!9rx=ZraMk6e1l)Pb(`9{OPu7N*XBCs zhxNgqcl*4yo9RlRD3L*5va6tPa8rk$o!7?toa{Q`>R~J2PQTvLc8O^_HMgd%2l#&G zbEjO?-uA%KK7>sn99_)IhoZR!ITR-ULe;W3)_wy{adH%_^nQB>z1)>d+y;| zS$9zK#g5)r-`wF&d89qqcu`v-`=yQ`b7Keh(QkgV9p5R7TxU<{c3dGk3&S86WUpxB z7`jf+c05C3^k=shOj*;G$lRF5WvV~0WAm7sp?ffM%UtA7wcUs{mDhEo+E&4bz?ydE z53(1bpBKG~sn*|1&1%Qv&B$9H!FZzmQF~(lGOg`B$E@CR#gEM0}TOFO=TbWS16)i7-Dvmx@$;K$uJ1d;oO|L=V^Ky!rJ z9nc(^g!3ity&-Sk)KR_mbbGo}kYIhxBcFJ0P-hM*#(c~(HRinmPf0O{5UA2tI8+zW z)*4D>VR6jZvh5U0)M6tx%6~z+Xm&?2{;%D3&Yua&=Pq3YFw$&-DdAyMl$tT(Q z2}VjKNlAPA8>uAeQ<`X`-pMbpmPtnHo20u7?*JnWNZ!d>4m486cz!s}#UXON!;%?} zW{zTs7b%v!$4Vo`5;|<~cA{7^A1$wUy%WvIhKeNzv8Izv7Xoo`;Dw4M?2GrI6ifJ) zobc+C2eM?SSi+|OZ@#txa_u_E{+HNrq*&4q;v7#DOT4&ZiFb#Vqhg77rx6lK(claf zOOE6?<|vkUp<)RcKJQ*ru5XemI9{k&@?{>4P_g8F%mOb`EMfmb#S)sHdpU|FUXEgk zm!nwX{lK(0IXRx~g^DFNu%9`KC0?jlazER9+?1P<L2XP^MhtxiLA!+Ls%7BYenoXd44z( z8J)m;Dt!kwyonww!Sy5kS&mYqSRyYpR!pRS=EhP}>HS&uU@cpcp2#{P#gaj+>QGJ1 zrl&A-q*!t`4}YbmPD-D`)JU=97aZnDvE(wgJ6$tZrrX$1q*!txtBMp$hO+E&nz<@{ zEz3rVB^^wS6iaw!dNIY4|6tWI#gb**iI`$ZJ!^|8mQ1I-yX3*y-*SOMRvsyqP)E{>6ie=B=2Jq?53g_lPSw$#mi`q}BgK-*EE_47j9|@? zVu^f)i4;rz!cmA6OKMqFOtA#o)Q%TZERmP-T4`B4KhQCf7gH?hV0AIYl3SS`Q!Hs^ zdQ7o|A3wbvD3$~pkzrRAOFSr+$XAR=u|z(m>_oAIj|DlNA23z>@m$4W62+2RI4HZP zSi(t$OGNjc9|CGgx%qo-z~lTTv@_g&4r_!n?q_;@o%9g&#eH7IAiWnRtow5n6X_S2 z`U@3PX)YHA$2Dx&D=kSM&&)5V*gHLt;)^QwP47YRB^3vxpT^O4Usf@bUdXC`rDB=0 z*H-kAYDy(;N06S52Hf8Sd^A2U{zWK~Q;B$DSL_GezmXebcEyx0ia7Hnb1M^C19NtOX69+Zdpp{or?1DRM zFl{8=-=+?ybkgA0S>x+Qnl<>V+|M^sQ<-JX;Hk{=rb?M6ru{DU3L>2$2jc0|{W@bl zQ{?jLk&mCY;RA}K;Zq0UJF4RzP{cc}d*Vr@uKhOWCO4PAg99bP0oI(}%&xsH2; z5oQf-oVUVpk1XPGK^NX8Of#kC48Dc^I?CicdGHU}&RkBIq79)h#i~JXUK5b12l> z!M1AcU<*97(e}YWVJagA4|uQkbE#f)c6s^C?EHuQ!g7E4bo_^|&P;#BbUzJso#JwT zUW4Czy1%%5jNfB=g}=Mb1S4SQNiCm@%3 zm-?3k7w27+zqVja!hEZjTvuZblFq9(16sXwN#i0A3p}aCUjnxOAA4T{UsZLjf6hHO zAr}afQbj~XM2rH8V+bK36i8x11Y3(JC^&1iYHih6YsI0heYUnL zwNAC#I&`pgc&!b_SXTYK%ZPcE52u=YL9@0WaM?P2ZVjQ6Z>uf?rB zf{^{C$NVVaC(B8Q;YV~y^#O^aY+3y(udcrGT;)`ReX6Z1$#ne3ItC?o*d6m4+9Y zy|mjpJmIBBt-@srJ7(*#+be6TYCXf$GL$d6Z!wYJy9gy=rvxV<7F^pCu)~lNYjMe& z8^>NEJn>@X*xC;BS+ud1!@`_DwppDp=niRWnD#W11@M>re#%)HSl**#q&`}Wjd4w9A@QM z)yPetQJOKsYu7VMczhkriG#-*lJreZUU<|#>Zn80qj4u5lb$@GWI{=LG{Q+#mN!(6 zNsm6Nc6sH(+Q#~d%KG!tN1l8_dQv7c<($dmCyw!sq_tQK+;Fdk-5g|3TQui{)i9SN{?k5}U8Etqi%hR5>5oxeBczhpVIlSn3 zqg0kx8th+Tcd*ZmWx0*TAIsb9j>=_F#@4~E=zBSmV0UL{m8-z3sJun65;j{do8RKlmjcOug4X7g&15bfVc=(GLnjNimXp=qlOX!UK%(l-wJ zFg4OYm|w&GS$-3bAGejz_crF)Zq&!W+ZAp4N#GB)$6LAw1#qs^*>abnTz7a&ccI+F zwi3{egD5ZDn)ecJ1wTR}C@J98m~n7ioI87tV%Pf;90`4wJGxnYR<;;T|1fw8HWWIZw&E(Gw2Nq^X_P+3&LN1uyIIr}_#EpF-k7P)SZx6P|^V4pu|5YmhDMxZQ zqVTo)C|?UWhUvf(#lsYjQ9MC$kz%!CgW}bSJg(Gpr{V*OPbfaG_?lv?;!Z{3YoUHW z&I7PWu~<>QA|qY+T0r4z0fnyx6uuVlPA&g{;^T@hDhgi<<#wtppBNzvUkf+@bHw(A zuLTra22l7~z@?fmd@abr*8&P(3;3Ys3ttPe@U?)#*8&P(3n*VYfx_1U3SSE-d@Z2x zwSdCc0t#OXD10rT@U?)#*8&P(3n+XopzyVT!|{OQc!aM76uuTv_*y{WYXN!Au$+7% z2BuXOz7}NRYXQZ)0TjL#Q21Iv;cEefuLTso7Et(FK;dfvzo&YIuLZe9W#MZ<7QPlx z_*y{WYXOC?1r)v(Q21Iv;cEefuLTso7Et(FK;dfvg|7t^z7|mUT0r4z0fnyx6uuTv z_*y{WYXOC?1r)v(Q21Iv;cEefuLTso7Et(FK;dfvg|7t^z7|mUT0r4z0fnyx6uuTv z_*y{WYXOC?1r)v(@NamT;PHy%K}qbVI9yTO`67Lm$|owGt++<A@gkF#L1cI zQ!|-KGt%iP{HOmXW-?Q!mZa0ur%b|sZe8=v-sj5?4kh~n8v;1o{k)w=gJ-prerUiu z+X#Oy;GG4t3{Q!^TF_O*O1Ytx{$on9p94QG@UsKHjfs~+e=lBL(~c97w>|UHj$r!z zJJRq+vpw^aKM99#S0R6#qO&8@^U7 zw_gk19S4oepr4qJ@54tgFL1mKqj{deH3{P`th2U zVg9|?XB*uA4fl0!Df2HEd9NegYr3R$d+AeBE(dAZTsb+M__q`s!Zh1!zK-*_!(YmI zZ`zTMI&$37O*@u??+4w#Wu5)pC_E=WJpVZnhdGuTl{Cz$2si48yqSEZdX~389wX&9 z{T;UzZnN>{uf;#hZ{m-a9)`_yAg9XeSaV_g# zju(RXsL|NXiwAr=2>QJW0p2d~FSqv*=q2Bc7|zCL?jcNpjW8eIkOL(y#gm_bLMtVb zTohrYyd+=2tR$qSVBFE7gWhtQ(NOIN+GG~i`3#sO=D280?kM`n>1Pq z<}e8pfCmYrqbUUpXVae*kL55R#*(+NZ}W_}8NowlpxkrFlrbWl%|^(t<4?lb$jqL? zBr2BJKq0BAg^EtQMDh|z_9Zx-6Qtp6s5ikgw&?OkBDT$*%&Qzl6ZP~ z!Lz2`{N#4l3rS6j+4}RN@m|1iHgxh5{P=Mh!xAq(4i(`oXBxEntlp2K>qpV@ls=CA z_%Bh6q$b7<>ASpbVT!i!C$Qh2H4uja|NC+V{O8f6(JOmw2KnSa_2rznc9Hs7BqTV- z@VX6h>D9v3sW zpjoMV*sdcr1r(3h+_@?Gm_az32c_t zctuJ$n}<1ub7Q>NB%IBsIEeFN&!D)3vpJ92HpKX=Bw#q3vngK?dr9&ooDF9?=U5IW zkVr%W8c~*`mT)$514#Hx!_}EOgY7s{)4{CP%Qv&nFduBEPkaLY57>@>qtQDFXLCCX zj_{dAHUB|1BUS8?;%SC(HqS{e!r5?#e{$D|(Zvj^V;4$KmZZwr z?XzNhbj3!5;cSdpmpYKD$~1R<>Kv+C8tWxfi*PoL)KwlEBr?L;9K!qvsp)5|ULn;b zoK1rAa+MLz<|)dRDkGfDlRVT_DkGfDPbjZY8HE!Z1TRLJwu8KQ3krbL#14eX2xoIh zR7N+58lf zcn||zA)F1{^b%jf|F9ymVuGjT(c{4|`^(-g}O1 zI%t1Scs2G{uXU2MvKD@CaEvX*2FD_#*kC^-*5Ih}%PR^a7570@!NkAp`Bk6Dd@(5a z`SHgEeI^9G9uCe0i>BvM7eDExWxaVu7gkHy>P%B0x~-FWWI$uA@qW^1q| zeo4;7JvQgg%^%J00^FF-2ictbysP|6Vi$89WAG;<@t((-NPZP9=lm=HUJO5^sDxtp zSQ{3`Wa!3|)o$J8$g~qjr`8ZXcAo&#!I{xDgJNYZ-FC0Z>GeeOx8LmxU|ZdES#)?wO&NuiFb%FZoc-3Sjq$Ru3{?2vWBc&VzZ zZD6_f7$s}KgfL~vB(XOML!rRwfoo`0+3IpqIQE1*@U#$I#v{#cHm?>5 z(f;uZ7W+kg{HSR4ZNa{+gI({>(3j?pZZ>ZddVKU)km8w>+tw-OQFz@ z?I0mDkAJr-0%Us&if9k98_RIJ2Y)!Ebt2&3P<-X@4i{u5%JB!a-K;)h^wg||-J72h zX%6X(3ql_@?2Fy3J}X;{rvIzBAm0u5RUQ;c( z7C(nsK6p?_0to```%;6xH#8W(i1uB;*dxjBn29lv_rbX#f8;43{qqdOa06;Uf4<^36rWIhUGaB{e^pH2dBJ)I zDl*PFW%?r~a{U_dZN>K#d%z&f^pxUA#mS1Z6;D!Js#vSILGen(FDTxt_^{%$imxb= z>&SNBS4`jpraVxwSn&wOxr(PMRw+s-an!q75#_H{yh+o={}1Ym-yh&AULPojTbvie%MWf{BJ){8 znfE{DV;b9!ZPZXvUQ-p)Fw$M|Fs4l@DIp7^J3Nd(;r@%Q4G$yV8~>Yl^LTI*V84G1 z_Iq#v;^|x9*QRMlB4fA~@#b6JBp+cYxCT^^r*-HvD8aI}9Llh4Ld)*A^Y24DKToWo z>bFGA`Lynmx9y(-h1PzbNQ$*q?f!Ym(Wq|ox^LUR4Yg?7--bRr z+y4D*XL6AlNAhLn@s|-sl}J9s?uE8}+Gm|@e?FyYrey!*rPLDI_W#Pf878kV$;c>K zw*9xzfY|o&j?}SjpHI7pZ9nZp?83Hx7g`qEzRYZB+n>hnooYH1Pp+n-(6-OM?4E5u z4sEpU|ClvH+kO?bX503!W5dq2&!ywLVcS25Dnr{oT}^ak+y6AX@)a|{fyqBn3T^v8 z=g|ml`$tm>ZTp+pztFb-1l!vK+x`#PUTE9Dmi_F&wol%Tv+dI!=4|_KQwnYSCG4lO z?eB!x4cq<~q5q?0+dmsU65IagIdo^+XXu;IdLK`fMa4vF9p}PY{_|3kSl8M158-?} z+y0@f>umcoS=ib3zs8Alw*C3cb+-K?<~rN{c(&_o`}P zZC{8Y&bH4hGiuxaI8{e%`x`ijh;9Gx%#YaicTnEdwx8s1BDVb%P$RZ|xdAxaK7ScR zZ2NR=(3x$2I9e0i{y(VS+4c`*J!jibv(uf}_Wz7lqqhC|Ebnaly(l`{zWC5`w*7mU z>umd5I09$ef0DV*w%@{BXWJ*Sy<^)xf7V58`)jExV%tw}kP+Mdc;-iJ`%BnX#J100 zi&5MDvCNOy_K#tH#J0bfa%Z;vDiqiq+y0I0u(R#o!1njVw$E$T+V*ecp!bn&KiG;6 z=Z^g^yzS@3?$I^0tG|T&?!^%-^OaMKw;J;6u-=R)^itvvVoz%zIEXyO9A(nY4 zMa3D?z)7Zo8K!}RHZVKVz){jbx;L~s)4nVV@m3;jziGd6JY7i_%L3hEOEd7Q%nzv# zWZ8#lv%G#qRw$f<{h;T(SA+bEf}T|?V+okz`Hj0HpA|dGnE8N)akHpUygjsU4c~ocMp@a4n#Kwk zm-Wn|gMz&qoo3(1r0LL-u2<*YFr|n77(Nh{#oqdiiT|Tuh<7d<_M718<6(K_vc?r< zb&bnv%GXpjcoSS&`G*&8Ci=Y|LCL42-E6sR8+-z`qYMVgarD3+$BQ>M?_~Vh zI@tBzNqXLukp#P&ZG)c<+Y;+jAJOVthJ9NHyWV=(^h>#;o1N!u8~iNjOQQ_+^}?Uk zw~GxP`Z%X{vu)KPAu-97#yM4I(+|Qo>+aa#r=i@#wi3|lBbs+9leru=!%`&D27dtl z*j0{;b7#+G?0Vn8Nq;DJbhG-bY%!YtVc6h#Zn(|&aQH(014qsLlCVIucN|~a+JUe$ z!otYsk#$=jGZU3LV{QvzW#`;+W1F-|V|v4lc_Tx~%yR}Z%ksU~*s$%x%D6+&XDLj| z=ek#*NZgm`>u(x53UMA$XAH-GuFAZ=yR_+Is5qr1*25S@_KUF}4pZd4hVlZ%vlOcp zH!Jd2I?M6LKXIF)*mNO3q4JB0uPL@F{$4SG!^Qdo6h|tGO&956(*=r67brGepxAVQ zV$%g~(|QjoKBXu&UF3^R7brGepxAVQV$%hRO&2IOU7*->fnw7IicJ?NHeI0Dbb(^i z1&U1o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>o;33ly6!P;9zD zvFQTErVA9CE>LW`K(Xlp#ik1sn=Vjnx!2a6q_zkY`Q?P=>q?lFz3f#6vamX z();5k&htiWy140&pbV_m^ahpJDRR99%b&~Z1LgYjI>hsz?>m&`egK)zDavwR!9R<< zzcC&D1}j%NlWmta+liTpQzmuOW~(0y+SqJ&o`|*cSpPl;_E%YNJqzot@5lQ2I;?5m z*wlh9VeR}in68C8j>bOMy!(0m_#qRkjQX|Uel=+HHC#)6T8rm32Sc!K9%Jg|d#AQs z1B9vl2ROTUc<{hzZW)ll+W5@Ht#e@4-Fc#}Nk{&Bh{sXTOg(3}U@d>kjVQnUv6psi zIQ+Sm9K`Pk4sF^o0)Jey4*i4tWMK>DbkN4hjCpd}jx@^04!fcSYxZ~8_2?WI$Mgis zagBQt_UK%!ALm;4gJ6I5y}Fi1P*2wEW4(S3_U*d-ag*Dw%jdWY($~Yb{UpZOB<*-u zXCL=AxBd`o(YenYzk3)K8s+)6`Ry0#zkh!XPuDAJZTr%N&;Wpdr zeZ-%!egfD>*#BEH1)DKv&xLcg5p!gZPaXC-N1U_hJYB_e0rQk>+SL4LqX`b=a_cwWusSa4i(5PRnc#G+xH*wV`8 zoXjR1uO{i^aMa=aO`%R)heLrJXZH1gYaYkH$sd4zvHYD{&d-_)mK&*M&K8}RX>9xb zH!!*kRv+hhg#HH$q!5iJ-$kPtK!*)Melp3VeaP!TFdMe2lnydHB4UK$A+c?GX%`Rh zJ+CMUzD-~3WJj}U8}r76(HYq`Zq6ueS%cslyi4qx^>`HG(Sj|GRy=QGoc}#UhKuyUA9)u=z#lmtH7tK*I8<5w2m;>R0WmPXA;i4d0e{5Qir<13EPn(6 zZ%&3@7x3nEO2ZeSN#T$D7s>|4H^c%QxM0+1ze;LXuY8quk5h#}CyfH%KlpC=Vb&%NYLY$xQ8 z6j4pcAGsAHaRG1s$UaOp^$L=&QJQ9?{>f@;3Hc+>@i2w_kxFW5>l-42W+DM^qP`(w z&NsxfRO);~tYzQ2;E!+xs|37}nGN|PT*K`G-aJl4A%BE@iS3qe2(I#Hz?;FW8S+PP z^KKLH<}%0uqb|i9e}ums!hkp5=M2&%NWIrVz?(H}Amon}a30(EhKSuqP7k~VB)`GN zL;lF&tQYb}HuGqN{E?rsM#vvo#{Px;k*UmU!yk!#$FyL4L&VznhHwFIQfx2ekDSVW zw&9P&o;F(Mn7~NS7Rk9cKY1PNg}x!qWa}Y+pK3(-OP3T5nh=Hc(V~8 zz9H69b%Z}MhZ7Ltj~qj75&p%=!i zF?uHfZ*J#wIsV8KRO9#~KVfbs{E=D~SKkl}coT4tjz98ER(Jdn`sqNxn|DbE z7IyrRUvL5(e`FhT9e?Ch)^+@mBsI774G}wAyfMT^)TKy#L%-X`BNtIu zgg+v2c_RFg``D8Rf8+_Oi};4%sx}0?q55D1d_#Pi`4Rre6_h*UkKBR+-Q|xk;LSVi zu;Y)!Def+RgaL1Ot>Q3=Z-}!vDf@~)!k2@bpPhjJaUYWf_DFx6kUiH-MoRDiTJE`p zE=GcUrru3=K*2K@RL`$UftB37UkW^p+C9H6yH~N=)6^NesfLo(S&`hGx7b%t`2P82>Le!3kC$DGT(4!W+3hLyaGIuGGkVj~77Kg*J1 zO(YZz4ww_c&f+ zId+&OzBznva1mZI{go)=pYInTog3FqS_aKJVbBXAF4l)f+R(33*g)q({^>&>X0Z!ISTd}}^EZ+cR%+fPDxA9pR@dzpt*?d%huv=c&+D8lz#dPNdj7ciX+x=2)}0s8hy!Q|M{})pEZ)i zpL2Za_u^5~?{g&ZqkqaM={WLOaiMqcsc1VEy7E|s#$uklU4CR-c@#IC*U*tOkUen5 zv1bFLhl{eSC1Xo3;lTDJj1?t{lM|D^|0HpwtTH|1tQT7%r5Q> zsEn)lZ=Q{%bMcf*zr0}FIJoWz4!Lz)aECuH_~wSHU@F{pFgi}=mHA)^1@C+F5}#c0 z=vV~F8Cx9OwqYJzh0F^MNUUYhoTxyIL5{)n2;DT zv3T74;zUtqT<|I?{@$zlPH^`HRmY<|im}4{@xicp!3sJLIS^5NP-4Yvh^&LGM>6B) zPYqf(%-d8M{MwrbKO*Diy;3}W(pa*Wo<}lwU-POqjV}(~@otSe7s=){jpV>}Z|2XQ!#fi;5`R$Y&%VdC2|01Ix%LIDo;}YSO4{HvN8eX$M zh6LGXUHRr|3POu+_SYuGPFPLdjK8x743>WZ8H#72PD{rjb{f`}83zm>Jit!G&IYXw zbqJC(8OLaK`3eMw*(+gp;FKJcD(FPqofRvW)1yS^{zKMPSJqTi;(9Dw#_PAit1dsc z622(BvKq^wlJGsYzmvof#olr;(kNXtAz=2{(a2hG2pNz_XjSMZlxi#;Oa*43eU23` zjH((8vrDGba)gjt>#be6rjpZ%CAXEr-rKYLsoV~WjYWfzR`mKT>%g0do%V@5LN$n( zv&v0SljS@r(Lg(pSJreIRR<*)g=Xa^xnkMO4MI8LN|51|HAoT)RdB=%^VFRP zI~{Vjc9XP)cFRq>?KwgT*;|HqCG){!Vq#}SJ)u}$Vb=~(mN%|hhTv9>^$1vnL1P+L z)YhMea9Uji(m_vgV#wvi@II@jmXwzd?sKB*LP4#SocOQ%r;urUL#(>MT+>9Ov9cA_h)H(Tt3FT`MWno$4TJXNQzqRK>CHhFT56W!*)=hYyT#sh@ z;}36?9?RiPcNZTj->?dh$BkvVjm00!<4sAnj>_>_Z|kri%e@y#u)DLf%H4|}Q+yk+ zn=N-Z67Vt|ZUw{P8vs8?I1W?^$C1t7`WW~i{B3VHt8W1kqWY>oX2wN*9G{(+W!SfM zu2zF zN?T<>t8Y`5zMG(rhBfvNChxF+H(;N2c>K6cfxd?@&vs)T|87^b>3_gSRocbv#xmUQ z!5_|*IuY>iV4RRctpK#;$Rx7o6tm}`+{4__&6XoZ4yRX#3*j*&lD~yRE#u(0cr2p& zGDV)Z0%>-$`mAg*n*L$%x1#3^XM@Lfu05$BGoSCyW;6NcM`W8r+!uVVKH32LKz^2e zpJy`XnfD>PQO0Q%Zj||X&Tf>W=LqGaY$lL0zlzw6@?t9hDVO8V{+3X_nE9PIvfLYq z_bB^<5;`iu>kocUSpOx+$D4ymSW~_VtXs0q;kE=m+E#Oq?>BfgSyR_oUny}a^;gI% zXqWy<(l|ke;G&req`#8oMEECJgp;xm>FbFocLfpY+f?SsDE>@gS@o%_Z zErx4oJ&^uLc#J9Y-qs~|4F_om%K>>WA(ki}rZ`)X_dVvHrC6=FS@Ckkn-#YyeoOHQ z#TOM{Q*2e_cMj?o?iz3a=7;h~Md7YN-tUjZ%!^n{FdxEQ0}6KyxZfX%nVb2!RsW38$PkO;y^{=t|5Jb$}<$_C}zjIsnYbdiWezfqj;<0eTok&ic<)*^K+Ho zRQ#hNUuM|9e8ob=Llmbg9;5gP#YQ6Th36@LPSd}v_<-VLiq9+lQ4tIqX}1U74XG!o z*hg_Z5&fE>^2ZfV()2RL8bw(!2|c(KxADs|Q{`Diy=TD*dOjH7q<~P^} zk%o~hK%`m1oS!o%x5ozVgGj?bZb5oJq}&$d1Vzm75?A5hXYtpQI|#C3YQ=wu(jd}2 z&LSYvEQMZ2q^YJfybO6lq{*c?;tQ;Q3EoyhBFzZCy7YS!>G8ivUwY32d>wxz()Ai$o=vTEyC*ZqO6IBhs8pEg_NSH_Qu(G`CQTBhr*0 zb10e-BF$)Oo5Lg;^dNY#qbW&{l@u!;%V9{66|Vn}%`+l{tjs~Vmys!BM39xsAzzI@ zA=1dqp28$59?R~XYPudz-bzKMT`PHsB>NIOofD)%R;V{YfA^$asd5HcVN&m(;NQFW zBax;jYgRFZZQ%X14UvW?RIrf^*YYIoU4+r3u@e$$v|=Yjnv>YTJ*>zeE2k3gHIfOk z61z{>3OE|ygknde8OM6x;M_3C%J0}M1Z_%*HAS-q3-$OTxG&=cP)_eGV zkxY=4*mq0|mPljzY=W#fB2B=0Pdq5~W*M@~lMDh88)1U1#GW=<<|JQbdm)i#9qav| zNcvft{40C*{A4^_7-Z!vN75Z^>{V4XM2=gL;Jj7pueiCU$ zL+D%EwlGCon2}TZvqqozV*KyR8IVXFM(-Q|d5{NX@ zS=SM1GAukh#^Ex^3cXZBh%~d9dra&RsXH?@kGaRi%q?hEs*>$GBF&?0=y=VYo06kA zKlZrPouB$|7Is9MT8gDH9uo#xSwhYAu}@3kB`IE+Aky%P6e3L{RiBHFQGPC#lHYje z#eRz75@e->+BU?F#uNq&vT_jR3u3>Ld-HWAT&_la|C-nnapy%snl} zTRDTQJVbOvn#Y-YMl4^Zw=|VxOJ~Neke)0_9mH;*6?<{I{-LaIxUl_%NCa+MKeg>J?`q@j8t((oY* zB8`y|WaUcAD^z|8K~^{jUW_tr2(of33V=w%4ur`FvN9zqBgo2Gkav7r= zeTMDV#ny<3AS>MAjZ4%c$O=zM9s-pI@;cf{B8{xEs*b&mNj&JY9P~Lcw&^9lhW}wt z5M+f{kKd1%H%=O6B32U`9mKOY46^d7q<{Ya-bAGX-Gc0=pQ(lx=tQK-^u=gMHCjIJLH}WrXNPX zFO?cEE(4Lfh$V~{ml2|8vC%U^^qgY!j8Hv8g`Ybtkj8!QQ=C}uEdJk5w5X|Ew|eEW zV*FJ^9joAzS?vd7T7*oB!T#|GkW!VIyLpqiQjzbWQC}+jy=FHa+d27hxJ$Xp=RP+g zf5U}5gC+R|{3eN01>0RbJMd>d6V~E8;3<&IZ#gMYi2tT2PBh(k`q-^Yrh(ccVbF$^ z7glLnyh^4cPQsc>Sbb|M&h!2~s0JPL3(EE?uVAmT34}%fbLI*dI6J2iIJQ8C9#@RV z>avP+*TSF-vQW*6tk@#;IIc=ZD65IY?bu^tz}^WvVn_te?%$EAKJ2F0<-2y5vb=n4 zc{>((y?8!kyZZ+wGw_DhZt#*Uo4vbJd?2g+9vJL-2Dh=)^TaNzYOEm*gWM5e5{LoA z*#2>F5T0da!*aT6LV@zt!T~WR4&= z*}DmY;Hx3W!S_Lqm;K7Nz2Aqg8+|__O-5ZSRjj-*a}5C`Wz#yIm0=+ZNahr&|GN+r0<- zIH&4t)^|~Es1+jRvTg6bM7f9CDM!8L<;Y|v4)nZPNK8TGc-U1U$7;`I?0R!?zD(tg zZnl3`wir$SFl_HUH{51?r<8^X(cW-8ZAUn#sN(3Z{5X?Ej0j=&%D_&&@0Lx6T; zzBNL)a38c@^R3pI!6l`QLED_mg*fQ5pn}LT(_ad&?Gqz!JqH6pv9n zLGd)jYDHd$tar5{&wI*uDn6k2gyQpxVrxb@u{8sCYWn+%{cy;rr%16_QNHjXT^8v9 z)~m+@N@s;;o8bReV(O1;y7D|Df0h4=1*NgyI6lEsEDEime&t#MTUy*cZUQxM9<# zIY4nL5$Up&2uR1Ylvil}D#Z<&e!1f36hFc10{ZxTiM|OVcW&F3f~zmw3&M8&$QB3in}7rWlbpE6h!TB-Jhaxbj@|J2n6THeCjcfsfDw$sDncywt1RZ!LFty@OqjbbG!55&{ z8C1VSX*hc)2Gze)v++!@7Pr>Wpn3rBv&J(4SD>k9f^T4#2GyM$Py3z;W-)7Qk?2n( zzl;i2%99m(R_eZIf|sC!2GthooMbe6#>5pGRQs}>(4cxJJ0BWUw_=FSGr>Aa(~Oq> z$^T$)ryFTt@=fN22Gz@{#Tit`Ad^q|u00b3tmr%woWZ_z;hBI|QZcB?%!Zx`irBr- zpn5wMg`Nr6m)-MB@CP(PgK8dYcJ7&gRKbX60-D`JgKF2F2^O(|&@;i&oQ@7W6MUP; z^eaVjwhTvQ!e5AZCRooS8}Ur=2@WFSnP3{V zMLZJ}Qr^`w!JpYm#52J{s1bvz+yIrlQCfLpia0b<{G1qw}$Y)*WnV=6f zcj%emXPkTInP4eZEsepS93EjXs7|J?h-ZR>m>)5yUdNt9JQF-kbrH`57coELncza^ zM?4c;L%B201h=EW?sz7+kR5iO34X}-_rx;+uT|@rKpcteBhLi!zhZzesIEf4joX01 z7DYbX8V=CSI@L)Lr#0@n0PVNZPr z$FfhH2Gjmr7eAP<`TpA&o_~g@r)s{tK)q;OA{rMOjZ2J1Z|Gc3WVmi!?Bw3rOxtfx z?Z})eKYl*Y%JtBm`kdz%k1sxUAs zhV-jY-F)`}!ow_137Xycy@|cXr>Dh8Qb~$@V2f(DCDk>x->6z??2?Sr7hSXRZ*EjA zGp5FmkWDpQM7_6+sU0q4-b;4W4`?6NI}lb$*EaIpLZFV-jaXc5R!7myxK50TRlMer z-;Kr3_MXs=85L%G@v4CUGt04rt8DRn7~8!vERx5GP)X%`vfz2Y{j{n!8b|_*@hhWp zRXsvYL=!%==o5QtKdr`xM1D);bBWI(yi$r?Zj{P+HIZ$rq6L=a_F>ph`9!pvZ8zI~ zx)Fm&qw^dGzk%9uWZO?~gZ*@qRf2MMH`{*N)J^;8NPNSc1wD3SyWFzvr`x(|KV1%e zRKYb?BKfZg|@ovGstwROZLSLFYy4k! z5@o56f43_FWLwou`{^Csw4XlSP5bHZus(DaI@Fc@bR5o?8Md=Pj-kCRn*L$fPjPxi zHeZfKX_yl24Sp2v1N$lM*4+4hO8Y2Ii*V!l!TW-JcV&L`TxGs}PX!gotsd6b*r)}S zNp0S*P?hy*JDm?40-+SRH*Bc#SqA6rZ0ZB@S|`eSU0}7!n-wotyjgLZ;8NvsK=e8K|G(RATK zLtd(~#F~J7zRD770zg_fS;VVAjT*nWa;2)7^oyX6_dsv$9 z(nZdpye>@L4wEX5B(^xtRr6#c^2y|j^J9K)i01_VKq)nz9*dGNp1y@5FrL!gr!}5Z zRm6Bo`=1(5=_tJ;EBR`#?x0YP0o0F2)hs(Py17I zXgpocyK-ne{UQ4AjHeG%3XP}o{0WVxOW60&c={GwXlpzjgJ!xmo-SZTXFM%u-?}iK z(kLRvQ<>S&czQQG6dF&zN=2dZlzrJf?2gcK{@R)|iQ!zY+#?t~0J~WxrGxL8cz>p>!Dls>nJ(n=>m4NYvXAl+Wu%6PiZa| z@ziZmF=3V-I^!vs8WH1ZhV$o)r?Rxz8Bf2;!p?a53r?gno<7Q4XFT1=T<6xkkw?TC zPakAM&UpGK7Iwzd!4#eGRE#UmczP9co$*x6l@a6V8mf*MPrt_rh!{_Kn~WMy5QjGQgp`C29|clQ}NdCjHl0XLY(omhWBP?Je|V2&UktwyWOGj^aq@KXFPp`-G~@Z zS5Q~Pc)FbV5#wnSdlE68K0m2mHGM@ek1BCJP_n7E}@#TIV4rjvna{o0`jW74xxNCg5FW|26<^BN1 zmoUEE`>@*6CqP{=868fDFZbSu;~i=T(q{IUk^Bmha|d(PAr|T;kHvYBTWH**BeonA z$7dmjC z#=MCfu{dyFfSt)0de2RqVsG$$ko|MeC;w2t2ua-dvBVmsr-@M-4&0Y}zP!Kq3y07@ zg+D`To;Cr+4HQdeK8Vw+X6A2rwL@*8sZEzI3^h(5zVVeEuS#~r`2;`msPc5Tl5 z?O`{b4zgbN;@IY3etyAV$T*_d=naY|6u!n8w|z|HXFijSvr0Fruv?dFbh9nW|88q@ z#SM7J3v}st7cO|=5?Gf0Eh}%J=VaLIs%snTy*jB4Pls@PSX)z8xqc;F7|T-SirU&$ zD_OK*1&w{u0DtO1UuUkr<a}HXo`@B*(y;Yu3~$Z#Yirk4G{7PUdmddh z*GGIbciZ(h`k_9*-Rj+a;p-dih)Zr`f8HxDzoRRA&H7wpG3C^XW9xPGD>*YfO6OI= zO}1D`>6()3Hfyn*854&i#e=haC6CX3J&U#Y-`cW^|t4#$g@^ z$B}Ipe+wTkueVB2&hBR0#WNrpa2}|S2-SkifVK{Hz4Kv2rk&7kEXOU|EbxZO})KgWYUiwq1N~q<PTW>o)VT-_~vBVZW{0%)`IR)@|1di*IUNr{bF$D88wIBlv9#D88wI;+q;c zSJSzKfca-Du2%e{;#Ngjwuy3IQu#j=A5(lm@fV7}ReWEu2X3Wor@!KG#f+i^8AN^= zWjt^y6gO%9t%~A{8s+4BI?C~RAGOuXeGmUE@|}SCs@7JnUhPctUE1cSO)1HwW$W4} z^!x3sTc&LuZ-{2yGVJpHEZFApYBD`@O{<4k^dH0iXtlu)$!tPaa{ya>4j%u#;;`Ry zoik(G`-A$uQR-cv!Yv)?{aP@cgAzcz-}LejlOCR3S_(4Pr(&53n6fq&L~Z;T=x5w| zwl@=Hz!Yl6%ohAP5_5j^W7oI#X>Qt42!GY&3H*UE=h1Ep%CHYV1Lko}^<&qydf*o1 znZErN)4G2hbq=^h3^i{9%?~^$U7!pU8z5#BYJ z{E)8JQJ=#Li$_7J0B_1Z4mA?}N}L{c9rb@8L8$;qylsIB@NE4 z2o>NG?2-!bW#+a|1rU;0xQ==~DmW^DtdrHe?o$D{7MoOnuVFln3Lr+KkP7fR^Fk`X z8JzBr3c&CpjtU@-MnWn;9S0Ip0mOMoNCgmsS6eE;?>VJ@>?q^Sc@CFW(@=p_FB0MX zAu4rLfRAwwx}XAl7Mg?#ATt|M0mOSrNCjx1qL2!}zU&?q;E!m8RDf4lGo%8DrWB(JgO6KBeGJv|1N;c%E0Nbd_Q30N2VMhfxoT8%wjALO(1>lt# zjqpB&sv}f@H0L8i1rTTFk#*E>v;3}9fWJ^}gbL6TYJ>_PHvmTkc!!;HQ~-J&?`$3Q zaI_}tsGB%ljtVf1^&AyIn7N%$0shEVBUFGtP@AIy+(*$-0S=&YM+KPA8F5sAtEkIS z0q$n5qXIND*HHobQFDh>fZI8jjtVesMKmHI`9VN#R99WEu4*B!0MEJ3W{jV4oj3{X0bu zb-ZcxFz)vqQnl0@+Mjb2E|LBMCGSlB-#hke3E}#`%6=`svv%KnEfayz-8h@V1=4SO z{^T(ePP}A(22s0vPB3A#gXFwRR|V%(N%-xcZr*Ldnu~(z^DgRO{WLyTh8vGDY}s@3 z3$F5M&c^GwY)oglQTW4|hOH52hgmz#;b7(T;Yg65kdob=m76Dz-8!*ycWmEQGh#;D zDO*fmcrB-!f^BNl&_a2)*Z z%JI^sdouoP9qf9&@W5?~B-mZrmZJJf;Ka5&w&DAF8~?l1&CSm9+1QWjn+bhsq_Kba z(iZkF+cx|*^o>Ej-E9A|ZNq0q`p0(&JKk*D@B#Rko3_e;R^KM;d zU$$*{A~MO0w;T2G?{-C--inXK)2$H6y9fI?r|N9h5PY{DYK2I-Y}@c*DAyg^a5a2R zlbhO=ZTQ~xbrlZG%Gs|P!9L^7C+HL#7Hrz+m^L>=IVZM{vjps*{w?G*-1o`d5 za_z67)|YW>I@Xt28-E$EOC+nA_uAv@SyfLAjcX& z|IQ-0Mfe{S<6q1K>3s~vU<>7%KG;If#Cwqq()%Rp+918L;ki>;#{}tJO069P={2?D zN27=h(iS+i4^yO2hnKE1nDiJ=24@OlNS$Y-wRBT-kVVbKBecO zmyct2U@#_m1TcsO=?&Dv8BadTtk4!pBe0e7l1E4K#1 zCfRXJN5vqtg&xMd&=y+Fc0ya|DE48hsaGIDgoDr)x{6vtTWAhT&M+klliy^XvxSzR z37R4jesENhZkK{ENbe%nb3uAvXQm6%`x*A8iy*zUFkRyZi_Of2L3(FWacB#zqTVn_ zFZ&YgR*>E^aZD2dg7mUOVUS+NaSc`!=?T#%{#hRRU$ZF}r1wFTIWzcjep#It-1QSQ zj5CQrdV_6RFTZS^7u;=xMDh-*41@Ikgu2=U=?%gly))TZXbbh(u`oz4Sp-2Cr1xf) z41@I2eM%4p>7^&ypiPk8piPk8;8D|O6QnozuIcB@7Dw$LU>Zx9CQoxqae zvgmaz8QMZ$;rPNJy?0Y`L3%4tv>QQsxeV{46{Pn{jM$3@&!3~xMj z2y?BNNO7@WDCVW6v9Pm+ws78Dklu|f>};X*=^eNry(o)IEM|_?^c3xHfeX?*goRy@ z-Zd=jY@th;>w@&sSQ5A(y?HQk(xgfoAjdv2H_bm*<2I&nDq?cyuzy<03ImhIJ^xjD2E=cdu%snj((mR-Soh_6> zo&y)8_XjNOg7osOC~!e~f6TfrNH5tbfeX^hZ&X1fNbd!dqd|JvuZS(Qp4uWodJCB! z3DWxz>qmn0UeD$tL3-a}{mz2)a$R(ba4B8t4Y{1t5(eBo57PdCyB#kj4u7_Y{j*FQr^2R*Gt;il#V*4`nnZky zUtU>-eH@4O?4Jku^NZIMR~8>{!tHkI8(I#a#@ppL7;a1(hd=m+E~U?CelJ1?ur=`T zt4H%QeH1g(f3eISWH* z){0k#inU8Ru~=+v?W(fX0hnE59jb$r>$M<2EL0Q&a)q2lYs%M4H`XkR@B{QtfXg+DbO0yQI7T*bwsc)OXO}=5C)DP8)y{K;^s?2f zjFo<64NicSHPErHBEmp8=D7JstVa>?-u;oI@tA&g1$6&bhCMzAVV7f z15VaHOho^r4{U$q4R8Jp?I+OxUInO|HtT7ny-an1f6b=8{xzFp{{2lYiGmwj`!{3E z=vP7d#@4uZ+K!%H(?rZoQGV%#&0zb}m-cmjrfE}-SIYgLvXAI9`gQh>PkP=DIJSJW z(b4!$#rSfrIj#A8^wo^BQpTAhZS+&wRNM$0Q0_X}8i8_Vn4k|@2g730JD z-^Dv{`W>-bQJ&|211$ z3o=`9UZCw+TUviYJ?J;jvw-uN#@wcxHgO!-$7BEG77T1q|57tHT#A=*Y@MAy&;IkD zKiHmmdB?2Grk3rQ?_&(jE%j)J$DPMS<^=6|n3o{4T>2IFF2cNTX?+OgScYw|9LLD{ zVt=FO|NWSsR`wn9$g<=B?5ex6IVXKlGmkZOd+9B$7hx`=dS2rBe1Fr9^P$V?=&J2n zwEZ;O#$0p$+0Q3L#yjx=enF4E_&+MYUoyZOb!>oV9f{-3Z6t(b@^JhZiDNfmc5}1{ zZ0WdBg=>~kC|B1kV-Yf5^L?yY=1$Kd@3?-&$nF&`c7~92WvAoR&FkYOk=mO@*e0Eu z;}su;)XzB!^D*K+3J9rkVkfMsoImb8xVS zm%xq|Vh?G%5StOKqn_HGPj=q!)4eqJ09=?wNq;f!_rtY_qbeMOlDN5IGj7|P@zTL< z3ljZ<_y#f@QqIr#5DB(JQ#?1$k2CR{7_C7)awju`CKI@J|1S2ySolv=17m?zdThYI zczk#+*BZyu3nAswR2FZas-P{1k9bQ}h>u9V0fq4)Y>8Bb-%<*x3bCyeg{lzy4jv8h zQHP>jUOYx?grO<~`~|I41sbJDRS?Ts=P$jpXR zg|DzfraZma5 z#YF0A&V|j*OKsy}I$Y}(r0}j2r7F-C zqbeNDcIRo~IjJkzkfSQl8GMAQAXK6gwQy7lv85zTL|Ys39CD*0=-v6s0zPguA?g4#tAuHXM1kS z!*e}CRd}Ddj;io^j?YmQ@ahnyDr}?Zs0v&G9z>`LL)ec9Re^r$gJsfkFrvv%)v>Jz zRpE0~7ojR}S$CAGz}sJxs({zuPN@n(B?{~gRpB9a*ijX}%J#dUD)11>y|$idi{wZFM_XJ{#ipvZkQnXrw(acSqotb3!gp|rfbg^ zf}_7^C<;yH?bKf~bY<r$-OwSxo2tqXj!)-<>ui6sll1Z#olIaB^e)oa3*rY%;{!-*HD~~%wZ1c(W9{95;d_0te9h|RE6J8I3<%4Vkps|X?#qN{v&YfH z-N~ok>@jIVCdwwc2$cW_xy%qVvYodxhxhtDV6^Om_4Htg@N^U|&<7&5gg3niYs#@R z4512V86SC$r4({OlokPcNQA-Vs2bUHiwK`Y$s>k<5fWGSUS#qQdyT%{Au90krOdI{ z9K$SRH5n$DGIoTeV~ACZCQ!aQC;XJ?gr z2)}{&^tGEUcQ_L8Kn}NGU>tSO$#LLiI~)gWBW>CZV1$}rp4n2@>RSLQs&D=XGcM}m z`0Tta!@jM9U9SXOiRs+Y%}&$VkfZt*K_Bg3)W_jieGS-;>RSzcMM$%o&8tO1RNwMQ z|M-4m^<{HXu7tj{RR*;BHeo-iZ*`=9_<|nlqix>S!LIie=rblZN-pn9y3gax?RzMf z#Ids*b@1a93%mq4QXZcrPsx&JWy!~8$tPyX;m?&YR(j-Z zsjOjLL*-hKKi5>Qsi>|etf@U$NRvW62KU?g10e4hV)W(HV_yn!J|{4(h5hg$f!H7S zO`K4LxS-=0Gv#rLvxqpcma0s{0cC#TW4Y}r^IJqA&VTXAi1U{BtuFo5m!%*An_JV0@jB27U|KUq<} z#X#owai*WI_*KOR6~zfE@?TY1T+~875XX!4MkyYtc%tH2imMdQQ{1BXT}9#FK#%Zm zfWp54=HMno{ldQi4p&+DH<15R;B@lnMW6kk{TgJK`NAaLAAC@xUkqIjL+PDSxo zkMce6uwlJ?#X?0cJYqT>?h)rJp02o7@d6^w(M^itZyx2})BIkz?K8g*u{W+uBJyV{ zuIKfGeB6@S@OUt-9>U^<{2kt}g}1Y=eD$i3wUh4BfBf``QzoTl>)L;Of)8TcN=pPx zZ1mT$P z?=^svWBkqcX>Qsv5S$sWZp#kVIdj(LH~#p~f1d6wC0FN^mUqBMAfJF7g`Gzle$CFK z(RQ8V3Ne2|&5dt(;0$5D+O&_U4co^l;o2`~+CiO|;$G~-AogM7*02x%9qGewwGRoD z7oN}2%JbQU+u%41L6qh|ZiCVs{?Bt8I-)gX`Av*8%k5L*fFA*c+Sh!5l1hU_X2TeM$E6fW$HqgxLyw^X6{yXpW zmr@EnHoQPB(~DSp#K7bwgC2 z;=NvGHuPSE|aV%Og5e~n@vE${U- zNPF?v^QmTzzEo%gsF+Bt=FHgKyi_ggI*$#9a8{i6`a@aQd2EmuZ0EiH zmz+rFvEfpxa^CCDX0G#IKb-A4j}05xkn>(Iul&w?Jx%Ws@Acy-I`8$Xso8n2=at!+ z_xcSSM8tdj|6|h;@AYp`-qm~kTn;DVy?zDMi1&KA0XXmVH0?*c*ME%FItgSy9Ic7> z`hT#X^IpG>YMl4_G&|ji_xh169`Rl;4(XludNN}o-s?|dY3IHE9_Bjl_2+YXoyUeB zG1qyo@5{Q*d;KzYyF>5wpW$3O@AYe`YH19tXgtC;`l+L-D-y_lJo6(S8%|(PBHrsa zQC-A){Y>UZyw@Mj{D}8@`32sY_xiI@VRyXOe~%q@-s|a_V2`}l^IEmu>q%4EXWr|- zg#p52!>7@2^T$mK?QgZ0>Og7IEI8q(oDeLUFm__`rj=kwlvf6m zswUP{O$?T3+Hp*qP&Kgwe;Lv5vOFK>7ql$jyvCFGoQ7?&DCkm!`!U_3}f{9EiLPJ=KT%EHt8 ze*wi|ukae$o`Czw4SO@xe7o@kqE8L`EXn3G?8I`DG@dH_rtRa8H3!h;+Gb5W7 zv-u1imCK;6twS{|_n(mjyE{9p99ijnYTC_~<1Yt1J;SX41LNm4j)O0gb{r>T-_~K_ zSMl-rmPmr#U4Xo(zMF=bd7wVdht;Jemg1$7;sE@<3 z`e<8>>U$3QCLqmjHm?>5QGJg^`qvqs;jhq_w#tB3-=-{m&p=-R(%3(kJi`9b*2y|N ze%uD35bbJqV;=u*SG4JWhN9_Kh~(XaeH_v{n>8Nx;GtHCl*{HR9FKAjw^NR7o3|yC zx&9#Z6^SVBVdydrj*D}LcEfEO&ii9R$<0e7Np`8m$qUbC|Dhb>y_IDl4xzr*UOHhyyOEz7me58j#fX zy_fwcM1%a5N?#jSsJv5UUejIL`k_Q@{lGCS4=hm>TR&vpUzpD8op_dFwc=*Q%N1`{ z+@{Fi=dAaH;){x}DZ)S|`M*~r2ZH4XD2`M-U2&OWog$aavHTT^H!E&ad{FTzMLO$c z`Bue0DE?hBiHn2zgA^rp0OVs;UaVN5C?8jme}~HVDsnvu^}L`c-wq*jfrjW;oT?}x zc9DOw%1ae%6wg=uh9cKsQP1m&@;MmtUsX=vp2K|k@((;*W%<|z`BjzQR(wyf2W{=h zPbtFSB(lT~K>BQzPf}c}SgW`}@k+%nDBi31u;R0duPDB)_`YHSCoualP_bC?2*tUI zrz%z{UZQxl;;o8bQG8zUmx{kr{F`Dg+T79ZL5ialrzuM80OT)LdAXv*rbqfFm9JC0 zL-7H{Cl!CH*rFK6LzC^6C?2JFzT#HJR>j{b{#`K_H$vLblZwNL(07>1M<^~(JX!Gu zBFcSL@h!#w*8D#!_QXS&LU4M;`m)dCCbuO!;eL@#Yw8^J~+$wfalp z)1lxqt%daIk#1^%x005;^p&licV%nhM_0l}1MKOuu52y9ABKV0^YjCd<+;Pwe>MD1ovh2F)$bf z;bY)Y6orlbIo`0NJ_d4z=Wc|)9OGl4H+MVmF<@EiW z(4v)Nd<=XOcl;ddW8hc_@qTZjOTh@Vs6GbxgJWQPO!8pnMtuy#)vG`}`5h>1ALCfLmva|Xgu^W@D}qz9|P~P|Dlh8 z`zVDz2FQquhdu^qLym_&2Dn-?-qy#!yF5gG{HSD_?SX4uR2m*Cp z9|L@~zQ&I)HZvRg7`T-k3VjSbLq(yF0rn-nTj3CvLt7$VnS7l!LmvZAP;0i2fp^)k z^D(d);+b&?hY*j3Lx^vi3|&}5N*@F9yN!@Y^7lhL^fB-$PDh(?2=Oo+!e#7A=wrZV zz0k)%G5Zku7`T(iE%Y(a!o1MOK!4`7@i7o@6AmHXCLBWiyQZHrlcZ$CLmvb5d>C)z zV;~-eL&#@d=wsmX>}Tj>;83<6`WU#JQWy>)C`CuR;bWjD^nbK`415nAhkujjQ!x(R z`53sGqV*yWPhA)l6RDqaW^8U=>T^6y&d0zss&wHH&SYKZW8e-Jc0L9Y6rGQO2PnF5 z2WGhl zdpU@RkAZ&F772&&2bSN}$3Q*RMtls=S3_PL;Sl83n(#OB^%KkaXR$ZV$G|*R>%_-E zFw9X>WcUnpr4$0 z#K*ul*prBlft#o<;$z?r=10OI9MAknIE2$FcM=XEScL-J^)V1fIE0<-u=6qSN4CGa zJ_c~A9>i-Ehe^UAJjFrpD<1>TVSw;4a3lI1I3EK?p?Ufk_yUrhj{%a~+xIa*x;lLf zTm)^-$G{Efxbrd46LYbPkAXMw`@sJjYWt`7MX1b;uU!A1y>EfDsw~%Empywn>=8#{ zD=OfIfdqw_5l~Rkkc-MqM=pw{4l~1WQJ9%#7!|uApkkS+shOF=$?}qQJSS7LEN`dG zv@APi9#0`SWo8}g_%|!d|MR@-{VsbmH%27u@cm}bv)=E%zI9*EdfpE{2IwO`JeB?p z!kS@xHV=iohyMUPqZs3KaYb;dRI}({aOv{hTDb6FN;Jd8l>SFoXAY)3G(3Y|4Wg?_ z)st|{^SwjLPRj5FSWzH;33tPs^eda78eO%js(xitRb?gF-m2vd4OMlmtH(7pH#LrH ztgByHHKB518t(wu@YXv3menHw zmOA$c@Sj0AF}|oWF0YJR^#76Y5m0$pb-cE6V%&fBC7TXAe0hBSGGU~-`F$-u*C%t}n~sb$sUzAM!ByL~45 zT_UsZ+g>O;Se4!VD2_L?VL+25?)YVz z{}JW+-LlW`E@8c%C3Gr{gh976FbG%62}qKu9FmDB3g$hrlYhu`Dz%H|Ha9H~Y71sD zF&+UL?CcW-vs@%oiD2)Si9eEgS9mNm1-n{bzeiWUbk|YOpbg0a$@@-TM)>a0zog(Y zD502lZo!2rj}*SLWO?Speaa5J^FxU91M@N*h9C3eIxOKKMFS>ZH6qM1(;mX_YA?bp zPD8v|#$v!PZg~YY!K59B2roLg3hS{Lo#%S+ov&GsV%~W+F64KbN|4Vil85r^dkF*< z*NgQLO?~xPHf69Fyapbd>t+J;F`R>+U*D^!544)phgX8OzBVlT^^FASOYY1Blh%v~ zzdn++rhix^Ti<0^Hf31H@u)A)1q~)`18l#(4C*ueLlIkFG4EW5#J`x8L_XHX-xfuH zgtG?rj(5Hm`Ovftrhmn}^S>kC12&giN9IrNvy#N;p-ZkoBzb4954%d_x|)3yi@{jz zFEhBH!L(~^gMR$(;GMZ|xDW=|z2tkwB+l;**QYS|uF%JGtW4mt*)}|vkY^rc5`j#w zF0#qHm>_l8J17v-Bk3-wj*l6&?JJkAJm1_Cla^NZR9KXW?R_EpLR3f{`zj#kv0q0U z`@<$+U*@wP!EzYbaf-r8!#+Xnd5Ub8`Bo^lDSkqc#|G0sulNLkw!g~Pnc!P8p>z0Y6Ok*dC?Bdngjjr?$`dOhY3xCS%_^yk4dw{p&ipn5%Nj|ZsF zPHp|{i=2mn+%e{PcsW&l3rG$Zi!-3)wzXV@zIA8Yolqd0c55Y`t zb=#G}d&``dnyT!n*sZAFrkvaPoS(=YP&RbJ2lGP2@LoiQ+i)9W6xKH*LKW6;BHbyh zIUBN3Sl@)**i%^Vk20#Tz5^*;DXf!HDZYO76xJu8UZ=1=nbruoOj2R}3TsXj)=P2U zWfj(6XO9zw^|z!iqOj)CMTPY>Ozm7@UCpG!hGWg5icD5M`B1AYn@4ez)_aBZr%-A~ zh4luuV-?o&DVbGRZ^oK9g*Evir?4jL;1t$pu@zO8Pz|OY$;0I3YpJzK2V+UXc${>1>hgnon4XY)HzWE)oCc|nC zqHhgnI~7y1j}ooITC~HDeqCyrJ^-qnAo_Mv%Z%(rY|kpJN$Wd>^-pM7h4l!w^uvdx z1t_eapxLv+x*heuyA;-w(IZh<%U6d^VJ!}VjD|XuJBGt$%uKGCV`0p)oP6QfrNa7Y z4ysdF??=-qti=_AQ&_);sZL?NH^8M5&)^Y-H3hU?D*M4Er*Hlj2 zMfFBuO*Yk2SdV6NPGNm7Q@c@EleqO2)}y(SPGNlmi=Q4%Vl2Gh^Zv?HSYOI$r?CDA z>v9Tf(O)}-^$(fq6xMICs@^KBYuJ#duzsC&c?#=C*-cMj&36plDXjU8(r#5)%Ll_w zVSOdrZ;9&hjwq_QFvxI$CoZ{A3=J}^u;*cSQhV^VuwR8UfCG4}8ijQm2j%_Ip-2ld zx8nb?h>#M4g9Gn|9S)>K7u+Tj_fB!84}4tWha(y>-t{HsK6DIeh@9ApU7 z2knb{o$xx;8!nVRljUYG>Fgn(V&}8|5R=)5Uq-*evn30YdD9V|J*N$z{enXBjmPKONw>IdvZgX;Pal~ z8of!ajeqff5J{~%uqI!#q8Yade8JUgC9OXvyv~EI^Mfaojwi~{TFeapkH|@`Xl`AT z-z9Y9yG8zLSLW}nciqhbS94_7?gZEPcDQ(V=Bw=`W4UYOvhIAghq2s+j3u8}aSg|h zw-5{y@$)YSxG9iO%vs(8j)(8!c#UFt=EH?&2hMU6;{3q848@#fSNW=u*OXy7=DWm; zFpJZQ^6}exUJXq!`Hn+`7acsw^+4yj9vlO+9>tvH%q;3Nl^~y4Jh`a87co#A2i8Y4 z_0?n9l)+-K4i|Bsr(r&ZbMW)~_X_IEBaZcvX)^VZ2l4B>AN7qxoCzkan6oUy_22Z5 z_YtPPV$PC|G4rM}ps8;Imi_(>LVdgkVgEo&+WLw)%M!fXr7FP$*2mu#MHBx3NJoEM zOuKg?1MWUsOuj!L-!NkUO}=8zvK;Shd&5~y*)QnTeDoj0{?b|hyspTi=?{(F!C7MW z^g`m(yT-=&z2P`=PjX>baF!f*h8g&E=EHlWrg2|k`dFX|j5GJBmDUHhf68xbg=Ml7 zIM|+oqSVOF1(KKKI`4}4=nWsq^9p$h9_K{S$O2cWy;1RFiZ?3WuE-}WmU~1|UTnfH z<|BWr>7tQE`hM7CEXQwEiK3AOibfXLqVb}Ug)JIcplD=)qLBsOtN9*N6pbw6JJc49 zENs!p0!1SW6pbwKIGjh>zG!5DqLBrPMiwZKyg<>&0!1SW6pbuUG_pX^$O7dJ67WDi z;sQk@3lxnkaK6SbQIxk;h!>44P&Bf@M>JhDvanxKTQst;MI#HOwutSBMiwXmLyXk>w+kp+rI7AP87plD=)qLBrPMiwXH?t>3=T@W#WqL7g>1daQufFDa#v8k2ib@jVf=rk~NPSjr6iq%=-%E z4e2pjJu}l`FL^_uZ93--w<3$-1~b_fo?b0)C@h^?z2^o-Onb&bhEpNDi zX_hzq2>WnEvc_du;jNBLtnzFf(pzK#zi{%Y-?5*Vu|H`yN-td3WjPQovW7-Tl zYv!1Wd)k?_=pi)w9!5Lf@D8@v18;aRS{B|=M%MC%;t}=qq_e5)m)WT04cV8S;|-T# zo02!ovqP3Q6r!w{H>_gijyHT5-P;M?@XH*>J2|OyR8f|dTZ%4t!y~wxeJNSN!P&v= znB@&W!#>_ka%z5_H z@`mCi+VO^~nYCx$a2(eB-NhT;fUyzY@T*)s#~V^DYMH@Qu9c~VD9q&eRf09ka+IKZ zo|(6EFq~)RPcgIO4L32f;|-A)hnTW^lXF4>Io?pb?mFJ^0%mr+;d!jed1k(q2ae+n zf5*&@H!Np29B=pvGdtdpN2bpk?!y&6KO*@bS3DWzu482$Z}=;wd%R(u={xd!( znfd*q@P={%aJ=CF_Qvssm(%QqH{1)o70=A2?6&jF{705^yx}eER5!fgU%3*VXJ(nT z#_@(fVR6SB{(_Y|&&+();_-&#IlPWHGAo9D~My_d&`VPPM$@JjTtI zEKKGt5qQIAxSEzXoIoqspa1{ac|$xrybb2?;UJtdC+@c_p$*G0mcAyE&ow4+tic)1 z@Hs=q@qLTD-;j(uaE9$olx;RHEhG=|zCVeULaYYc9Ra(X26LxN6J*;`d|lqO5-L5T zfGU_BRmeCuLufJ=?W+1^iDnNid6R&eH$k=swYBHht!funYSaUI(lW=(H7{Ex8bM!Y z=jI_5y2Q9{Re5Kkvw{oMLQSE}yQ_287U;aZd6hu|a#GydWLDF;r%azyJAdZ%Me`TT zI&Eg{Ld1&$RyT93v|vPwSUpVZ+eo=tAEyFObdq+Muy-Xa31w0DhccIxRw z+?GsaY^8F`FoQJatnP#JTsxzzk;{?rZEMsa5azdt9Bgf@g9gHmmfPD^@Fx=^*L$O2 z%X2si4D9B~UenxE+j!y1HMPkE+@0{Nh9+)kZa!}%_S|H4egD@ScgcRMAtHpYf##Glr5CR?kGG|T3a?$(YiIjJ7E((x5H-u zcB=)^ZQ4P4)&6QG!FaewLBGTAX07Ixjg9 zxJi^RXjs#{y51Z!OWT@jSJX8vU4@|(FWlU*lPS;bl*iOd)|wTTGYT?`P<@B_&z0hD z7j<#cvid&`PMkjd==^Bxm}BxH%g>KiuZ?5!qo+47ZCrqF3mO_**XEC(KQBMNy84Ls zPZ)RjnBaH{$V6s?4|K3tg5*gHXUv-wq$9lJt!!JndQDwDa7}B1E6ftAuUyl3;hLaQ zj*-gxwl*w^O0llKzP0iEppsdVn3YY-ntglK%BDu&Ue;Q-x*(#Zy}k)isM1wZ_YTY| z+!?RvUm(n71N2q_pY%BSIK=TfhI;|aC-EMSHg3HnEKxMTG={_Q!>hp_^YJ~ODTBpe z34Xod75U!0H@xCjt_N0<>%n)4TwnI9m{%N%7c7&!j+n(_UhxeK6w9+dqN%SQ%ccw# zgN3*u@cAh-&c(bU@6+yB6a4eI-@SxMw&ef(`v1W33C9FadRrrkS{ihZg@ zvjwjpUvGHD{=MWCC+-*YidS5N{e}C638sI>Ht5Ii4qg$j%)JoGHW_VW{N8XJxhJ`> zD|khoI~jPxN#5`fv66q>KltK^XqhI14SA2zRLedQdjpfTU`+_{s+kFQ2H zgr4WleX|qJu^fJK7gLj%|0HyY^S1|6lX++-L*p1g--xq(|5Ww0p5AdI^p4j;uaoE< zgX)dc?mSSgzHh06q}CC0*1k-9qdT3W&O;kJ$z#f&s&>!(w3s)xGX-Pu{In`)^ya56 z)HhBcA&wmqw`y_~Um?puFbk34{kSEHZbE#jH0I+T$jRFgpDvY4-J2{_65Rm+T{#PR zL01lkmGG3Q5v4MO95bf zRALRuUc_3CPOQAIZ;YpB4`h3mr-Tv2j;H)rR_b`l!RUY715ZiUs8@yYqGV((Pk9h) zIz8z^D!Y^wS)TIeZ1hYHP+YMo!~l{y$y|?rH{d4&cyO>!xOa+Cdr>FDi8M2DqHl~X zPf2}ayj=%#z9TU*S?U{O z%TrF|I2Q1f@m+~-usqw&mH1LpZgBP$T9&7L0PVz2iB*&RFItwTJcRxH;lo%H z&LA6!WL9}f78v*>|4|t>kS4~P`lE=X5!$Ly>N-SZNKM=G1{Am7^KIPwlW3TR9^o5_r*ao^)h8w1y5V*8B;<_^ zF`3G77FcU0`bKM(<@RIQU z>DM@RJmn~EgV~ySM()FG$nlii+hWI4euJ4$(aedyF?KxV2xfLXC6COwJz7Vocs$DS z0V(!)$}_kU9#8oi(>xDmz`pjAO-LyrKmUun z;VDO;wE;1l++NS&ay;cYmUBEM9fihS^OVs`Xw~qP@ro$N&jRAplrs);|H9&qrz~aV zj;FkYnG5xe@tHc>C*`+AZ#er;N@)hTig&F`V3ffCJ}v zO6nWq9(c;(XhP2ILxV)$h+Xvn9;?_)&)~2iImVW+T#GuQ;C=l6 zuHh^DNFS-I*mpuDS!tZcu57Mc!TU|)C>DEwbrg$b5FCkHS&TbrMr1}TZY)s*`^Qs3 zSiQ7*W2R!}3Vf6qV$gY{b;WyfdkX0Z?+kdY#%2+wV$0M0FJJCR1Ya8^NoZ69i<+=U z2}$$FtWyMIbh%jW$b(?q^qeIw3UJ0qtoWNN#1-MUMJ zkaqVYQz}dsbCvXS*&D9%rlOwU z@+F~|tL!RYHFBFWEXaHx@*>RQw4!_m;OfS!o(U!&?-RY~;5DpAIaZSICvlHtxjXVv zrVJK?Gr(1L)^0IZnZlJ77h0*0$nhiALVbBt8PL?X0n2{>Mtc40j;lNd_1$e&QtM-# zTfDll82qM}TxA8`-40^`4W@r6p4>fY{PD>5fXM_j`H0C4P?ET+mt5st*kAbC%>+}Q zu?_n1yMwFbKITFgV0R6c+6ccl93SpUF6;`flG~nP1%Bir4R^^n?!W%NNxOmx8feR{ zDXu;VO_|)z7+0*di3HNW9TS~4dC0R+bO^RF*R?M^ehEf&50)HHcm#4OPxv|(!4uvG08cm%FLa7|!igxaJRw=1 zu6V+vg@~^oJ)V%_6~`0Kr!`_BJ4BxFHngTZ;pwc|@PrZWzmzBZ7_*d$AJl)xB6&i2 zY2P_d_yDpPE-;goSGmd>mSvCh(t6JmE<`Evge%ZL#}i(J(Q-T?FENfMJcI36p73c} zmM1)hmgNb*#9Ay*_y*G~Pxu?A74n4NMKhTYJmG&Z&GLj)yLmjJa2Sp!+`w9U;0Z|q z3Qs5_Yk5M>jOTd5+u5k)3E7vO;|b5iMki1BXO^@);f-vgm?xw&NRKDnj66HR6Mmdk zTAq-q-L7~-GLeoa`~!1Zp73&7mM6S{IW14vpDkFPkazKY;R*Tn+VO<+huIZR$WK%q zPbloBv*8`%oCPk4c=Wm;RRS@;R!#%)pI=I5{`u9370U{n3>#Y zZV6+S<%Tn};|VDs^LWDdGqd9fmou~D32|ZedBV>!v*QW*9PaUi=P|S63CW@QJR#e4 zJmDcU9Z&c&SHbaw&oR~UghI}HJmFhR_ISd}*|NtIKFr!Yo{%48cfu2%%xXNI@HS)< zo={Ezjwd{k`5aHUfo3;6;j0)W;R#>na58#xGg!E+M@q~-GX&g@&v#jF@`I^Y%3F*DW;|ULAS;rF!?dyJHr!Z*a62AQmoo1o{-0? z;R$E5lkXHycnx|8o{+OWD^JLK=x`OIkGDMGRE(qYgzuH~`AQ827b0U6oX!7x$iU9# zu#{IDM)xRkwYNhDJ`{xW?mK)=BW~tGjCprlAh#JbkV~k6%wrjQGQucqUBd;s&%T+0 zS9#`km!^cNiiE;>+&qUI`4#}v4Gn9hm{E*d>ECV=#`i*|y@E+mU5%$hqhDEOpck8aUP z5Z~3hMgRPdI|K>ET;LRNBIFvS-f)2#aDnCMP!4_A8$WiHDUz%`NxGs5BXO`~Ds`uzZ+|kVuI+afD*E;xUTT6lW<4e~0`l)ZVE0 zF~u7dZ&$oe@e#!zC_bmyq4--xKK8Lc`zel86yK$Y7vH5o@m&fO-=#qDT?!Q6r9i$9 zWIgvPKBg$XOA*h9ey0CU@lC}n#)k3YXbdR6OMxe9y!bAKE&Lr&_&ea|H2sT;;=2^_ z;=2?mzDt4PyA*gJ4gj{p*S7V7qcPUVOmjeH+ z@uDMyy*~~*<`bu5z^By~-=(l$Qu~jJ;=2^_;=2?mzDt4PyA&wCOM&9M6ezw+fx_Pb z#dj%Ce3t^ncPUVOmjcCiDNuZu0>yVJP<)pH#dj%Ce3t^ncPUVOmjcCiDNuZu0>yVJ zP<)pH#dj%Ce3t@6M+g+(r9kmr3KZX^K=EA)6yK#l@m&fO-=#qDT?!Q6r9kmr3KZX^ zK=EA)6yK#l;qQRryA=329D5vp@m&ghRBiEH3VXZS;=2^K_$~!b#|4h%#CIuBe3t^n zcPUW#JD~7)z+(RHT<*`<7kQ0~aKe@29dr) zNaj3z^^|eHhNtE2&;kyWxeYgOej&aJ+P`(s3EsW=1)P6yf<1NnQN)(3aGE%MJI;sw zgZ$MUG4zC3pBrD(IS*M6R;~Z!YUW$89qsgwrfz@CHdv$c^sZWe(QEz3tuipxpn26w^MT{{cYL& z!XMvytN*(EX7v4|9YKCm$Meu4hSjteZ2t|?g6bPOHY`E=D4Q-%+GW|2>g8Jll;4It z>8TA{|id%v_H_{)Ue4bg6yxRgP3Y zDuJ1DLdZSZ$8NNbR5z;FacD^pXPn8o9X<2lLSGb9JM<=i6qrEtP4y@AqQ7#_Ngdp>2{M(FQKQ6?kv6vSlkfKi_l1^Ulh8YiK-H^Ox zspE`CoGVr;h-zq7+(z>%Tr=WPq^ZhM(NGxaf&T*|{=TfjUVMdoDSm^~W3q3eRQgcH zh>GsKAbnU;e=2(;lhn#&`4-ezWm(cr#u8FAJyz5bBA$F5ZDr0wju){YYXs#U`Qk6& zH!^*A_Foa79&gs;w`^yEY4zt!o0wRcEU$*?BND4D`#c6OePm*lXFpAAQeq9tew(#S zPOQP%$+V72tRdOkSj*9gl@H3Py5wz5CQK*d$@C0HaZC{#q-TmOlTKduX2BD=8ZtQ~ zIhge9#N_0Vr=Zj}B+5Esa!AtLoGb3CFuf=l+0z)sia)>(ot|_dm2G21XWS%dnJoK~ zK9d8a;z`zQJ57~jLbg7w69T! z6;+JRev7N{fOxCb$syAZCM{IUUsQM{MtrhozRO*-r!0kN!}s zWOB܌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 z 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܌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 z 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

P(t+jpEJ6LGE?^@5sYG>cI7DtwSS83U3 z-<5U)<9*k!v7l(*m38UZzUwzp8uwj$GiTfTuBY%6;(gaAk+TE)u2Xq{Xx|lzbD^Y+ z+qYgtSy}z8xlX+A`Uu-G+IN-3_GsUA9#1~ncl|A|TeR;gy8EMjSL)8|%)YCP?xKCy z{=D9;?7Pll?W28HY88x?lu?OZyzlxmN-sPny$$=WU*t)&zwbI7<$t*LUDK$M?7NEQ zzIfkNtRlqwuD@f$7%`E$pDkm=(v(nQ<9*lT*edb9t8CE4`>s^m=*9c4BPquFu4Oz> zyzlx1n>pThUC86cO3Hr31I7EUC$Xq_-!)*~c;EGW=8gAVUtny!@5(#V-go^Zi?;S% zg?(x5yPn9>tbNx?%DeBo-p^vKeb+zY^km;v9su#atL#h0`>q!;TO0eXBTzfpcfE?u z74N$Wmp$Hhy@#=F?7LpTHn8?xf5!CjzUz$?<9$~WJFI=zkMcf>_gzIbSiJ8#m$C7_ z>%q($@4Nn%=hy1K>o3{%@xJT-vKrRDD>Tq&?Yn-L@z%cU=Xoiteb;AMoVD*tYnS%E zD;J3DeOE5=lhIPaVd@vA(hd z#aLe%Ke4d%l|4l9HO-q&B~TwrU)e!_LmgewX?9B&)DZkc{IEq_%Ie;%Tf}{qvp%^ebP*FTNhT=o!aLW9{%<&f8{LadgtJ|jZi(+MT$KQ8`a#VJmkx)!!x>Ve8{ED z@NB3)$_*{?I5H0SkJTKtM_R1xwJltf4(XkO4ypx9pri_y4+Cdh1&m_9c#z9Y=;c*a zRNgdrC-p&9*9@t-dJPD{E{=e2QPa?zwY*_bde+M24a?FWO&>ZqvjSsyD7CV~Id`<; z7A#I<<45!4#Bq(w-siU0`I`youK>-5HPc_W!+I+@|N zvEj|qjB9Vh8w-L^6=Q#3+xoWmzFqG3Nr};J>WgR~Qm)Xwgh=5-x_% zk$qnL50__UpZ?!@m)rE~>@UFcRZA2q*tuZo0ump{SXkLGbE&h!=+{vVL^+Cw%puLK z)T)jl+b(hkRSE5Z3Zd5b%gt$p_boesC};UlZKIpI*-ECut@ZiTBSd99V5^*4zi=ki zGRB=;Wx2A_c9pHIG2Mr$R9LGJ5nGG{% zEdccm-U37qpFHN|aZaI!?S`slD;F)FISYuk6P#~+RI#%hDzBhfXXf&mPN!7)EMZob zJ-DjIR@&1U%|0mQ{nF*rWL|4Pd7%Sy_u+dWU@F47T#Hw^q{9fzIaFl~y~MqwXn<+y za`)j|OUFGZlZW}3?rJN*ct_==I~y-`zR`^{>5fGJUh#hkqM}!`KcikI42To{b;#48f1C6dR#j|1*y17=NCk37>&1^YA*WdO=4NJ?hMHjcm{k{~-43 z&2fp`Z)abLUATXLO%!0)j_I>g?+u+iW`Dj3$K?Ke-{{z3yH@AOV{>FagN);Km}vwc z<%@FUR`%~_3#W4#hWo8;;y2>i-5>*+a42BLHmbm8?t;dp7(;@;X(IB~!4uZAcejvh z!+n3ABlq>E5phE=RJ>S`*N6N1Yl--l@McMa9_zsn2-ygE<`vYZV7%2PxK-u>P z%Dz94ycyO@R)T@osJu>by`rp#B7U>VKULhJD7JPHFS=IR5}iLG7WgDU@6QEcrZyc7=#rh_3sL9w+9d5p?pYZvkimBrRB|tm2my?^Aq2@kPaLiUICnp0C*21&&r(Z0$l8Tf0CQ zW|VYqD#|zQ2$yf#f$~i|P`+sg$~W!6k$6e5eEFswDBrXL<(qb(eA5n;Z`y%PnqIzX zM<3om8F-(DKc@H-#s5|$VUWiuQ(VaV4EgX#b3D94dJ-Ya^9lb9@_EhhMY9$*EH)o% zV|}MRe!-9ZzBA-y1;zZTo`_>TvX+LtTg4&~CMt-k!G)XJHR4Bi1GWI|7^98t2~y z$xZlgNlNOCz}}euh6EM_9Df$h!9V}!j41N&10;%y&>qM&%pFREVcNl^^=Ue>$L9DfQO2@u*GSRRfDbSZz*44`&I&Sr#t4^ps*$cQ>S&DP9 z*A*!n$F`6@Edgw>HTX#{mJqH%>ID>;|I9_CKTH`D`>A&rDuS~=B3OXf?3t! z9W^^%SnK#AWArVBe998nEedCs%M!v9$_k3}W(9xnv-v%p$y1}RDDC|hPTgfr&ij(L zFdh4p-LJw&UC7U7It(Ag%~v!a_cnyX@WU&m-E@4=m^|>xIFJtk<4hdq+Q!eg7xClW zVVsFO3ITX^L@o`X2~v0bFcgU9il@MD^1$nGtMCPS)S0;PknQp|LEw3@JiKb7^30qZ zLE@(3CQYlKVA}6Y`0etZguq8G%VRjxvHT_YnL5BLHcff&8)xF!R(5%>Krr>g>oF>C zHT)(I%eXP8ekSe`#M$LFLooHT=kA=3GEW9Sx{W9gkG9Cs%ipbvCgMBjIJHKw;=Teu zq8d%q|3JuRuAM}K-ET5kToSH39gnuIMI*NXabZP)R+HCrNfK2{^lJBiN#&ZTuAHJhqo z&D$t^-D3`dG_7*M5h-&*U_Yh<4pNjkA>>gik5jBuJYA9Z7V|YIUZD6%#VZuAC!(ou zQhY>_*W5!BJMx&`QJcS4(}_qQhN$Y zX~jydA0ELUiX@hm+IyL~503<;3CT&6`qhgRfKG#>g;r`k>Z34LYQ1l<^4+&H@o0EK z03DC&odYikprRWu+e&R%evn+sj7Nl0A~^}qDkGJKAQ0;sfXWTo~{7JPbGg&--b zP-k4vW`K4f)}>=sYUki;k^uT`=8UY=-pXUl(_?_nBG1F0@cfn>j|^SAiHdhLU#NH|6cWj`EHbiE`w+`&#Y!y)VBXimd_9x*u;j=}?QxXu|2WI4NGHF_ zl#!L%2ic~PmD&fGvIACX!{Z&3{5;E!tknL4M`*=Ltt@0c73Q0elvl{pp;VXL#Pf@+ z)Qa|w7oKHV6(E3e#AU41GJ|EMmLl4FEGpqYiZjTzQX3~;f&|?)F}3ORV2-ZAY53o5 z9sa@0qbXN>nsgQ8?`3>c6mm5oAVEugyv)Vd;U5(5klz={80pX|Ak9|`0aVr=hkGo9 zN>^qhJhDR@qt<-*tvSp=q9SgIp)UIS{mX+E=8Na)g+FmTivQqm1k_iD+9sr5R zO08&DEtX3N!hY&FW^2PrEzKed0rU%OuGmVga35nUwRf^oty`(}Kf{x-tkk|pd5Xt( z68pd}iLsU1OIWGcO6_RIo)KB86}_rwYHN>8P35JDt(j1cHW(UiRYp}}bg;ViTT!hxv8F^t3!VlLCjyfj)j%%i*q@@zr z(o!R{8JBJRtA5#>1#=cGUI2cO%nyxX8_`3va9GVuHE1V#Q5Mdc8yZ9t;*n+UE>r@u zXqITj!MY{LTr`Te+j?ewsAmNVBI}pTox7|7DQ%T3v2G5rR%WPXp>?(T(4rU)A{uy> znVK%8%Am!df7BuU8r~_CWB?^_`#+xl<|a=H&I@) zV96}7s3KBe%vPJb7~!NWT|mlGyg(|xG49_;_++q`f z@m*j@rQlmiH5ScUzT|?CXCS(x*ptzp&GBF-P#JFQ(o$#9He;;zg?0oZRYf?bMNliW z=eq*(B&&}s58^QgtBh2rldatnvFm!FfnC(s=W=;VVKXS}(40^~0;Kg(-tPvAzpkkh6xplLsj!R-3cRuxxd zSsuep{c`sNHljRG^&)5Lm%ArWY1OZ-J%JZ<>SxN!-4m#>>etquz@Jgx*UU+xmMo9I z+&zKY_RDWi;Acp8aCEluwMTH&_Za;)0`l1tcsqr}s1VnO+u9R&8~iAAnaG)Ti2~GP zhkp=z0=$;7vyaa9uzM8c?9}b^?RMW2DAR-S84&LY$U`5y0`b@p69uf0?D@XH2`mSF z=w!voit`ouEMxp<6hEhUm*Rbjk1IZ>_^RR##hr@pD#{EU<;rXl$Q60ne^3_>+n7Js9>`5Rki~<{z7&JYRwCP}C^MYn7x`f29GRv?;)<##??2RsG6rVC-BfuAH z?&FBXJqQ1cJ`?UPVe_gEkSGW$nQfLk3X)Gkd{9)t=Wh`7EBq5NJq-T~e@Jg%MmR+m z;va_$33{;C9p>^q6yzp~zs8uLqGTwo%q= zs4Gic=i)O8?b#>r;^G%pLDIIgip9*vDM7B|s~+*HOx6TG4(4JFC$vUobLW~iV%=$@ zMyoklN3~Z^vLaeq6%pOU@fur{URFfnr8W%c%rcy|=LI+=S(MX-wEA$lPV#;5Q|!I* z72St|d&fB(I&IcG+wP(mCW*teD{EAr!Q(E0Fy0r;&vcXzRT(#$xEYEDn3nDc{FuJI zbQz>EdEj+s;P*H^>P#FTyT;Eb>Tu#6X`JzL-j3lwU=k0cR8LNKqM&(@zzsbWg4n&30^r$m&t0CLv)mruA9L=0B=R?fH>qj>N5o1ju zkm=>`4n=^tOEEsKH3HCNxd(onVxx(A5b5%nkN+I$9x|D%@>nh|Y2*SlF5mNm7*x5&CyJg4v5yLLbk!#W3mmU|F zMoymXXp^36FLagoaXxOpAK72yH!-H?`UnSb=~&vYHxltIIx<%u$n@xM>{GqbPUlJC8MQ&eW# znaVy} ze=sT7($_e-+(XqlsoX!i~Yt{Sji!l&vQoUIj&c5ghOV z9~1EjSnMEz+&%clP{msk}vDky`BjftddD$r}p}CBLBT=?@f3XufUw z&sW8gLGm6HXrx4PGcp*dG|5EU?YKt(2N7OX!`F@NYdXQoO}}r{2_hu zAG6TpKY1Ma@CfITJcuRNgmH=FW2}5+`j4Mw`oqGw^5i;7!$YY@@@Fh1QbBnNrAP(k z-7Mv(FlE{)C&}?}7j<;~(aChxvLY z$tv|D6_kgw4v`AV&+@uODk#bB^&=IO{BYOLGX3Xgnf~*$O#k_hhQ~W5*_FqOR8W3_ z^~_R1=|`sjs7uj*D$F+_c{TGzrvC=>=#lBa|DyE5W73>coj|_rZC3?l@D|GdaH*jD zHfjX+^K+@!dFrtWN^&55qhvBj&9lWs>S?x&i7icC!Mw2wN-q5Pu?osj%p0qqT+76< z3QC&b^J5j1O^l6IP@cosSOw*IJZ`Ll@@XC@RzX?Dys-+(Zp<62puCKEV-=JaGB#F0 z$ve}xO#fZVqAeAaSMVe(6_g`cnx%r0Ygqp7Dkz2dZK%|a#J)i>BlN4hx72U z3d&=7CT*yo9E{qP`7r%g$YNp@l&e`xtb%d?V_R228OWFKs)Ev=@1OfrUu6TtDkz^}Y^;K^l6hkll-$1XvsF;~vFSe!Ed5vo<;5(@ zQb9S9Wm%^Gj%2*0f|4qHeM<%9PgtC#g7OB&Tc-cyNobk=`vTLqVfrt)2MO|3LFvQv z-<_;*tb+1)JbpVWD0vBrSL2^C{fDl4An#RNrWY|mIPi9!^!ufP@^Bp3dzp18_%bT% z9WSF5|5G@R!U6XqIPeh+5FrRyBZ!YYXT*&fH>%(0?? zCW<&9k5MVdn8ssN$}y(!7?pC2)8!bIa*R`*gD2u3{vp29&~>hZ^Z_y>JMl?#=hiB9 z5m}aj_oxJ!x^kWxG9$4DI;UYSmW$CRj4DZV&uA4Hesa%{06w$KjEjygg&b)4uCAXP z@2{vj$xl|zpIjY)#FxwPfQvzmCVTP_2!-u8vf(8A5&I3rmW|6?&aPZ z->g4KxWvKc;g!$@xh9xehKvIdCdYR8MP?WL$O#kH)>7w_5Y0rK#j~(5u~eEt($U0& ze_2GSEbf;n#h5u}ZHp3}2jJ_QHVZ;SRE5vL`X+o~r&q76nyvX{Hh$@Yg-PA&3 z4XK?W8?~h^09FQCM1>rg#UqVKfjAo3u-UBAct@b#aB3q$q%voD`N$^JE(7{uL=5iS zBO%@Z(Fa0(%#+=nfGd>Js6j%Gr_gMzeGQ8cDeU5yu50!?Q0Y)fWfqk=<}>E<5ph)- zW-f+7a42jF8JZzOv6T%Is#XM1m-P^WZ@p4)l?ofyI-*fZi^jGNLpEv_K{=xE3ftMR zJm)nm7d=y=mekZZrl4j~UH4f$oHc7{!}+!%MN!RF#Z9JAI|I~qHX!~#Nbll}*f>q& z^`bPmXy4#agkgljm#Mgy6b&$rE_eT^wRBu7HhGwj>HfUjxl8l#I@6tj^7sLwaV(F&dlgN1 zHCQYy?K3@y1n7H>Cfz)w!=WQ*>c<@s(?=P3Inq59rHapk>BHew82LKLoQ(+FA0o0y zyYRetu6B7-(XWm|m~rN~MmA`Ne-Qgj=D5Vx^e#?~5`}gXIZh2-sF(2;BSu#{4Cpvd zboYI!sAzb6w6ICRI&hzg!(HRp?jOOAabxgfd==0*#+$J+CIi^W>W}XU%m5PK5a@7t zsY!${4&t$0xHs0jN2p(xdJV5Zany^*^UvF!Au54eQ*>huRIE`vT9MB#>drbvak}Ds z#WjkbR$QmJUQzbHkpFR&xsJf{URB(o_&{j17QKd$UsPH28bS_m4>P~$H3W)YL!jt21d3im zpy)LO3Re~Qp5`mUL!S9XuOaYY%IJ%t-w@cK@oN-6qw$|rd|Jb~?ZkX|v^XAKu3Rgi zoKabx50E(?0hujA98%I@CdH2>^WJA3GGfHAw7B;55>DVj(NwGh87@XIp&RKXT)PA8 z~6Wg>OUjLw@U}^tQrp4RiTCs^Pc#6(v;=BO`q!!zlIRA-O{; z2HX6Q-+GlC)9;1^;I|$th4@>Tu*l~?6QtI^Qwo`^r^D+OmhuY)cOm`ZGCq7xn&R{> zT-r=Xe4SGk9EgNnf5GV4@OjR7{{J9|tIL+o)=!=X4Q}HL=*}$(B4O=1{m>XntRRi0_*E@ZT}V;a7twW^NORa;qh`4{n2 z|6}z-+C5Wl2XxZD_@QGvW*#*ee%mpQ?lAoDN^Un@CDNEY@QR&-$LUdL;*N!E{EXtb zn0J_Q#(NY3@CuLIh7ydeAaNdup;$CW<~ZKuf!8?_H|;ztz<9?a&Mt2aChj~hmWQEB zRNmR}n>_G3x1fR2^r$oKcP3=JylYS%#|$iw;Y`Q!m*8iY_b|$9X^wm@(%I$RV$~1c zsJzuV<-M9yKXa_yZ$a<0>SwPpaP5G3I3A+oczd)d1Tww+-Kq!>M_Yp}tqFVuu_&TZ zlQ}DpuBG$MT@&~$(s2{fI8y~;_#6&nZe$}Num`}bZLr-LjN?Y`M)Vi18yIKGGqOQD zy!|x+yCyuIeMHKpcZ8+4q#u&kGIsXSncwaKl(SRs$+w_s9F%i*^STJ<=;qy_<6c|? zz6bNs5jl|QkeL03I9zeG;v_|xUn72{%BvJVqsV^6{2LTyehv8%m4Bf4tm2D`uPW|P z{G;M~L|!JGD)Dqh_Luy4rK)X2NBr&aN^3KJF}J_XN1GPI+^8C-Z5X@#O_h`s&o5cI|qDr@fEsnk=AJ zOME?>at=dB@0J1ym5ML%?kI2wJ;I4nNus>oc*<9E@IE-*%)2vHtTv&c@ZgFAxC~l7n`#sc3xUkZ)5f_#!2xBfR z6#>RvSk|RuT-bgnja*o+&Bk0|UAK~#LF6{Zt7ja=T ztXaf`rLqHy3mYI~`{vjK^58#QTv#qt3l~<1b}<+BCbp7cy9TK%Z84F0m@Q*sOH*}h zwwMdc!IH&=r9M%M3wtIL$6VMa*pM+7_8i8>T-XJSjk&OMc-)u^`+XiL=E8FE-r~aY za{`MCyO?=nE-X!vTU=P)nKl=8Ig7TquwUUxSX@|sH*Rxbds5z=3rkI;zQu+842lsh ztULf>F6=NKKIX#yFU2;vu+^xYaAAck9&=$YW4@RR`zIc~4KD0Qk=&SLCl{8csx2<; zYs?;VVW+Y1m<#(;CXTtV&$0nxF6{3a8*^a~X5N?!JDMfOT-a`G?3fGt0>zjMdkc%Q zxUh9B%i_ZBVqq2+_VcWX#f5#G#aUcf?m^jH*#Ba@#f80wa$8(j4(dC?h2>_G#fAMP zkKY+CEbmprg?*Hb@_un)2jB#i3;P*V)^K63!g(kc_OD0*E-cL`xfKX@yGC5tos1G) zoyEd4J+n8p|GCAI_VnIZk%jOLW;~5N)nehPf-Z{%Rn&j2gD}F?Z!Ob^@)QyB6GV-2~!Wg3srS{^kq<8#Gqw9<aICx z@w?8A2)gWWHaE9FWaHSM#+3EH&i%A^wg0K$s)8#EuPC}av8H%zSuN(W;v|iv%jW40 zLKylv+@a{D%G1>r!pBGt;l7AkOp>v{FatWCIx`ocXmfQ{O+pr9_kCgN{=cQ?c9NGn zYb7-yLfzyipiJ_EXXi#e3O%g;Uq;nkzNoRDkK9mgY0H$|y~nkU&Y6s0;T_i-itT?a z>$Y3;C1 z|2oTSE$M!-Unk}zldJn>J2sNjc-?UQ8H1i^ALme&G1?M0pOKa`;t>erK2m$>GDu_c zuo#wis}*3pqjJ*G<_+Jd#+h`-A^`8y$OSmDI-DfWgR~W%FYCp1ev=1Y=WuK;@vA@M zjF3)fH`Ru>_4e1^-nSeYd9Wfk6iRknP z*OpvGZe?&*%Bu3bc&?_8!t30Ke$Q)eoGH)92JP_n_uuRz@OV~3p}^hu+d_hsITm%l zaPKpA*rtH+W)$E`{7y?|d?u=7Z$mu=>u&!o{Lz0ncaMtSpe(Z~BRKX9O8 zjiT^$5zg~qJo^xFy5f9A)`Q`nR$QmJUQzZD5&yW#KT&*DafjmnC~_^Bo-R;$y1?}sf4|~pMd9fp9vf$pUwFEZg{KP?o-R;$xlhHyzq1( zb4i8ig{KP?o-R;$xmnP z3lyF%PL*7K;h{Eg{KP?o-R;$xmnP z3lyF%PL*7K;h{Eg{KP?o-R;$xmnP z3lyF%PL*7K;h{Eg{KP?o-R;$xL*7K;h{Eg{KP?o-Qz#r^`>TS^jm3UsT+r_zV$!SnP=dOYrh$`ksoP z;QfMdJZgj|(31%H7?nq=%qM*-{9S&IxXciE+uP3{GAw`o?nvym!bSV}A%7S8p*CS( z9lB|0Bht;hu$>&qqofGwUssbv9hKhOJgm<)xdb6;nx<0 z+s293HhPP}%ca^P-O4S=rs*c*ja)H6{%f{pczU=3@%ZEt_+24;@J*!#$bSYe>?;a4 z_IS4vQh{=Ks~A(@rvWfV9;WlZ1qsH;|G~H-A02>;tYwiAnxe0hhxSE#NLr&TVDelic6<^K6q!!nu62UQQnoq^R=j#uq9 zILgMc$v8&|uPvK+Eq>-W@U~2DWj5oY#PO%P`Z;^Jj+V_?jd-eiI>|N-(Q$5V#EcbU zXu8TLQnS z1H2BII)~7s&cvMy*)Ffqs$UXuro7egn>;Myot*laIKEr#@-DRM$9bD6?*{mp$Mlf{ z&>?!6LNtydw;`=yXD|w=MVN6WE|;^q0O|6XGjq@Xep49Glt&DouVEy|P>kdl216S; z54Jnc)%0a}ovRSglOA=ZJR=*l!`q)T+cn|w>?2ZUtHy5kIdqY{PvR8z(V5@AVw8F1 zW7iqZD%*&T*Vk}X&C|a>HKc|w#qe7#+*o|S<-=L+$8< zJV)_7#np;eD}GM#4kDWUF2xNR{u9N=G@Sh*Pfn_wzA<^;-WYcHk(o?dT>Iakm9i4( zl57jiI$}=hy{B%azEgij(-wCv#xix_)2Lr`QHOkMg%gyjdx z>lvj|B3Xs@Fj8rJE71jL_}gfqVpVkp%iN)XyJc&f|E* z_(RQ6$1<)aloClYTm2(LsWka#O2a~_JlT!X@KEXzs%WhZrJl)W7&ju6dMEGU5snI_ zv{OD3hiJl2NT6#NH-^@Q<0<(t4V?T1BTwXMK=hJAZW|wpYhVDIT%~R191n5I zKM(n%$RZ?AY1t_ZV!yo1OC(tr|4cTJUvZU-24uO3ujAi0@skET z#M#g78ZfBKukeo#agsn^fZw0X5FXhQly^^;yj|Ktu{sRv2G^C|`;f6kN-JuFgX8FX+t{`bQpWFSF_ z>my;EYav04>!acEj!AwWIsC^TmwY2bZtN4Juz3}u%jy@Rlpltrj7h%7<2@DTn~?l0 z>+*Cc)g@o#`8_AAWfhZ?w^4e5V_PxFejz;t-A+NNE;DrJ*>$Jbog&&>lufdJB!Si- zqT5B;i7A@IB-Hj`j;_H>{O`sVaJM6KSg!cA+-n%mHi?gmTpJLO;5pubgG(ntkKAg@ z7$Eapnh+)=(79~f;a+&QPU=$#2hH;aB%zJ)BN%JML~55UmZl1r_*l(bp85-l1PSzO z7#z|h`&c&WaT=RRt!3g-9#7Y+sKK`Y5XWe2ZA!@HCwR0J?NuC;`aScG^TJ2a$keBp zc)TValN!jPPSV)1sp-5X6TIgn?}QWwrXYcaXH=JZjCHQ_cul;D$*C_ecB%I%Njx>h zI};>O-jROAlU|Ce+aQ4o;jrRaFLgJMywdwMlKT~}6{K!v!cTe=(LR1fb3y7*#$V$7 zUgF;@z$IX72Zym3-+c?I_rC^de}H5{0+k0q!etol&QzM|iscfrxlf^3;)boCKw&&i z*Wh^k-=F$0pFpz+3H1AHp9+^@Eapz;>#t&Aipx%-P9K;&-4b1 ze3i@nI>(s zKS=N-cr!|~9q9PWajICiV+Eq%A}4X2Eg#?^CC@VeHy)$B3|eu z=;4Dwitpnj*d;lHP`M}Xqn%WU%6k=;=?ygEfxTJD^E@8YNqi6gqnh+|dhzao{&%E9 zr(tB*fOk+Y_FjY|7$IEu?i##^{|V|EW#7_%;mt#W!U4QG2T}WkI~28ZlWt#TgyT>s zqss~s5E9O=YIz<$mV)~i2cH1Aa zaqLm8@Fz1|uRz~{`zkt5A%57+HRmJYz41Rxfg41f8Lm@&|IEbK=WHx52RTa2Q|+@E zpQGTxkWTBfbbaP(_Y`JVj?H*wN=5|JP*LRjZ8_fRVp6GnR^-7`-Cc#}o>`HXEe6~| zTmv#D)N}RuQd4PLrsN~Fw=J8LZ{HStyC&fG%JxoZm>v(%e@|ob{~?y{4#C?10|i-M z<(q+PgZ7)kyg#^)h!;)dwqw9r4v9;O%+GWfGdUdfQ^xQ|+-5}sjH5dOKc;UlT?T1P z9(Wy=_eCqfct_==tH-L$=F1#;PB(MCEaPoOyWt=nhBZ3+5yt zGmgJI6anJ?0e+d?E=)sr4}Rz?jUwRRP;6x7vu`sI=^iqffTlbmx=7?MJ^*z^Am>hO zZ&sDab2WVwUS|XP3n>xCnevQm&<<~Z-^M-yk7qR$3fz64hCMZQIwO&__kN+y zP!D~DE#VckvoC~u1Km_~0`eZAZool`HHs%H^1f&M8HzI$mn&YP$SF6|eMylE3zQ#K z{IMeSyfOSYihoq(zB0oDTpA+vA`u5EQcVJ78oVK{RJ>C0CdDr+@;iB^dsLBYkCgd+ zC6Q_ph{8bxl2Jk#$_53w22OdfqHqu)pRMvj#ZM^m^GBwCNbzyS=M{G-zO7h+E-vLO zo~(G5;sV7B6fal&tRh#ang17xe^K;tt1x^&McU+|T&2kGtttOjai`)g#WM6A#`jUI zRHWVwhL2Y~Lvg<11&UWF-lTY^;(dybE54xEtoWAVF2%0s$UNR5io!*Ne1ghT6zdfi zEB=?_t%_e!{Ep&g#qEl3EBZy@@wzGYRm>=UOz{-O>52;#FH*c(ah>8liVrD1t@x_q z8;XBdJP0pIp7%+LXDW(adxYPvvTzU~m*RoU^al{pw+>Pqq~Udnmnq(&coF+Q((^e* z(idmlD|YYrFf!-ibKiQC)^>_Fnx3x+QCN1L}H z8T@tdzmRe=tMGdPI(kmsigew5?5lq8oI-26(D^A_E<6#mZT!}*hTr`x{t35Gw*#+$ zjO{?5S0QUV(EkWy3VdDZ%*l& ztn>skeh{p_J)ELy3+K-bG?VUqw7})dmoAvKg5UDy>o~V$ALX-{j$<;rd*M|rPVQ9r zo#OCrvcw;Fzvhh=aZK2480 z6UVW&U0$VCKfLmz@@{~ic{2FX{SoCQO(Br!}D+x^O9`3hnY)u_oF?$qTo zx15A@+?_Yhlt)CBB3H+YhCq%zy5h%nVY~BOO<#uB;n;;~j5FmK*`OWX{@l{836EzV zkuqx&yWQuSMLDxY`{>MXUopzO^0Dg-Cy>{gj@L>#f%-h|Pevg9`OW+A(vx`~upi3$ zSMUL4K8Q;o<4!bHPu2r6pLH#N!@|=u?7#NMox=woIZWt(>Gt`5V|k;a`|hvp)18hfl}oxUw{97~cI{Wx$3w|H1t? zB=<5r2RuH(3tr}X5WDH<8ASo-(FIu}bnl;t4no4-H;@y9^(6oh_L3-~z$WbZAz{xC z344=KqTdQ(FFcwr+vrNz^DB}YSdlEko*xtTmf&c9NZ9Mjk_}<67&Z1n!rrM!qJ+Iq zz}wRsnEV5hdNyItiwJv9BZ-j`$yqE$<4TjVY@w16_PokG2z#X1_4fuR(>!QI*rVzI zFCy&Gyto$;_WH685n=Bz)*&M7{f#Lj!d?SQi3odC^W{Z^Jy`_GChT2_%n8>Uo%}E6 ziwJuYd4!m-_bek%#7#^diI+TyrM5%Zt3;Nyu6J74vJqiVzWs~{d%{kN2z#uH*CE0l zM=A-gA<3^Byoj*(byhx?u=g@gAtvnIhcweXv0(1q9g^R~g1NW;V<;0$A`5>}_IMS%f_=i?HWKguQ!Nv52rIAMQqkz1w-9h_H7cj}Q^|9$~&L!k(8!*z>Xo zdtOA?BO}L)2zz9VdRc@$FCy$^m@*>lUCfjbVef}Lzlg9$)o@-+*qh0u?GyHXfHU}T z5%#Xe89RaZTVF=E2r2;LYmVeb=6 zoK4vCV!~bn6UT%-S&@thdrMhzOxT;wqGH0{1YVPvu=f@d$ArE0taD7*yMc*g!XEET z&m!!7m$F6JTg$>M!rmn;Er+n@?M~R+pT$^&y^ScQ)Pn_cd9=oay{=3b6ZS|S^x7co zy@OUN^I*aJk8G}(uy-r-#e}_etaKZMy_NAq<9LLP%cTAs6p?c~hh{|{m{F+Y8SZJ7e^ z#D~kBTWM46iDsG6@bC=x4lNm3_<>(7iNhBW^>96nIUw{Y3`E)ZU}U?856#>@$iL37 zsvb0WLiGY&0L2tAYyFe+Z{ye*#+D^4li%DuP+na)9h0OjvFgm2nhD-dR^8sC&&^q} zXwgdSs;VNyc?(y7#{_a$sMySqj>KZMnvc%1YuvD?Vd=bv#j{a_+Pkg~m6Yvn_c=6m z9b0k^O|7ee@sPcyitb1O5{uCFk+JRApfq&>l6+>EgvLU1_Udxy>2$Fn^}S1^i?z6+ z(=J&7JLI$)-4<<5n?~$q*TY2g;w8v~UOvmB4rYCko+UtsUwAQ>EUs_3aKZBWnM>y_ zb6Qx!jubS`Ub5ue1-SaNW-cR_O{|#9x9{~iCeX9&QsZpIe06B_`hq!7+9=k$8)jm& zK1}IE)}CN8-QLQlA@Vsh(RZ>tqPOCc@Im<-o2y)Yj>CLV6r ze^dV4e}FcFmi8^|_kp~Z@LrJN0}!t)aaSoC!09}5F@-QRQ;X}B{8E@{s zMLAxPe6ty6(jA2WE7;j^0M<@Wc`WL+xo>d;mU>${?)aSYHlv}ihA8E=wQtcI3%~u5 z&N$P4Tn(`6_bkfe`7Dr>5HlKZqWk{FLzQy%Om(RY%+Wo@{ z^#HWBZ?P8rh5N_G*==URh<5k~v2VdKU+nCo^Io*C7-e4h*mY*#f^9^{XMnYDVHj@l zdl2!m{*T3U*3rXF!TucaQ*fWkJ^>>0-M^T`{78R>;ta**itM9||DxiT6u+hTsG{)J zkWQ!-z~5*%sTj;JyfvWk)_}rW0}5{qD7-bG@YaCBTLTJj4Jf=dpe$Jeg|`M2-WpJN zYe3h^W>cPi^Rs+WdKHd|BgGuMr6Kh4|PTY#cf0cmAfP zEq-&;mR%#gtwsG(B*C;#S@tap|_pyf=lwZ0P<-CDAe{3z<62EKS>jmh0oj7Yy^&r2?_;Aq-kE5(LGd_!q zCW_XlyWbA8}Z|{Gp?0ZYG<7j z>s4st>bPBIE?h8gal;�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�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

81Wqb<71CW_;{Ky2MBiI80naO763&>1l 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 E0gsN{S^xk5 literal 0 HcmV?d00001 diff --git a/ports/cortex_a15/gnu/example_build/libgcc.a b/ports/cortex_a15/gnu/example_build/libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..d735349678a569441a4c7c45d9ce62d9b9b783e0 GIT binary patch literal 260152 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 z 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 dhn|!HpOEmEh$!@SiRZoRqCc?z|Ecwv{|7^Je? +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A15. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A15/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a15/gnu/readme_threadx.txt b/ports/cortex_a15/gnu/readme_threadx.txt new file mode 100644 index 00000000..45fabd8e --- /dev/null +++ b/ports/cortex_a15/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A15 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A15 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a15 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a15 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a15 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a15 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A15 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A15 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A15 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a15/gnu/src/tx_thread_context_restore.S b/ports/cortex_a15/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..d491780a --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_context_save.S b/ports/cortex_a15/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..c62862cf --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..7a49178d --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..2ce9dc46 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..d1f31183 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..8f6c34bf --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..7ca32c7b --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..78a89b80 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..8614e43a --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..c414ab0b --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..6c433de5 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_schedule.S b/ports/cortex_a15/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..550e71ac --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a15/gnu/src/tx_thread_stack_build.S b/ports/cortex_a15/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..3b3b75b4 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A15 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_system_return.S b/ports/cortex_a15/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..b3a3fe65 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..7b7a5d9f --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a15/gnu/src/tx_timer_interrupt.S b/ports/cortex_a15/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..1dc0e511 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a5/ac5/example_build/build_threadx.bat b/ports/cortex_a5/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..d0c3a2cb --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a5 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a5/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a5/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..6ef816c4 --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a5 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a5 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a5/ac5/example_build/sample_threadx.c b/ports/cortex_a5/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..03505b66 --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A5 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a5/ac5/inc/tx_port.h b/ports/cortex_a5/ac5/inc/tx_port.h new file mode 100644 index 00000000..d2f09195 --- /dev/null +++ b/ports/cortex_a5/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a5/ac5/readme_threadx.txt b/ports/cortex_a5/ac5/readme_threadx.txt new file mode 100644 index 00000000..4dcbf556 --- /dev/null +++ b/ports/cortex_a5/ac5/readme_threadx.txt @@ -0,0 +1,545 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A5 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A5 Specifies Cortex-A5 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A5 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A5 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5/ac5/src/tx_thread_context_restore.s b/ports/cortex_a5/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1434cb44 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_context_save.s b/ports/cortex_a5/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..fac7c5a4 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..66186e5a --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore + +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..198ea091 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..d1007354 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..aa8e30bd --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..9c48eea6 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b9996a64 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..a331c9df --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..42d3fca2 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..eb7c2952 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_schedule.s b/ports/cortex_a5/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..6e250a23 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_stack_build.s b/ports/cortex_a5/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..00764f2b --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_system_return.s b/ports/cortex_a5/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..a5e3120b --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..375b9fad --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_timer_interrupt.s b/ports/cortex_a5/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..422e3576 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a5/gnu/example_build/build_threadx.bat b/ports/cortex_a5/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..cad49aca --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a5/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a5/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..123a84c8 --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a5 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a5/gnu/example_build/crt0.S b/ports/cortex_a5/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a5/gnu/example_build/libc.a b/ports/cortex_a5/gnu/example_build/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..5b04fa4ed9b6479f70979f5577dd0705d1f6d1d7 GIT binary patch literal 2447586 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

Q>dP6leU^u3WJIStz4({jFOv z9|o_G`9Q}YAJ?@w)<`ES%4ePa6BXsNO8=RP&Qp|SGyFdk<@X5vSCV4fUZp7a2lZ$@ z4Da%VOP0@Hy5v%^WwdLVGM!Ed*Y#e}GC5)FAyaBu603yWlOth%Mc9AAs+ckbBle35 zIZ~T2IV}GmzrSCGM?Fi1^wzUW@WUV%V=g7G<*o3m;0XvKL;U009S5-=Mqf_AFM?Q( ziVMCAA4SFBA0n;b7vu!*ir}CLB*+aY<3UuEVq$+&7(_%P36^`_rA+LJg7>}LXYOUD zO)FxA6k&qRdN@@4oH9>9|^EM`Oh6_gap~mjC8D!VDyrr1Rj?dk~({yiiW}^9As`{BDIOfiTKzn12nwZ27MV{Mh%}>9Vrr zzq_3J;T322Wy^p3s!eHTpqgI;uHE|G>(q}@gl=!P{5J~x@-!30kKV278br8Kh(c4e z2UKUtmj8G%&#-pVWy^n8AzgRmzwNo*lmB+$rcP|9Tqj6e>Uz_&Kjc4-5$oL2KN|V3 zKoyn(rTjO-7B0rCkpG;?AKNptUU2ZvU%J%De;Ckg!`{e$ESvILTG0YDAI^%m-63H-9N|d1vz2tDgSx%o3y?V?E&hu$-2Au(lrCv z=}MxbA|xI#^beer0x8IA=Rc1tySwwked*M>}ptJo1 zNZ{Sc|9vAf@}BP{e&`yG@yz(?P(x@8MbFZX_7(D-p&f6DmOc3{m$&ONT-D>JOTuOQ zQm1=Id%pH(#nFt_J{wFawOs|F>J_VDAtnv=l-crV zN9p*E(Rs*)>CWecayo7r{Q8VB!hwXOr%Ou~dPnitCHe!c*Hw|>*XFM+VG4xtQd6f6kI=A$XMjq{F3lrm$^8+2{4$7xy z{>N-BWKjY8R4kcLZDPdQ%@8p9sMa56p)QnD=O}ufqVpA9tSFxmrqkh`K`gz`O%s z-(D^7Zx7gad1EuN?;M6z$}sxz)!!NykIn2>KULG@r>}1DDmUB_B{tl_@X*@=3zpaH z$_0;n$h_}p8`$3L)|}LpNPkib(!Pv5FTcBc_p4rdLtB*E(Dn}OVz(<7x3eZn?IV3a zZBC{&>t305t8-luIwtHu3&YUvNw(BVa;!z?WhyDfGnJIQ-=Obs+u@{myb0_FnHLO}zR1fJV{XWDCiSbATm(ekXFfVs4|+n&S3@1>TxNi3&>u;p=gjy@ zL^CnfguI{g!utmQ_l@+ekovt7?2K*?+Ju<`^M+(6k9EVMxVR7DZ#{p>5#x^-59vD` zJah55nxjtrTzXs$MDYmAz<6{s@PAi+VdqTmTX?;HO>lL1RkSW=Mqio?Qup_FxcVA? z>`^-ARCiwZ`9}`geP;Cv2+oUFtX!3%2)%c0RZmbr-~ z^9)ZrvV3*T@)gUZ?Y%u^{{z_n-YMW<2(>3`yQ53XfZ4J(b-lF=$TvIF#qi6PwRa%Q zbxcc_Eo<)(q4rOw%a*m7?sl8Z$U4&yrt>hm8Xi7L+UdA#S-TSL*oH)1$=b)`5#$u9 zo#vM#>vTfSwe$JM)6X2)&8C5m>>TvDyn+|@1G&3iT zasdC4ocDer(gPAKQl$l2; znpU)JBQ_?r~{4k_jX%1We9s_^Z~&u70ox-!+ZEAi@EXyop$WNsWG zqZWs|-WwncHRJJ~gu3vn{$R{V0c2s?lJa&y&TeXK#y!i!FAW%?-7Q)M=b^k^j7#P5h)@AEE@@ z8gU!iT-Sm+O!U%g+eVjfLBGD-wma>$u&!epH?-jWls5|3c$V{adtQrQepSnN$lpo# zH`FD@I-LCIt^_E@hVT8gZFj{4Q-*eBQ zcSiT%7a@;M|BlM%^5FFv_I>J>wmh$~AmKHJ)rr}-=ZytX<8>`JqYclqe=2Wj>xF(~ z*gAwg%`oIa`c|ZE#dqMFUj3_WBa3cpi}^Rc&UBX|-D3`Tk$S>lP^;q8S@(I-`(GXPTKd>wabIou%prHry5(? zmOiK->+Yo*o7s*}!yi>%-NNtVl-Ky=CwA|Cmi2vQ_wMu7qaBfV^Uf2I2KVtzKmDtn zq5qZFkB9#+@K>kKX#w8?@+a@VeX#paYrJy=Z`-d(gMQt~K2a_`e!|2_M;d(w1cqBLrZK}V zM>8u@>kBvoiz<*KOp3TpQEb&DnPOz7(tu7iY9Ma=p>b6AOuUE>i~A&_RaP*Ur&x`# zywtH)e*{ZBsBn=GM`mCo(~Uu(KNCY;1A>gsf%YX5{u!4z*6MZ;9BcJMBk(D(0$0$o;R8d#qJhz-5@|ebh@GYc&$72Zm$fUq(=PI8D4@oun@g9?*7F zqBxHp(Y{#x5yzJw-@ZVmx$lZxXIF27{A4b z&m3ztpDE3;Ry!GYj7*vG61C=^!thPDUDxbVEjai2{$$69^B5;Bgp3V$rQ zOpjm3@_s7w&5GADd#qI}6We30e#yj{$6AHwR&CNgu5wfYg`vyQb2_dM2$yF9|se+8)rti~JWVX(;$bN!^4TJ5n`G+Yqc zW386Z+sUz3=c2ZK!x4UR4y$dCwfa5t*<-D~#Y%T_tkrv{mOj=hTpT1n$u6?TTK%5c z?XgxrCiBc=t-^ByPUS)I$Rt%(!}Ee7o=i z*YLg^@n>{+eiYt_>IO@8!ZY}EEGNBz#`_OUL<+iB@WUxrb)J9kWYo@|H}qgs%)gKE z{_LUGAg_Oa5j__STjTi;itzH`wVwY2&edLuC)IwPSpuKDc*>Q3ei85q-~S{S1~=q- zshg3e59V;ckI(oSG7ZYi_eG&+dLw#4EIWzeEsXu8NHO#uB!4Jk>1WBRGzrgapgVrE zsLI^p_nD}b`K8T^VW`_q$#xh|%kg&(KpX%a*1wICl0VmrF^u&S@85nfCGGl$dn3OA zzrTfvkMmg@iizl_h0Ad0*U^&usN(0@m1VT&?VopOEppHeTeS=|m_9%>zL$3x<BN#rC6h`ukhOP^kh=}-Lvg@jyjtkeU>cNoC733T z=8fYWVWy3r`<2u{6B&YvGHqD)8VH3&W>DPbirceq!M@;bT{0g~5b@ucePH{YtoUVc2)(iNO#Ip3e0` z_(;#_8(oiN0y|*i7&a9@Vb?oxz0Y+;IzHN5*AvFRuL{I^DZ}|duNUEk=k%Ro;YF^4 z((&IYPH$mHiIoI|2eD1ZeYkFUucU62{euKX@xH7DdX7rtcv=()I6JwqaZAFE; zje?hr7k5L1=`TEbUPDT3}n=Ie~p{_|ZKVrsAuhXqZgpPC5@m=k_ zEN!i-zxM^AGzK%~FzNxj->5fGJJ_?Mxy%=^8z?1Dj7SoP1aINz&@%n@C)^DfW z?EMa_M$2}QAKS+^kyhd7^1HXd^SENAoo@RD2yp9n8TgeWjQrRf&94sEF270$Ln(x5 zr{l8sJ3QyqFCU3DKYkkPJmgW|0lx;sx%K-c`0@U-e(mjdK(KI);KzHZoi6Kk1n^qN zy?}Hh@WrMb0TieK{t9y3pm&yFd0t#8tVJr33UR+hLtN zTke-8z&EnA42pzZ0WF8?{PasF^K*~3_D{lvmd|y1`gJ^Rqc`30AFpEAr#^c06i_Y4 z>-_XfC(C=m@v}XY>)m+D_}b5S;-%Wp@+-}all?&q(v2_E4`;>*$+n@!lov_0`Dv*fPGSt<-ah?zcS0;kmVlNLo=uL_ePGP!R73KUu|LuxyQ}ixHw<~(Dq7N$ih@v|beM-@%73DZ3U)rlCU99L* zMQasZrRW+(FH^K$(RGSmtLS<~X}6kuZ&Gx#qPHsAsOasAZd3FwMYk(@ucCZzc%P<| zj*;)zF83{^)V?K9Wbpz}&LO0qP;{E2eD^Z^d_@;4x=ztAD0+*c+Z263(I*uBxuUNs z+NS8+ipDrzQke4<<+3pS=P6pHXsx1`E4p4$Vu(z?P0{-meM-?66>U@WzZB&<0rQFT zB|*jclAy=p9x?o6MQIP6{soGDM$vC5`W;1opy(W4ZduIL$xRw}w& zQ8BJiuDIWzPpI(UEBcnA|5P-_ae#COD|)P=l)o7M8%1|1`gcWpK^|ayQqhr$PE>T7 zqO%pPRCI-+mn*tK(OVV$j-n4K`cp+;QFNE0|4=jr0g?3>sA#F8$0<5P(X$m@sOZ&- zeo@h{DSEe}&nx;nMQKZu<@`(0yj-Z)s0=KH}a$>--FU&A=F#fZRuV7D0kgpqcOkr3^=*kaTN z95(vFnX+fi7Ne8M_-t9BC@w&Iv&D#Y33{}}Xg=;~EU1ZdPeow17~RJ*vbPusG2L!4 zdKhWu1!9X);BGMr+$~1IowA~__%^aMTZ|rNcVuia3d|Ox<2lUC7NhsrB(ue6Dt%^) z(QQm=wiqQ@g4tr!hYiZuViaU-F$yxa7zIC+^_&|29=Vt;M*qzcGPW26W{c4jru?bQ zH!Ch)8fJ^p<7}VVVkCffyTxcRndbBt*e|meJjXwJ3+Tm`E+WKHAzJY9+G2Dgs^vw& z^T}zv4R(vsXW0{a6H$~bV667Wl1K7RXm5VeTa4af6YLhF4NPpe81cyr zoGnJ*XSB1$Xd{_9Ta3hqth2>P2qb%MF%sX+&K9HZf=zyaEkBk_&yY%w~R@y-^bdzs(aV)PXj=WH?B$=Y$zYL$(R?uc^M`Rua-g@pc;ndx@?-zwqkUakcS+qo+yZ01 zCBzmKz3l{@W44{(T5UVQmDzTJzBgM<`up5evUDbvc=puq<~Nac>}hRhi8Cr4!}wh@ z20s)4cM@*l|KQeDsLvc6L&dwQd?E=m$;9Hmi!k0o?F1mN%p?7;ZJ=m>$Hd2IpF{-~ zc448thIoE=_dzUNx?(F z3s$dOS+jgqg*Z(QiN(}PZlcbb-NL2w7lFxYwXNz>B>ca-t6`s2l6A;{Hk!R^Wf5}#0z~2FO*|Cx(o1g`Mm{xDTI+9mQM}8?0pQI!EYSmwbNx~ z?_ws*^nPM53wn!4fpbAN&?-xv2{w62WkY2!hAIFhW}7x+8- zosOa=@o`e^*pG+d$1q+qz7$kDhG}`VMA&xVSzcD0g}@~i@FCf15yE{7Nn2~Ez(}we z3TA9~fPF%Ip1Z_N`zYKLbPUsjPEwTjnSRbKqyjeu6}TzrVimqlQGuHxTzsK}Zd2h8 zDEfq=0yjmxz)eBhRQTJ93fvUo0yhN}xGAW>O+f{23Mz0@P=T9*3fvS_;HIDgHw6{A zDX73rL0`n+WP1c|3Mz0@P=T9*3fvS_;HIDgHw6{ADX73rK?QCKDsWR!ft!K~+!R#c zrl0~h1r@j{sK8A@1#Su|a8po$n}UkZV9-iDc&w+uO+f{23Mz0@P=T9*3fvS_;HIDg zHw6{ADX73rK?QCKDsWR!ft!K~+!R#crl0~h1r@j{sK8A@1#Su|a8po$n}Q156jb1* zpaM4q6}Ty=z)e8~ZVD=JQ&54Mf(qOeRN$td0yhN}xGAW>O+f{23Mz0@P=T9*3fvS_ z;HIDgHw6{ADX73rK?QCKDsWR!ft!K~+!R#crl0~h1r@j{sK8A@1#Su|a8po$n}Q15 z6ts@`C#b+pK{qMCz)j)5NBISA3ja&WFK|=%1#Su|a8po$n}Q156jb1*paM4qeJdu* zdsorjisoU`Chpf)(GjFbKTi3_D>_Am7xQ^QdcMP`z@C9e!k=b1;>CP|KTSDrF}!-! ziundy1a8=+{gtDpOppL$*ZAVKEF4|KIf*kH?XS?ibNaY966uX?iP{^K&5}9Ik+-4E z-`LoUop$$3!!Yw}Pj1N_-`HGOc4bSH+R_#!HoachxV9zF+w{7hK-l(%ro76ACfX4Z zHbd%>w`@aO-j2rRBk_3lhK-TP+hS~rjODAe95y4$w!ntPwJo%*$h1-Frkw%oxD?}u z(cb1K8k&l5Jz`fwlRpq)qZ^xxKu3V~MR<^!-^8>ziM36sDGQp8AKlOt_vSW#KlNPm zv~wDp?@c_{RD$%ocJIC=w+LmVZ+xA$M)E4xBAquVsyqp8II9`=;TA7_Gp0}2330;N z?!N2{sdtaC%#ZKyx*@haG2DNAf@^Kf6&-iDTZuYQ-X7Xv#Ux8pt(!uI6%(e_C@XqRPP zYv4b3&m?cdeSW&}9xuJ_zDeL06g}BmnAmd1h{GG3ub9->+V7}_mH^jYV%;5~cSiHw zc;wUR4K1O!Y1fe@Uql%CD0uxs&-4J}J?-5c>iVuRp0DYd0-#4(M{4c9d`Z^O@nosfYTw|AfoiyODJ zEk%99^mR=qT#q_pjHM8tF5B{>RC>k}lO{Gkp7yr9jJE!$EVcNFRC@7?L#8!6o;acL z7qo#R>pZu$IrJV%!*);T1#gT6KiCIt9e&gaEhk(*qh&1Ybq>K859?>Nq*1@n8}i0i zN^P4Db=v=BC)_VbUCSDqIhI(?jc!~TaVd^xJ}=5HPc6bK<@FURZ8_SRi!`*6qWc$9 zR$jR$pRru<=>ZRxTNEmw|jXyU!g z_ii%xt$fE8h_bNvvSU{N@*NwJGf;M3dU2CqHm9W=ec~k==fM8YG}QZqva$_lRwwW) z+i+r8YQu?qp0HQ%p|Uch+tJt>maS_-nzqUv8`?G_tT*p}Sz|*E=w^gRWz(Mk{n6$W z$6!+{`byZvnTo#l%TIh_9?G7c*w8i?GzT`B0@%5ki*4pFU~c7a8-DNPc;0qUzWb)9 zztR?^uWXy1`idBD1rr*ZIfh~gW8V~_{$=UUx556*n;08yhfQs4<@oHEZfMbC6Rh&K zZ@;Z=8~TmU%bBn*6sCXMwoTM=PHQavh5i`70c{$63VbGcTiSL{+JR@|NsR9~t!uX5 zmh)%id7EY6*%*la<#-wB<-ai&W$vE-RBOKryOkv(y&Ea-_SA_eLSxo{fy_tug5c=Xly+g*HIbn0mc)$^OkjGcn74{ z!A{ehX3qNz{~ydx)6s|QSN7>Vw5hLnt{WTtbk2?JgM5@%=6$}++uqoGImhXaEp42G zLT}?PK3|+~_>9fkv7zmpvJGuPJ?#I4-m5#(!`u3$@>^z2YiwSNv6=7+TX&%UIM!d; zF}zJan>S*--YUkcoO>E}^(%{7_+H^X#OGq3H+wkRRoJSZ8T3nDzV{`Ohw1!U`HVeP zw!Jw98%wamG>Febi08n4mgIB3e%B0+d$bGh_dK2MXyT|2iARV8K2E*2yfU`p2Gb=U$B09u3-7PtrMN{Qs~3bTf1u{^3Oxv z`kXi&ZHN6Y@^rf-uE5% zMKNwe%;%w(YKjs?O}%jMb5eGWIRf*p9Nz_Ru)KlZ`dzb7pL4*o9QBw-p4;WT%sD9Z znwlH?;XO{fS+Enu{%S;jvi`RsAM1~2;7LE#_)_(R+uCkFy?+zuC*FUI&u}u+iu&?B zGOsn^ZD{jQXNY1CU8CBm?>Fxe`&rLxd0u(*FyG6&6=j9#rsi^t{k(*n8<;ME`tezZ zT##3o;`JG=zIVn!IFEi1FmK?!#`m0;epbBe@;&CqJeOLJ@xLy4 z(g(ZWWP0|Ieiu}z`liumjALKmy>ITDI|fBO+DYn$vyFTn(PwyV$@!c8lkc6=oZbPO zVYtV9@8~ofS35m92K^n+?)(kP%Xsgo^f}-efv4_ET|Yd7gLIfqqvIaLe21aa3cF;m z&-dB3qj4{pUiQVOIcE&w7|2K8avn*e&&n~+dFdzc`)yks<@uO{{q0{se?HN6JLf*k zL(?&iZbh4X+;4wJ<30KHjm@`WT+PLgDcE7B;u`;y*aU1SSlx?|>@=EoNE%)VDF5d28zNHN{ zJ+7+JH>^V$>JUp@*%b5Yo66wFyS1$hWqaOP81rX5i9UT5b7gZi#$GSn=U(-VTZ7c% zrV#IEynoxO(FeUM7dKVzV4iuH&%IaKE{?CWG5$F&@j3G<+ZmzHb@?otVFOW?4&ylI zJYoFhc#kt*+3Y67C6WK2>A2~PXInTHri!|r(dspFOk$ZLVe>O=bDI5#=N$JI8)#ld zzoBk(TG8$tKV2UTuMY!kvKqv`O4Tp!AAt@=x-yho4c-ynkD`B4Yn#f@H`Qo!tn%un zYSl)}^RM!GVBJl<(KhDi^UZiZ_v}+0&w9;J^M=(#NF(0KHUkY&Vas3kO zT8Z&MUVr*v_e11`IgxSZUXmZf2ck~;`M`(LtDFnRBb}dqc4v7R`k`!H3+Kt#FlMKx zWk39zW3B&iya%?ltvl$-rhM<9H~RIl?~N4Z5dA*D7;4q;0qE4c$@!h-={b-6z|xU8PxN`#t(LXTfYyOhkW&Xq34(*`^s|l93|hqYj??a?j|{Jp{>l{-dvPUV-7-F zb)EG)SM*5}>vln_F6&`cN6t~tVGg++eZqUnIfH$R^Rb(})clre+)F%DZ5O_eKHI@Q z!@PiZ1J>7YPtFqem*beSu)e=yY=alaej)NN#=L|)t@<7v^KZz7EC+db&(gJPML#m0 z^JgMu$4WlFo5g#o9Amz+v0x#}p~@Pl+_&r)QwP8`@?f9qX^t>bkHW z*j|P+jQz;IXCJdq9>W|;q4}6EdC&(I54gcQ>>hjQbzq+f}!P?MtL?!1pNb z2jXL?wJrI0kKmhD+$*MIdsz>*iD|Av`*=Tje;DRfHa2fUSg7uo?k~paK4E{YVH(Uk zZ+x)(nX)wI9n^OS+8awZG{ttTZz{taTfJjL8=mPm1LxkqhcU^%!27_|n|*sf(%E-S zQ`UP)zNhjb_wt$Nv$9TnlNG$7pL32?{hVW5Nm(K#<-hJei~70mNG`ZrKYx%5{)l-Z z<#C?bxa&?8&OXY1=SLqPo%&wCt&?=C-->YmIUhlPBjy@}Pw1-ykaN#!9R!{OAtUxn^=jdF0_Pw1JC?H6 zNz=CD9khN|KcszUHr5~TJwW-6aqQbreGlk)jbp(59`JcTQ6|T;7(aN2UW|E@&yju} zIffX=?;FnH_-01^_?@t!tsGnWvd%n|lScl?o7a2{`qcfNjPTuc zB*KF6J6eme_7UR8u=EGJ^C&a$Jtn@(@I3H+BISh*ZKF}v5b)&uxH!Ef2Wukz!}@Fc zA635~XhM1HLwqN_+SRkmX9n+`JzIFh`@07n zt=?@Ro*$octaorL4xkvsXWzZ|DU}!YUor2^Z3XWq$P@SUP0GN`*FuW0B*OSy^Z9n4 zS3cj{P>y}Bw4A4(uXm2uaqa3!v~#wKdtgeA@?fJs7Hy4Q0hUg3?WrsH)Q07&0w(EQ z#a;skb^R@^n9owNo(VkWeso&!Ao~;L5tx@X0AsT-6HtVkeb^q#8EJ^R zm@(lZB*IFOTmbhrJ;zZFX zBA)qC^fe@t_Fsd;MZNpb)Z*{(qy5**8b~@%x9G|Hj=4T&Nz#8>q0r>71T=D ze-%AzlrtVB#~n>52VUS>Dw6`z+lkXPn3TouQmz?Z2MLHvClPgK`Gz`Hb|H$B$>}Mmggf z^cm%h;370aD`zl+qntsnQqBmZFTy8(ZJ7kk$A<88qG)bF6;9__y#jY!ykC6l1oOHw(( zSa^++kR+@(mVDWb%}+kaTX?L>n@ARehhzWs9_Bq>#io-_FtJt6c$*zLUBymG5%o6I-!&^X#e#`On+8T1nwLI4fI;&j2G#(${BU+ z5v!a5S(x@;<@lMAY-Gi(at1Z99Q&`|VXRfoSW8w`IpaC@y;aWmAC~JVXDlW!M>*r0 zjIR>TBcO^kPxGnO#kQO;OHe<#Wr!6qc=u5t$LztZx9WB>I% zmfwYPMiGh-kL^%z;7u_;rcln{v#RaCRxT#wJ5=4peBl7 z8EP1d0@~@0qF@~Q7ry^SE}TvM6ykC}!TJq89LwZQXj?3pKBO9Ii)1roi5Hy22rqUF z|M3%CeJ_VnMG*N-2p!rV0^66+1phEG<`E=pDng5+%JWAuHn<@gHb-6i=MIO(*3qMp z%0D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܌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 z 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

W5wo~97&-REUUH8t>xM6-U*q}L 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¥(+O919 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 z z+bs8A>Iacu)P5dx)5`?yz=7yc^)`!4<+`2@1^@m@4@WOH-bwvVlm1Rf$I$rmk6?SC z4|G3sv1aoglbPw`3{`h9_KdNL;?1hxS=6Mx<>^3v8S_uE`M`VeQ`iqV`DK5<;D9Y$ z^Hr-m+DDZmBwh71a#V4WgY-@LKJ$@h-Dq#p;waxoa(!}p{P$w^+YIc6-TPhScZtsP z>6fMR4ffe4_czo2h^f><&leqih)lR-hWpkPmwaIo^c}(*KF$7FZ?FzkvM|zxaeu?&s%WVw)@*}?_^B>sp48RC@ zRCebNCE>H4CT*D4Ba(AJphLWz(^+t4-D;EZlz+bb&Yy}iK8*d4R>W{l@%*Zx-Gkpi z8;kaKcJmeBe;#&c>JroTv~lZsft%BPJe>Yh56)?Bl3oburwI4|8JkZ~JvghjsaVUs z-{uk4ZRzmw=N9~$vDD-82&?n__Kcn8tE9K72Sulu#J9cQp!R=9zcrr(T)AFBnQKhq zGz*7+qjN&rb;!17B(>|nfuUV^&1vWd`U}kS;0}E}fO}gkgbyx``K5u*asO;2@IQ#d zJb)g6pOWUqtsglDzqAm$apIh zIL%sUBRh?JSa9Euzbab|y^i4eU4G}WrTBafj%0LjMQx96U1AB>MU6AS(ws3vDQF zp!Gd3<=Qnq>0f!f5x7}i2e-bniVGPGt`Ak@P=Uv}=Imd56D@g1b`{_+>Z>{Ppc>H}nu zitGTLS-}1Vh#0qiXzEdH{Zl^Q1Nf}E_R^Mle*7=)k34&m*cf_3?H~J^wZ&XM9%J#Z zW$lDB*#Y%;|MKm?!r$1pZ1i=}9c%yY>el{@+jrgXf$Fy}V>gWf{ce*{aC!m!@cDo7 zd;X^zmeu0i$nMDW2i^PkcXR*qUr==w@*&)h9sJ7AIGz{zEvm1+$s||t@=x=GKNs`! zSl~zX&Gk&y8r{rFB4+V{4a%0Yn8|>4`TxiEPJVS93vU#)kgMM{DOC;dJ)60Pd*$b7 z-}k>+aC9D|`1_~*j=#0fnd%ENgnAcO7JThOFCU<>b>(SmnyJy#&lAXwUe6dPZX^2D zo?XOo*dn~7#gBddlm33%*StFVue*~UY9F~w<|unzg!xS5E~&J?13yb}{lE5GFF%nb z9~W`(2TVm9x08GvIS0EB8Pen~3)4rBTV1}Ol@GF!w$VFaH@Y9HW3efo_W&DmfBhxQqCry>))r!BvC z`v1=V|4-*W{uc@H?*}pdhct)(&C+T+o;l1f^o{8GV{o?i6H~Llr)S}7KJr>c`7PRu z;)S1r&IR6HQyj0wbgK{S_qwVW3-dyI0Qm%bU1bO7J18=X%|kXsaLKEmo^|p{`|PUz zZ4*;>fpPm+2(G<%6<6sXnoNO*8=E@CjXSqS>w?BYr&<>zeRdH3C&x7HF0apIFa4Or zGddb0eZB5d`Z~{CSk}1x^964U4TkWC5~yEdE_v6%t-UFkqdDp4kp=g^4O`W#-rlJ@5(nR2syoJn&mo0l?&^sdua)Pu?;OojPA z4lRFZb2DtYPR!#p<=K?o{Z08aA2(9_$yc{!N(1-JXVQIsUq7uMIKGCtS#Zz;{qYlg za>21!9M|SgD<{^UYh?3dzW{&roIbViZ+J!sSAE@0CasItw~8ZwHo>_3JM_u)dB~M- zwPd=zwMSYOn1HkCf^+EKr(GDEJ+v-ve-7nW&aH)v0l#4>-^`?{ej0uieBB`Gm6-qf z7<(Q0UGAkQu91ZeVSab|;MxTyD2_l+{4w%(fSY@Mv-WUsF1|+P#lXj!qT%y3&$I3c zN1y*3h+P7$RsJfXPszLQcR7DW_QYvuW&PPEDaVhG=8fMufLwls@j+j(C#D%t&D3h+ z`A2Z(ksW-!yLLc^sd>WFr_SwL_b4)ydH-`8;+Gvn-@Opc`wPBtF!NyFyYJt6)4n36 zVto5Qh5vNE0N;VxhnZa=uK!#(=5p``j<4kJ)R*YZIVST(>9a%URxcuX->gKDDty_v z=C31$4^fhu{s;fcyZG$eSl&f&Nk609ic@_|7{%qSa`ds)ZN<~^7p%3No+j{UyFOMZV#^dM*FS`zV2;eeB+P} zg(heYuIg}zq@JYq3;y2wE)J~mdv7An#&@Q1BOf=DeCs*Fy;pG6Z>|ws8SbA|J%dpue@y=QsEY&|0}>(fc(IOFpq3e?6bvc+>SklYH9I zkNO{++Z8+Ds0m7CGLHggif@VH5qf`-9QS_RKe#UQhV@M5g>nA+_uwUrORD};X_Hai z)UozP=1cgy9e93U`yCXaza-UE3-Kd3B`6D?^!#_3=POdpR3*jO-Yx{tbUb{HyU>3XiBXqn+=7pOw9Xy5+)ot}me1F%fU zoaN!7pKEBN@+{Q<9zC)9nPe;P`>*kP{TX51$%i51u${{W)t~nIMY$k7COCM>_x<;` zCgnF%ED-*|kMenKd3K5W<}-1E&&$&N_q21r7d!61N!sLSJZmqbzk+U)y#Bg{?}_|9 zV^Tiy^Db)NvQqB8$3Jx6uuJ-C@-|Hd{`p$kUkx3dOaJKW=;ijB)?c~xF|l}FOLXA% zkv(oNqWuxP1aJx6xT5~m=AHc*U&V9y4hA8gl9`0pWrC}J!|S=56ptOz3_5IJYW(8u zv+5b}BMy!+fq`w-c|A4Q*$;r1ZgOLwk5$`z= z-7oxTj~Nxo_uG&&ukQ)UjrHRv`1(QQ;O|2JB)IGNyq6UGn7^|B?+z~c^A+#fSJvEH z+3Q!?e>$5>_Fu;psOrD41r-J3oX{JqC~-Y4)r_C+#zi+YLkbF#DhjN+W(zN1GC z$j+`+D?59{Xf{&Iu3bAE-yl6jS0lIKP5a&16g_H++xBT)_vfDw=i=Flr!Vh^o!mx8 z9k_V9;`J+=`uk{~_ON(YwJB;HNVu1 z#~Dy1ZDcKRT3fzluJ5X#opMKG=EB`~Km6?fgp!HVLo0^%r(+?>OdG z2A_2F@xYHJX!eLne9!lf{hsVu#(m+Nu$0;si&v?CLE3&NAGPm5Q*e;i#0>t;?>iv; zl}UnbyYT!wP0)WVakIhZ$wnc4AAq7(4$NDY08v24h zRG&HBRI3#Fcfcol`6{@|`X5ZSEC;vvdlLQ@{-i%%-w3{Tn##|5{h_tfPeM0>d;ABb z(oOP9*calzp}@yJ=Kk!%<33K)f7$P&T3h)On2WG)w?j+gWAew2Ki34skONEU+YE3h z`ypJPE&KV0kI|1sE&k1nQP>z$tcmUHmsIyct?&4?Eo+Ga zzai&UQsF~=tDRbBz9hqq;|}O?593+9T{KSEI6)e}ulhSNwQN^ka!Si~Gh66>*+3h3 zn&6Uym(QTx7n$0deg3%OY72R{{7AvI*9H6SRldgS`TE`ldcLQFFM#J4t}#iZ;M#sx zMJ{}YF7f#;w!ZWmlfFK(^MVr9Vs@Ub|A^}DXfCz)i%(aSRd3nD_k{a4CP-fH)-O0a z;xoqwqI2=YtJBQj2Yvg=7YaIJ|FN%@Y4o$ZKP@_M-tpl+Cx@~tU<)?Jj-G4a8i!xK zzsV!+K0W{J2F#lk27%`zO9zSttiFwPVwV!P$>G{KIuL%rr^T=KS6?;>S#`wJdd}~U z-iGme;Q{*pl8dXW{vw;hYaQIb#gX9I_@eQX9=(s}&qTgmwSe4|SDDB8Rr`OtxS{m) z?^n6I#7C-+e#KNh4j+jRrqka(cW2)*dcf!b*#k#1eUg1AbIbMyJzsn}mo}?Z@Z(US zjyZd_ar>%i-f0^-`$I}OK3qr}541FuZ}Wbp_5pq++vzbqrr=8al4kZim8yEa=I#q$ zW^QCLwD%hL9icaw3Yk96lKBPgg~yby`dx8i4nHt&w8H1B(%*kA8-|=I?$=@E_ocqs z`|UH+>QtB&-Lc_zSGW3bcijBCi~IR)_%7`C|Jyj*M#dK0w*-fjpyChwrMf=rv)o$m zFW7xW`qb@P*TFO{nr~B)e3G3u0bP;l_oWZv?Row)_aS?(!#{w|<}cBdptb*F_T}@( zkhKflv%*h%KW!PAC_?LgoO|etCc6#?!0OHDAQ$3+>*iYv_yi zPnG?f=WM~AHeO2mmA7;?aODx|%!@_a>F-V#e-hmv9)-U$$;Y#|Vym>bt?Lr*Yo)#Z z<~+li$OGhQUC-LZ8Wx`Xm_MIV^QEhKX1M-L^;#F1icg}y_5AJNa>GA;y#ET`)zaR7 z!D{$Y@D11o8_*ASJ^;A>r(7^QgmZ892M#X#b{9zasI$3XWa$46#UEyDLb<$xzGh!w z5+{58e$jL21%BIwT+sd_i|QeRIQ0EA&lQY{?zTH%?aLL6DC=x3d%Ohh8i2tzeV4FGL${oS=o8Z!GGw1XF!`d3EwC-22 z=hn}_uMSI_mP#VUU%^?eSe*U(0VzvuiZL<4Zol}szAe~X&e1u9Zq6~ z$B*(+zPaDQb#B5w=z+Crg6Yt*xpKzOxZ$O`_|8%>_c-_OvQx8hKfUNHB-lNZ??Xi8SOzY10Tu&qSPZHO9 zGImYsKTJi7f9$s)eX6tHlqdN!>*KF|!DP<#@n_`$52ugl1?l&o*+)(q%er)FaC#|WOL>m&GjKT>G*>^iOo3nS32b7i|opD*!Au5upraVSsqW9dJnn<{%dRrd(q@%w z^4vF{OdyCeTo<8#Lr_q*hmFIO&&+h1VkM)#}Q{{{80o;N4L_1Ws* zKbl5xd~Y*ylsQ)4(ZB7VpwEJ%&)^Z2l$Ejgv4symN&7sG1jj!vqwmxC*gSigr_IoR ztUVu$j9X15E+0klo$<&9*#}y)_SJpF2d2d4r-CcqXI`zDar^gRpEUZCvD|0MC;Iq3 z`Xe~&XYOC&z89eXr9AXLy}ugc+OZwBD0)lfEZSM5d<<^+i=Qoj-Fd=Zq7O`K=QqiJ ze65-DAGNRcYdq)ANt%L5wf4i{Z}IJ4a`C^$r%cdoj(tYk(x!@~Z^fsUc7(s6aqSzZ zvT~8BwN)uC8TdI#_!+zG{s8@l+}Wq^&;j-m_W^u0{k<`1)EO_JfA)OzxxJAA)tr3T zSAv|lp{COzAOEg-KkQx?iQAUq_w} zzSmTH#lK&E&4zByuMz#<%=jOwPjDFi7XEvof14f{(!Vx~3u=c?_utAhD0cT>{r~m9 z^V<}6L27GrmTI&!W@lfRjxB<|yso#q#(riXgTIG9pLTR2J4bXwX}-bBIq(>yuCu>c zJ7^VnTlq`?DZ9K6t)Jl;HqP9*3UuaZsYOkH&bR2i=hx784gcNA$T=*lC(=HfSM_xs zw!}8~jvY&wCrrdcc5pin*9ZLltqF5zMcp;Y3#0XTnuqx2LmP*&=XSowlQY?*%HJPo z9%3Z8);xsl*yiUm@5njdVcwk9v-Nt#+G)X%TKFQpi9;v;RgW*^H}Xz`V#w3sIncxE zzdnCGIMMT^hbPhgoBNuiV{V?y&J%q-2^m=z_+esJRn#(b38uK{$nGIE7aLdS*ekE` zQS4#%^(x1DkA8w{o^~U2=I3z(HZU@~Cz~p3y&l#)UK(u@TzLk4_CW6+naqQJo=9?d z#8mrE+rG)8u#4X?mzBj15S`5#O4~ovUMMm3=q~0{@0T5Ze?9k8i4p#Lf;n%Taq}Fq zL$AHs{eITV?t5W>)9`>PZuv;-;oe3!X+50I+oc58G*JA*Ubk{wdzN4TICtchvt-bdN;~R~scT~T) zl6q~l@4oi%TDZsIA3rrnpACIHXpc&=?U$VRq8h#;G`tIoCNmL2<|hr?DIQnp(Yl{6qY8P9JyhACM7bpHzecbsbk*$<$`^hT~5_rGziZu_m zGJ~9ro~Fue-VV|GZJr44DR>nhs2eSa%ZmhmK}p(O`zLJqovc+_fgbxg8XucCHwpWr zCu^U$|4pt*Zte7}MqwlLdd)rFPeo6jceY(0lHAS754(rc#wjsB*8Yzl%X%hf=W2ZC zwj{<}6FQpC`uds1T=;nuztsK?hnFG)dOAI$`o7sZr{3vF*;#Af^!GpRo{?57x?j)V zIMvy~q9f%dUog+q*EpPp{`CZK65wu_79EGYA~01 z6=!MMxY0h&mIzOi=+>oGha1{;?2zpl3jC~sF0W&5Py5H}{E=Pw5|jaFyL}joC?Yyb%OwW(De;K4F+0e@6&Jg(Eq#Lq^1DL^55)AS&C49y+s$K% zehMxoW^t`)KiKPO@%Q``_h#ua)epRAQg8EmO!MerjQ6#9__@QlHkwDb@w>U9p1TFy z&E_4Cn2JYDmZeWUf8$2?{1j+eC1r{!w$!-zq2POJx!)yU26N5g5vF)?FJB~|Hs(9{ z`RDuZ`lfoi-~U|jcgnio)&6%TU?)v6)jRq23;sI1t77%^Nn-h{O=edQXC5m^7=p~1 z;jYnV+UHT8hvvC{B$rC_T*4o7Ugov7rs7Gzu0`|A8;`m8bw_CFM`(HX3RCZHzaCxi zKgY)6+qS-WwyEdsV7)G=y(2bF^l`bgL7scb1>o z<6>j;n)SV;6Z5F|#OdGLY5V0d{;~CczGJsYvEx&hdBSt)Kl~pA;Qw#mVT8_!_`lw9 zVp)e>+q%6HYh%J*zYnC=+wb}for4|{eunRd);ejbzm$Ex;=gTqegXDD8{oUfQ2)?W zZEswj-9*Wc})FF$+KjkK3M zkU62By%4_>{BM!`c-YlfC2GmMlRt`6eZDoaW4GOE}f+M|WWPw-9k9Q?97@C%NzmTiN{=wQlQcq7J3rA`m` zy%}0czQp+nlCRotIlZ zULYqZj#K_Dhc)i%v2tR^v8tn1M_Z!Ulo%LY^7ydrK#o_O&$FP-tVm_~@DgU%_ z>yCt*vZwR`~}0U9y2nT%1<=LwmN^JS=p_GQc%niS$Rksl?xkKfM(O54KtDlcDpes(F4b9I!LFZ;3A z+b#}$8902eExdB8xoExH|0}4^^Hw3Zln3!=Q}9=sAW8ek{=aA;eFwLa4~>BDgO_$r zFv*-RX8UjHqpchNEqrfDCAJW^pN8(g3K^#RCslxjx#B4&Z!% zEN|ZmzGP^{LX^*?D*X8>WiMx{&Q}>7s>x!JX`vOJQ_3eL#~}? zYA@9J!=le$$eSNBrq8GWce*^&6Po8!SmVOM!XNWIK{{=I;{g111$H{`K%S#N>^x0S z;zwv=rL$k{`gbQoV*8oM&o6k3KA(b)7`rE)!hRTSGSp{1U;2gq+Bk{EN9Fa&=7tyC z_$ZEL&!N@t%(dt&K`Xy=OqmjT%35SXyJBvhO8QIxQ)25bFP?7yxBOEHI{dm9wAv#Y zzpNbeFZXC&nf!xUW09qAnC82@e<}XHYnS71ji2hf*(_s{$3OHRXbiS&qz_G@-7k4x zoc|#CwW%>VVy+qHOXxM}-6#*S9={)L2Hm3jguj;t^Zy=`;^zqi=Fx)l4*PjD`47}{ zJDHlDJbj7&+jjT%72~6_d68-KyKlevM?53_^a*<^minCc-{|Cv@V6Pd+??mePy2tZ zz1}_|a})c2S$JLG)jXVezH>@ic-0O*PIeUesb^@O?ov9b|0&hx`}a#ft$jAqPpY%m zaaJYYeywXcirm$?R(k(01JPg1)AaZ6KMFnVL1x=|z{&Wsv+eU+t~C|=iGC!1TD$}P z7?&&NT9`h@r;BrVPeJPvPJX`IXE`LEQRH_iG+y7x>dWipFQlSbUhfOiBvlBlt!5 z*J+LM3-gdKj8k*QWBw$Qz`E`bZZ?l{aPjBj{#M^7FZS!MxL@{;y?@fBuD-9SDObXj z?{}vCD>mOxoY)|@Y*8y!eyF^!3eG_5=@UZe< zZb65ky{j}f)mjL@qVI9YSevH?{+I(WKX)}xv^Q=Z{fEy?khBzdF7dPd#9_Fe(k4$^ zxn>}fYH`mJ_eUN;a8rSWH|cB2TKbawl7DqmDm2LW9~M2t$uG$l<#sAhSmTE;r+u?y z^X!7N&OQcT%{*%H*G%s8aG*R@J%1lLDmD)S{jp*b?OSK+a)ejx{>|vX5U%>JDyD9ZhiiOFe(Rp0`05Gz`p*2I^-v$b zL^cQK!Jig?JbxE7$NnRk_j&(a{m=af`(}du)&U`={(WvgD78zVWpp?!51!KnG*?;O{^ z$+VY4?#t^x;ZN&Ke!T)ci+`WunP~sQHaGgoa4dqCBwDvNvHeu52;4yTm7j#k`F$_KRreK5B$H34qeg7RJzo! z1Co8cX|c1fg}-6@@qu17RW?TUk;xlFz<-^4hd#&T#PS@hZMPM@D*tkB20ZvP_VvuD z{nmaOi_f~;w%^QXz})*QHUwbh$NeMl|1-UPK)!c+1N)xFY|+$0_*WjumwS;taHQ?RNnWx<2+b8@kYwP%bG&XYnpTu{vBL7SH9fy2V`}8dww|*>YpWu1eukBDJ%ClPg zD|;tY(RSgiOXdB7@1*}KdjG!3{J$XRw$}UqqVIO+JNni&qVa04Meo0KHRD&;*mY>> zi<$3z75T*Gy1G`+7ysoS(0|0ZoNQN>_;*=5e!So2Kz4WnqhbZVP&1%$@*V#?C<_h9 zf125YK0@!A&qe$%|9uPeBmXDA1mk=&@F0RKzPvEk;b$x{va;YHIXl9S@+f8?A5^Yg z>c06*c-th~_{>gxs&b_w`Op87|FQk8WPj`%71R2VS&JPv2V#>0hJBzts3C?$P`Y zmoLZ6zx<2SLy%w4puRiRA`hT)l*e5^7uy&8D*sOMNA=+oO+vUoxW=aq zIr=TI89v7boTj+mX6Eq>Xo8$Mzkbggm_uKf+t?*Ai<8`r)e#ZaQey2YV7&~If z$UdWn3?G&~aP%;o(cuiKE%yDii}%IWdCUSo#7nDl)Q}xNILvMFoKJI zR75{(dUNeW=!ZoN`c3WE`-fn+)M=01Tb}qG_>}VWaJTNiGr0h%%;PUMCI?)_%YViH z#N!{1K!$zBTwKmy;esvB;JxUfMoG*?=kktfru@gIWDC7t_E7-{tyPx!mG_X(dHA9i zM(YsNelBtJPuov`&nh#c_KSY@p5y|G=yw%uI5HyWzQOa4_DgxCern0prJ^RH#gsWbTx4W7$>VoI%#n@`J{kP%&$QM_B{=#ZOh{ZZ+g4X@a1V){n- z!vAvow!ziOZOwWQeJHGM0slK%#^kMy-ym-8UE^WC$DDA=J}=3=YK@p9e0nO&v7S%Tp`wz^~?Ow4dUZrO0>IRX<`bu=W=Bni-3t`ef>=+ zPq4+YueL77Ul`}&#mkD4SG&+$-pkl{vD=>-+Rfg|TyrC?%izIr`%_Ea9-b8W!>VuJ z>elOs%4Qyg9@1m{Xa9%)V(WRtzfVAOR$oHfo49|*R8u=GZa@0G&>lb@tG>8*&}pXU zU*Rv0KB!1utDZM4=)_ipmOlhv`g{aeJ#Tu@X|spRUfPNtkv`M+hJ)x+g4w!5_!FG? zwu^W3{F&ezo2tUq{(ha8u!c7OEz1O#f%P|ADtzQ$hs({#PT+tZ?d(Y)wi`v9`% zp!xn2t(#!{a;T3&zM_xU7SOle@bXyt&nxo4`~T~5CViB*OJN9LmEUvYYaiD)K>8lFKjiyd#SJ&tHb^JV+{N_JL zSsAC_PwyebhJ`X2{+-QOhb8=7ahQunAb&bKh~0nZ7%k|R&0bq9j{?Uk?)TwC`}6aV z;UkBPf~VZ?Wm;9S8(cJc8dk7$YJa!w7#p<%daJj{-eT>$&kw`9^YPF2NAgnk)utuZ zKQe9U=b?7kUu=qLpXd2qb3TgiOCK}@A44~2+hCWcFM8SvTt)n%dNb_fdC;@yace1P zurIbbdZOuv(B(_^(qWU7swj9_{&=?Fy8nIXjxt>5Lks?N755B#{|bC_$D703`uqU# zlZyCFMQbH0&Wrd>@%v2+99-WwPsKi89Knfio1@iSd|UcRzU~Ir4-!J_cbfhye!QQ& z2pd19eT83P-&Qe6k9vL;{JnJ^4nJ+~hX4M$NlNkjB>!_qQKzp~Uq$TxUhK1D5&o?` zQ0VM8*?BvV8R;LY=T2To-f!vR?w8!p?TvqXNpwH>4zXcjZo|)}!nd{v^eon2(9+5r683A_wO7ZU<`HaCArp|HW;t!fX9#N0q z^PoNC`HrSmrdQ7N{*(OIE%!M8Rq~A70`pc&lU^~7KDY1;715XWeA@a((D@vV-val0 z{O8sIXObtsXBE$GbNBda)3WZ|8C|_~h^sq4?62~Kli{2Z%_Vlfys!QPp8kh6uHIzr zTzs9-&b=5LATJp^SB4nnytNAK<_9MiX~94PQvEY<-Bh-#3iQ9CXTK&~OV={(XPWgW%htTMK7g zRnKMftvolb)^CGugY@@J(2&@91D+wj?Rvjoo9KeMR!0|I(L;6dUG|zw$UkqP_sb64 zHa_BJh)$`D9QoqO!QQlX_0V`|8NJ-Pqft?KUp2l(z<`MT~>+&m{Z)fgD9)=|^_rq+DkwYTlT=Rm`7d z&DFTpRZok)puf+qbawhGbjk?cUvsxeJXcMWzAr&d65eA$$pR}^nUqCD!N~D zh7&Kaa`{~SX5sMP&#fH)X@8wz#EsL~|Ez^^`|DW#{L%C03it=PG&f)Tky`bPa_Qum z$MZv@{7Z^(YFcniKn4)YJ3i+RxR8>Mxt4Q<{Wy> zBzHuvSh{_Rcnxg`=hO1|Kizx<7ek)gL+Em(_VoHv7^AUEvzhs}vPnoQt`J75@-zdgo&wq-eL~^4o&y`$} z{P?jM{`Y;6T#?*gexK1k<3Y(Qi1*#by2b}gL%mP*Ao#W>#6Y3_uS*jX``N-R_r~Dx zrSgH>okJ{u{*jF9xI2S){uBMoe7)q3=t=e)Wzb@84{0CXog;|{zt5a1xCg!3G^&~| z((}c0J7~kv49B-WK-Wi8O~O5%Z?zx5fo90-Qph#%vjhH{wb-Op_xbRG^PAf*;2*^O z=Gf~ihwJ7vewuUHHGwu_FO|vV#c|`O@!8P@19UQatugi<^tWTSskY5DwEmyfd&pv| z*RV(O2QVMf+m!De>LvInx1NiaHldBTPr=_N-{=NE-)HR|-W{%M+B+0{)v_TR`+VsQ z_T{wmA(tJXZLV}Z-=FIo$|TJZI%f>Sr!CYX$HpIi$c9|s@LGa8!=wsy4bv-}0##a|84F~p+H-czPrWmCO{#*ci^ zAhDRWx9#_f&=}|3B7Ob%!k>A){Qb~QA@p!Jn|VwyneKjQA31LEGl_eaUW(CH0*f4U64mKf^b?nmBSAITT}k9>*E*Xa4X-l7lF89(IL?po-P=BED<|9q_%`8gTAT;RT^ zmNn+eRnhpX|5{J1_||>!_O|Eff4!*x^=TjRhA`jGy#FV9X`M+K5;tEiy}tEJ6I}Ix zn^TGB5BVA@%9m-d2fgt)dXGcx^_#}0F}kD#Yx6D{Wa&?J^HRR4P{Gr`=EGh;MjHlN ze=?{9eX_Sh6;d+K(*1h(ENE2nvj=pxjqi(2M)FheZL1ud@8GhNz*{=F$>83);Fmoo zwa>8Pb6>Af%S>y(Z<(D7*#EJkzecp}A{WI7L6i%<6>xG+d2Gpxx2sQ&40z`jCn5Js_(_C@oyiC;;rh>68QO|k?vl7DtTYu zw!asmPdn;AM=$K@ZVJYjGMb+hJswQQ_S@+5-9y;M#XXdvnO%(E5%Y zg%78d*9{WgE@k4KrapIyQl!tf<0*N# zeLeKN7M|ew1x4uJZ4p1)`7QWSW#R$%&1dr8OuDt>iB|_nGhBX%@@oo_&3m3RiRnH+ zL-eM&lKlTq;mxgWY3rCs-nQApoHKH2c^$_uuRVkO#13xk^PeQIa!a}Qc3TvCf5I}a z52cS)LO*lH0^aeEsjxCGe(>^W@S5kw=L@dgUDuyK#kK!huAO%#dd%E?{p5qswi`Ju zYbf$JEY~t_D%LM2UR(Ky`~RBn!D)Hu?IQR8xp#T~(0HC2Vb6@W_xU(s(l~VH@5F}k z-Sub6bCX@B`4sk}FwI*b*AmcMZDadU1lrH!O@5c$*Z0dqko&zOI?y=G?Ci$*)q3D` zGj`qbXq*M#KF;YCU3b?5#0fdX*tRHxxNizP1dWDvvHp+OTjCS+bWCqkH=l1Z6}uX@ zAGPRg8}GF9D#MAXeQcE1UXd-|TAW61DDJ-+U8+1e_#im1FLS9knp#ET@=Uis=HciV z!~MUXXKFl$UjQEk>5T8b5wZ5!|Kr;yxq6VXvw3unJ3RB*V~<-WXU}ig-p$d8?24r~ zVc&PNbW)Y}so4EmR?W0^`|(T_Q~U-~(#1pQzxJTfJo-#{diySPG|&3B4u)^lq50MATV=Ppu~mmI z+3h>FY16Jln;`g4oQoYVMke+`>qDDi}* zvHk^_^-Yjk$Qtx@%=4eZCVF3Ynz~8eZ?Jg^HzT{y>tpHT&9oQpW4}KaZ_qlcS+spq zDJLgYXHSHLLhD!kcfSz+&>Aj#7Mxxxzo6}xHqWudIl5o_{~wf|v2+!i1EF6w4kDY2 z5;X0>MAKqwv}=fOm*mDaY`HMMQMScDr<>$(AIPj6@JO4bUwWK?{|7T)OAv*pSiA|I z2ft|j)arN91v`QFQHve?f??cWj~prFLc2o!YJzjCn~EG!cb4$3^}_|vK~LT2V|8*% zTY#q(%5N(ZlPkNyXE?5^?`s>`+mbuXFUH`i@5Y1<_XiYwa$7HV!1?T=$fa_o^#J4M z2Na+FIy2HQ=oZ5n+cW3bA5V3o8VC8 zO!`yfaHxulTWnm6-8&I{-)@rZ^^AkY`51H>(uwLv>qT^+b*S3=LF-T(Ph##mofyc98{q$Mp7rDSnXQ{`eYH-$ijyzbBe#yZb>Om-RR4Cm;u`jRBjq{Tn5SYsv*tnb zztOU|xP;c&AE2MGu3blTU@v@E+9WS^aWN}j3$8)_^n)L+K~@%p&axvrSMyL?Yq@yk zgXqDp3!#%|B0dy6pK(<@UHOu;76ES=#nY|)94~A+`Oyp+`08F$x`UNJPX4j3%F?ms z33o8plyJYfZoj8f$;bQ$99;9tDx5KQ-C$F}@`;}RU^YCw3*7K-&4rb<7P8|L#dBHL z7>nm>%_D2wGCTWtuf|V>Jn|rwclT&X+>bmn{U$!+9LgXy1Ai^e1f^QzJL3g_f3dfxi7YnwC$2tAz5GJxI;WzVhpx9HRNQy!){AYt7c&Nv;tnmoJu;jx#DyP?=C$|1i ztp%>%XiU*#k=*#a18r;$Ue9&UD|XDlWnAa&V9r?x61I{H*W1Ar)or^9S&-48OYMw| zjQWjgTY%M9$89uw_=xy?M?I$){o=BmSthu#x_gd&zWY6>$T+M_B*!nu(S_{7Bj38~ zy2Wg+pnJCVVUBy=ba>`5XmG_H+;^x{Z2rASkt(kJ{=JXWzk7Mdm3wrZdv5qCI+7hc z3;MG0v!C#n9)MSRo5aU`KDyxf@V4NhlP1WzZ?86qcX>XOoRH777~IUC!rxS$?&XB2 zS?d?%Lx%q3p3U~{^(T8f+RB;EJbxYUxt+PzBhme8pZrDbXDK^o3;ZzZ0QxxES3i)x z$#3BFxpEN;Hz6mwMsmdRX{U%!cQ3*3d&(r-XMDaebho3i(}%ZZVXMJ!31i~?6!7>f zGDz>wqn%5k_vEfhnE{5|8^N8fbbbBE$Se@pwdlv&Ce7y8xgGi;d=tatcHTVj;A{R3_a zpeYN#*0qB(z{~$=-1*;D&VzT^$&(E7i2iNpVyZst{50vAAidCzU(kIc^K!Z9@G9nd zJ?XUQ8~RWTLGiKuUm`~{7~lOdIc4?KKIlh!YIJvKX*6>w=SF%;@1Iq|yb4>W`+U#2w39dNC#x>X{i)r62 zwr&P?F%|#8Otyu8gk6I@toa@BU-rGoxCSP*74a(Z$L9Cp4e%PqA@o0feg&4S+xz7Y z6u#j60rmgQ?buw4?3O|nZu40hIr;L{L-YfAl-4_HpYZ<*GQiq_@Mn+S*8abSqgm|z z8h^$3bq3`scxfYjjURu(RFp4Hv3u8NkoTZ}!u~7QLjFJ=cF5O^KkK>chVZN$=%Wkk zeUkNyD=9C=jX&+pJL%f5Z^=^Df5h-B`rgI3ioV-`zfDQ@8BA`v^`yf8*1O&NXH9i& zAdb{PSDn`Q?O+{N75854XY;`-@SkMT!gCca1UIeTjmgKLply**7NdL^s6;OmpHny7nZx#@3)Xc+YUmr=knLnn7_B<`%SK=kNMEu|Lbz5 zdG~@J&txaf8FB8DOXj`2d0N(erK46AKo2T5PO~rOPxl}2FOi!6l^ykCWJlG5=ku3h zTm9_bS8S8FqZmKYr{)N^15+m8@~62bPCfxQ`^GYc@a3^t?*2aK`1uu2yY5#@4|YCU z{(nBS+_V?;wiqb$(bt=jHV;C6!%Xss`dxuA+AT>D z@tgQec}}AHP4tm`^cY-zm2wPV6{~Nx7vFt%+ATsXJxkvfKJ4`^-@{9op!j@q%W^MI zZGIqYmwkSq*7BJ9*&JW_kLthnKiFLu?SG(pF6$3Nze)SwsK~DW=YzZpnOLQNOkZj| z&6ZB?8p*T$^kL_`pxeSYc`jc}WzwVWo6ph*0iG?O6FBHG{W(YXW z!yg8wd|~!$sl3R?rNpmO?#FLF;=Y?9k1N0G{AOWMYX@a>T6+`RFK7HIvHcSyZ`ha8 z$$Q#Q-5mJMB!~Mv3%;YRgI``3xzAX3+-H(<%!L+z7S4Ql>BTOeWA0)T3~nF6rSD`T z*tp(a7mJxy!p_%M75)YP;-qbpozH*x0_Zitl*sqf(oUTnT!_RNk^ z{5BB$`~-{)?ZOj^CK1 z7PftBph^EiGr}nFUXog7$ z=_4zLThPfezpE+{aVL=Pj15&8){6wnvVZ8zDLGFzw{~8xB5Rm zuCD$Or?>sn{FUlAbTjn_;BV;u4R4^c8Q-g)K(8$4dB}CjbvO8PUB$oOqH}-aN8xuz zZ+tWMSK1Nc7g=_sE$`28>uKJ3M7Ntn_UE(XtNry3o#*C*mm$w`ngV2VJzXUHvQM}< z4(`8Td=;1Y7Tfe6gH3X1FVy3@w#W|Is|%R(F7+h$ACLG?_`C6xNo$*Y}uXOva9n;G(aOHXBgv-`poB;H1Yf`{{O6o zyI=N@>fhcP+z{?RC4X@ucoqGrf8RqRUk|iP(Czrz^@)whaYV1H%q@X@45ImT*+cts zzz>Mf^HqOqsOdh?`#bFa8Q_=O!XxZDOVM9=4vqS^dk^*yw6ie@`sO*sxBoTnuA4*t zn#Ncxn{DdOjT_$`Q{4E<-x<-3HOA#k0wUhFU;Qtv4&J7dj{$A^((h8gzFPL`4&puH zpN@=i=MBiDYfR_u#Ahx2cHw^HlGaPe-dxtnKB33jP=11c<@l(CaVe^aDgK-_Js%&! z`2##V7ed|I-ZXs8xb6FaMxL{ZFai-}~E&kB@+QQ7RLzrE$&%0$>)~E*V8Tu^v)75R9Wo4XwKp!Xcz&?PMREj0{+b&F$&z zYvoT-m%W{Fw_lI0{H$%)zz^K}Xh7~`3i|w_NFQrFbat>E4{TUp25b(;1A17w$c=ZL zKC1pL_NT^UcUx$6R3uOIf1EtA^VvIjzwF~9$b%8!?J=BVz2`LiEcpdI;G9vIm8~Wf`tl51tIW z7jP~k@i>RyAbk%s1D{=fb_h4OWP5!gee_2|r;jwB^6cx(tN(5)gn8qFA3dRNA1tg zbM2Bm)!N^ElY{Qz`YP?$^fS2CeofMs)PoWao77*uys-92anC>Ccs=c=X*ZXB7s&u1`t_0n-$M2gz(ETcV;0W#Ce|ONmk*7b|6Xf$* zdqVUrUw;YbZoVARcThP8`ee_@bl$Hrc!jB^Z{bJ!sNiqj9%7tl^@d*WkMeJ8A7>uE zyQ7b;@Xl=byy8tU`mnjRH_`4>GZ~-H?OsWy;VzTf%-H>s^qN4=h$}&buEyG3+zXX9Nurhop<^f_tQ&>hp+w* z>pCj(VZrqSE@O&AZ-5^tNhD=jaRS!MQJ()LT5iYhJN=;Ph2~Eo9-jJnM2!^i#>e?@I+Yzc~Eq zoPsru-gV-5Ge=s0S7Y-`Q(= z-0Ig^Dh{xU@lyVazTe+VoMNAw_ZOY(UdaZ@ktU31%^&Uk-B0@bD!u>6O7~vTam^1I zqeDUKd_VuK{1@dmADsX{6_6tgA0owK`7eU4pkKn@dgkxWU&~m;t%KA)?1!2I|BQR# z*~7G>+VIG3(>^c4o8l~gJju1lw7P>LKTmO(9pF@OzJp@jU|%*FQ;RkJf-5$o_b;4+ zAAS({tO)?a{K7MzV5~=)Y*xou{!-limusT@3)PR$iOau$CU-7%dPMy3^&uNKNSf*Uulx7H zQ(^vw>PH(#c|MX4nhQ{#&|?piFEWoaokyDFRp=S@PjRM#M|_-$=g;kC0`qrM;VRF6 z7k9!h&LKWo+{uS!wdn7gCb_%kZ@~*^IJoHhAH9jewlv8#!aP{P(Szary7nOF!JQw< zmj|%}8Jo}#Kh_rAoMW`4&*Det6wJy+5A<~JxAi+r(y#u0>lb*wm;BM%P4><)Brw^8uV5jQVjGH81%XA4+60sQPsvCru4^3U8l z>D|cXaGf+UP_s3|B!zyq<`o7Nb?<%r68Ft#$&uz+Z{N^SYvsW7HepVKO;$Ni@FNyG~_Ng8SyPWX(AFzIQ+Tdl_@u z(3(n@o1%TJ#UJ_4x;PnoGzUG}+j+$cbe-s5kN#qmvF89>nZS2l)=s6EtQ)*vB){(a zH;uW_>D-_d{YZK&dcNAXFW31k46`P+wf1%C+YI}-FR=B$eC%p;COhtvlTRNx z{O;S6r)5nX6kWcniL3w1ywi|jLq-khGjz!K*nSq1FbW?}!!c>u?gpD6+__cDt{qx7 zCrP+P`&P|6+brP(;5RgH-KtCX>=vEdb!pe4dHW#vA0++!XNSker{0h3#B0%$g~)=U zAGvm))ymls8b{?PjO%FiY;Ydetz2SEMwdv>+ISz=NzX~necYR|-fbF`uzW`UcK?@l zaG&O@W*|fB<}yae4DHR3+$M^T)#vvQN;^JO4*e%BkP~d?pq8qAc0Qmt?;Pmpgxnl+ z-$9eWmWEEwJO`|=uEth+$9?me@U+`c(CXox>CTS$>IQu8U&)J|9`#TA^<4|Cje!3Y zpS$KL@u%NR%F}-R*p8Oa?g@0;TkieZzmfe)8$IOTFFrh+0lL~ryO_k{BS`k(k+z3|*U z>G{r;U3{&3F8?7ZH&3HXB7Xj@JEniwc(c}f?_iIg`ji0V^&*w8dugB(JX%F)P9t_Z!on9LotKa+3?;P64`&Hky%p{lhdQk9PUq^7&F9Sb^ zJ-o_7?6mI2ob{cq`gB1;$!}DJm+RL~?+SVWDtTZzcCu6C%vou%Mi#~_>TLWIl z7HD7+_IUgV|AkiT(Z0^)x}e9uo)dKW9=Pax?>zhxeh=we|3lxgd~oi!eo7&@JF*EK zfL#$kzb^U2{6I`Tk=w0Y&a4cdrz$w|%Gv2%fjz+(l`^$Y`8;9vvNYd51ZKYZS zA3i*iyIMbAvD)d4TK{2T%UtKFkPyN`_Hs4P29>1Sd{9+AbDt_?? zbMo7L>@}$$$1kAAyduW)3E-t!-`oaWk9BsP=KFE*_^W}@eCz+X^$6=fD{SQW1#BfO zGtct=X7;6+gFW5P8t+2h^U!_T&+q&OdjA7k9KCD(X*kzorxTj&<00qqJ}a50jgDTl z2Wd0;>FfFR4BfvCc_4nF_W!*X{B3NqR&c-izcq*P;rSuH>i_uuOYd6_PYdTy_06e~ zU8Mf+2M4s?qVH>=ZQ>!z*f*km>G|>rTDu-veqy18T-M9Si&?!U+vzoZ$Td_Qe!S>G z)1iY@C+^qU@wSRl|MY)+|FG+WvIDUcoZaP12&Pp|H?fk2Mf1JTPAn*DVu_qbX zxvRG6bh)V^d1mvptY2*Vr1ibvOy-v{PX54;PZ6*en3K*sX&-)>)z4mgV|~XDOb^ya zTD(r1jPY*XW9K5^y{=;?_Mcp6 z+pk~C?>`azH*iyWpX|cjj9>q%re0t20jhmFeq$Y6`6|BLfZSaZ!KDwa%ZcJSpMDN{ zI?bdP7#Gi}`%8E?wQv2W#0iys)||T7+qKGnwTEYFehXV7m%v2@6Wd;<AKKXBR!AbdVMZaIeR|-Bi?LYSP zE4xyAUizR{tB`v_{?QnJ(D{^K@55I5C;fk$ckO5b&i|{;BN}Ra1mAIwgLj$8JigES zW$P$(@}vM4ee7Idn>H75ohw0)YdFVQaP41x{8V(7E{=XwpZ|bK3FVE}Q#kL?mb(VK zZ$1+_VnqBjj3*D+6Kr0B=g#RGyT^d8-BI?)vl*K z#rz)2;&U`JQ~=@gT8n$LG3 zeR0Q92N(ZgE!FH;{ulVN2)={*mU1SowST_++lPtg)P8ua=Pb%*{Fj;5AG!4$#k<Qj~NT&=<_Vb zGY!8Nzdy6r1a;w+DRKK=>L1{JHlt&JN0U|)>(~gpI4<5?@SOvJF9P?{fj0wwhGEv6 zd{cbaZs7CESpH(xmxm`elWFYrvDWCYT-(sj7<*PTjX7zY^NR~V)&6hbNGashyWFd1 zjoKXPJL2EP^eg1ws?W-f__yF|dqi;6cN~u7v*0@lBe?2^?uy{b?_SW$jo;w}=omhc z`b9K;y8p-2=zi5_tcvbe|L5Q1^kIG9Qwg0fE+2)~PiFBqdZwel?5*gl8%@nyyj?86 zd`I}N_-p1|;$`Qd?<7Xg7kp;|@HaVQ13vy%3B-AKD-ch)fYZeKV4J&^$kr|F1K zm!#|zrV|?{f3cm;KudQ^*fumx?K<45{u`YoHcdyq^T1|OdOe& zdEA=F|JS%q11?=ota<`Gm=ctOfAYVr_x}c8#vX6CXn*G3*m`1*@EFiz;E(2~+pcJS zRNuKcnjgu}9mqV%&%QIbHXnE=bJnA#kCQ*ZcXo{6s=wdI!Y%(%e9*-2xo-$M$Z4Fl z#&=RmwBLc}2MO>-PrtSf4cqt^lTO>c!MBZ0zMvo2|9Qc4)4hJMmU-RTGlG9Q!@mEy z4?Fp8&mXxU2fBaA^`AZ8=J03^xApQt_}6=iqn{ml#87?>{cyO8S~0${(uK{-gCdJ|6|g~8T*W>e~s^dd+6mQ;`mD= z+a-Tqg4X}&Y7+nD`IGFWN$HI5i}2^~@$tdOzG6Sit$sg@xF{3}o2Rge!s{Z8AFuhp4&G+t zMR?DvZ!)G!1JnGN-#4l}a67?4`6Yk&C;lepqsG~heI)&A$84uxDPQ*=%yD71X%7l$ z{+<5%8Tt*lvjaV$`oHOGoc=2Qu(LzNA5>r4)$<3&>aS%dZT+1;?k#iol}BG#Jz##u zbpxV1c7EyVmhY`UA%C29-L&ki3CFX^|F?aF;F)MaWiK@L8+csiRri0XCn9;Q_@k=#&RY$_6C#D(d(xcy!2R|XfdpEssOIdf8Y zzw!$1feM*LOw1?yEdFUp$L@U8`ncbh0Liul{0T~_}K60RVx zLLc&)#O=otJU118aDC$2nJbmlwUIwsIG4* zd7&#AM&03qgZtlOj#Q3_fh-%%e&_bre~c# zDe_lKe>*xG-UtSYzpp?>ZzIX(KSTbGeE+_Mlb@2msu#93&DS7*HNNtn zgU~nEm}YD67n^i&6wE9^=a+rRW%jHrx>0vN=NIaJt(zWV-ZVdB(Y;W7O?upZw3g75 zbZ+#wpyI{wM#ejFdPEPvZ7G1aiyp_mgN)i^>Jfr|Lj5gw=!y8#1w}WFI67uz1@aZL?h6u8Zu5@h8udqD?t=eS&vr18%Fd$#vgla@=>RrcpdI@#aCLT8z;=C$GAF zg}wELN&3mlD|_Dil@6}+o(?24whP>O?{>U?fWC%+%Qw6CU5QVkep}P>#vThI~zfJv|Ek$DIx?dHjBV)&TA{NfZ40iJsqwUPaHcH>n3>*OkpM|U)bO0@HHcy z+$$dtCzXmm0`D4I1pmI-^tjo_St#E6d43=FtMj+81|L*hVroqC@>=H~eAE&J^gHCl zK=Ss|PW?VnJbe2Z*tqC0Ef~K=Y4En&(09*^{IBgtAwQ?M@fldnee+qJrC{rS)%;!W z@lN`f>d&N^I;7mz_y_U_bc6?gejWV1GP-91_I(F)GFwU!)&v(l>)IuG3bk?i zp6<_m&B5hwx#2TxtB$5YEssCKkCmRLbbqtC;NVxm`HJ_`^Ccg4{^;oSX3o(deU|yWJD(T|eBa5Bx%VgOvz;Ziujk)%D?TO0whQC4rh~m^ z?z_h2IcU)snMa>kp9unZ!DID|X}lp?pAkIw3-|n&&}-*_XN@OB{nOsI=^5Y`^T%tL zN!#Hk?VY}6(s^!2?qBctmGJksO%{i{YyCrTorSs<9wUBc_p5;4ly2KYf5RT&?YzH@ zxxe*W_*agp@w@jo$(|b5gZ@8Z?=v@!g=f}M%Z}d*p1T$JJr*96yN@`VcaDPx3H0CE zV_DeVuiER*B-KMVji2;A73)vCi1ojZ(A_(mQyTmE)qaj0InE!)`j9=F_|m~9b+}0p zzcwW!@nvGShW=ok4G9g`c+kd!WPxcP{ zbHAGUjUE1}Yt~s8PFT*LSs z_}0o4;$+-+_i!hQ~6uU zef?>VyByi6CK`IKkIJv<1sw@G}bxHLFxm|DbI#}@J`@mdGyR=aCQK^5k8sv z&&bcG{vlG#;cM7~`8u&&Z}3mtzFgt`t|}hy@5GL*N^HZ@2=BE{QXU)`k%E7`l+(Ft zuaELj%5F&j7nSc{d~a_$_)FYA4s1I9>Vn$UL9PI{y2n<`yp(Gjia|ot+&mzBF-^ z-KRl_&p_M0^w?dGIXzbEAoHJN9-5j~ABO87z}GKxaQUGN!Od=GnO1vz`>bo*Ip%eO zp_7q|Y1GI|ksr~$`ED$~QCNoxOP5w|UxoOB+4Z#hnehzD~3kCW?WVf>jb`Rp}q@Q@}CNPM{)9s;k5a6 zU*Va%7~lW4Tu#h;#vt%_p$RVN$h|L_pz7-X_HOWF@!zlA_1%g1&a|mt-dS9-+|18- zeQ0#gE@ZZf)#G=?_)hlNsaYdNWpZ53)azO!_RO&v_(^mAhy57(xqpwY-3Im=+;yPR z8usqhr$-R{{~zr{Kh~kMH!(p2c$~_RUG7^kbt+|lclP!%@LqWReNFEldK(^x%v!s| zG;Qhqn=RoZ!+Ii0@2MSH(?sZe$;? z55fx@SbY_`3rfS+MR)LxpzL_`$=RmXSkE`4Z)|wZ`4h7DqN~1vK3x5Hf5NUQR$sRK zNsZTT7wOC5JNuV8zSFk?w#6B&G5u<4J>cF?G#8X19zuNe0(gQir{tM>qHD)@S^pOt zc^;Hu4QJ?P9fxb>xrOf<;o$0j8RT#87Uq<@eE+47_nhupl|H@*8s5wP=lxzEmp^38 z2Hx*u?1G!%fy`Mef<|?R=12RZrQ<2?dt_tAr#ItyarFLn{|48E`JOL>uD-s|vVO~# zH2yy@zABoZ2`7UOkDKEA{rogW2e1A(u~2srFH{lPw*VS%VrstTiX$XpWxm$4B>%Pmkc#gGv_% z!A%Zs$9Kxj4u1Z5?wijcNv5gr$Hub_+kqYOl6ybuff;FfpJHrYH~A;ciUr7nzOj2v z0zr@ZPva|nd3Qet>kEJPC85NmTKp8e>Cf(0&2Qy8*mK`%Go_Pj@((?VT(RqKykE|E z{4iTh@>?FR{05uAiCL@-DlhgsQ^C*nrny?w^V^*YFH6N{VhramHD)t7QZ~-N)6VxB zf1dg5boz1-ee`R+3Tk|{XA!x0UN$%puU%Fx;?M}MKjn8L~bNz>=$weW2 z4K%d?pEtCr`+xd|{$6GJj`Hhc@&_*M>HK}288y|nooUj(bpAl+|9!-b&$Yi;A8@?? z*Xpa%iC5i(%*jU=ewAyZ{o8i_bT{jx!BG176SOdHWMpqK{y~*AY(&=O8EW$@^upp% z1>NKJ2Zd*o;pDw0Yw9$PpXD`d(fEpf*l%yoH&wh*3HZD8py@in^Edeq{~(?zYazDo z54LXJdB(I|;q?N+cjG6p@VC+5;B{{gF>Sl~xMb1yRUPoVL1RM>;!8=#e{;amr=h-r z@qMnP%RkT&9rE0^wrl6tGWBEjdV%K;W#EP7JDH%|dNXpUw--bogTNUTU;+sP*A#vH`!b%Lqb_2*mYe~B@Tdd7|KS@7@cBE3xY9b--65cs?L zzn^iD4IA2X`X75P7LO*qQAPY|N*idu41Fvg@h8O(?B49+L(aI6_Nu`H2AWo{cz=uV zQ-%B~K^8J#^S#Ej{6tT-^kMBqe@#&OVr0Sh03v(Hu0I}R{KNHW)we$!txt>o);xsW zvl0A;K2`s6t*P0{$HQrTf_$v8`&Fln*m(%8`eB3Ru%@-w$-gBt@$oJ;N%fulv-n%Y z7_)yasK)s2nFIglyinhN+rP)(bnVNZr22tIZv9dCNnS|12Jjy3Ke&z9pgRUX^AM@(&t-`E6ZPZzEkhOg~(#x5Ir>#g(Q9sUbWo>mLj_$${4IVtNA&+g{8 z4zN`4s)-x_A9%mt-ZjY`z5Eq@6K@!!Z`F6Nj_6zKFZ-BVtv|E=ZGG!M7MtW6e*L@s z_xKwtSi9F;27j#s4%YZ0&hBOW_klMmHW#112bn6j`SDl&0TIB7gIIoR?SSHDX7v*W*8p}HH7 z{Cjtpj}iEuQ8BpcL4`X^;v4bsu@0{B{jDy(gB>PuF8FEEk++)He@4&O|2#j&A5VT8 zpT%VSOfAtJKS75X&V0-;X)U~6EBe_+|A#$|UdGs|j96`I>H8S;CElK28JSdHzgVB3 zX;Lln%P9V1`>Q+yyj1^G-@4Qc{lxF9%1CEi`Lq6b-klPZT4pBf2=#mLjs1ppfAenm zK;2xPab?7x)xSLt*!yhz+eXv>e!zhY^rd*|KYxNoX-EB2 z{l!rx>0*Ds_EqVOXvyCNFCb^Zh2&o&`Aho&XIPl23*h_xfWO2O;`}lipDlg7{&uIU zf1YI;J?-&d`*Lr%5xRyh^nBHyn`v4TzvAd)0x@k*;ID_i1Xq17`AV+xaK&e?PltZ1 zG0$(~e}P7mmKdnS&5!u|I^Hc@Z_2%r`a^a->4fWJdpRh zO?WCj=I0Jh4uj`Gb$IHU=d^B=XyM{hl3n6s%3HDRWUhbF)TnH#TR39R%wjF5Ofwo~ zoX@@uy}P$*Mhfp3d=G0H7XE{~w(dgH>}scnT07{axzOq9%;V+AltswRMdk{fo1^~k z*~K%LIys{_m7NZ!hbT@(aOF@4b1i7!!3zE;Lo3DMdH&r_&PtBu!_)rtow?%z&quZH zL)Y!Pko4qc;Qj2+<%&#G|E(PO4L+@XC(CyrW5LVIt3`4~cy<8Ud+-{Ehi}0z*u$P= z^OD&3GWk{P{Er$pZN!!1*)*nc7yWH7a{7t(7jC?i_?Lsn#n0Hi(HrkVb|urlMszZy zpT*SwQufflzsHx1E1unE>vN5Ja=r?3HY|D7UCr7V|KYr!(yS-Q-!h;*`u`Q^)I0IP zB)R*`?26I59jEQrF@6t&i(I2zwC6U8>`2si2+JE)jGTTOn3^&epJoXqrPt4)e z9DD*5&Fquo=dmle_!M^1^X~b4j;g{w`*1w-nmD-l!GqBInuTU$n9u9X*BRs2?D}MI zD)aTs0mlCNh#!mJ!{05x=ldx)im4pk(5nD)Td5f}X;X=jZ0Xnh$I-&Bq|d;?6thQws5Qhh0l$F7fjb=KV&- zj$DJD2~Denc^^g+8|gd+$N&Ct8TffU)&b$mD&h6FL-*4Y-EZ-~pZ^v9saDL{I0rkn z+3p(%v=&SWMz4d`#BYe3%JFgk(pwJFUd*nco;Na*yMpIsMsVsuy>$^>>v(&i2d(2t zE-S}L{wC9KzL(3|*Ro-u-`6tI^<(TJlS)4LhV;+IW$d5l^jgK`6+B73r|EaTvFBP? zeuOwPmmfhNOJE&22mQ3Nw%%F2+rsm}FTusHbS-3Y@h;C#tlR}ZRK#z#U5{LE8w@$* z;o`Tm8#sO|_|be~mv1l)zBFf+R{wPWs%M;DE}h4h8&C0m8@(TAW!wGWvP*`7tDGB= zyujNf+Ry$Tcy8q)?Z3GgT3cXJ8o1{>y_UYquFd27*Hzf9_eXkz))`ggwbHBd_=EK^A@aY@~PT|9HJi zaSq!D5l`O~`OG{O9fnRvM0%y>pM4N^{zd19fFGS_l5h2XOJYr8@od+2bnk*!Wkh9D zp~5l7w?1@VxE$I*Dl=&(I~AbdBFq z^uAALV%J{~-EZ}NaN5dCu3-(?{CcOU^APLEdcNSw-z~fJ^i$zc+2|#oM0{WHeOp+k zf0KFR+1fXfJka~aJY7HV0s7b?|89J#UExhw#J?b6a-av7?i2rv?h6u;UwI)v;6B-T zdHh*BkMR_3Y^h=TZWiBL9JUyJ=WRL>U)z*9Ip@gflP4l)BHnEBwz~VG^#v;jv#w!j zA#?P&@!45ZTZ=^hU-X~SzwpkC)kg5;T=;q3`S3yiywZnEX+8N^!AYe+7n>Kv{_n@3 z&xIy9|3UrYN;p2#|3%Cg^BES6Yis7a2tKNH^~y=mJ@UBDb20hv^npvIsIk!$JiMpwJ-L5 z2Kn(-6t|N55%Tpd{9v!g_<`xp`f0;T?izg#g|>+D<2>hT^{WH`G$8-U1&yS`uErRb6T2Pf9?dXFMZsYIa^Kb8a{4S^74g*NM5Qw<^D)s zO7HsqZKroh-eq2g4qL}`tY_sNc1QlS>=7fc&di!Rb<)(#u_Gpq8lN@Qbu;8EK^F1P z@>6Mk*3V-;^UWR8eE)Pl%JMOmcXxtA+F4G5F>1 z=me8|R-C-jnKH_+qaq!X^{mROAKUEwjJr1?^Y((5tBE^9UKPJ+>h<#cR(_uRDc;Y+ zbFN_gZXBp1irQKF6I{Rfa|41>YfMn#Ru4ZBe%*8;{3=LZ|K-0&eEbn{9h=oNSMqOh z-xj}Y-g3+T{+>T#GxP9&)x&}RmYF#sJA3N5E2n2?Wo9;OmYF$W#Q5=(MrLL?@TR~w+$sq5Gz?e%QI^WkCI_ekEiAc1)&_gjO~ z-mh)p|8VfrJHy*@?K9F>czaLsIe)j4&x!-f0le)hQ@4Ss)lmIw^_=TdVL$j(Iqd%q z#6yr*my|$uK7_B|9&q?7zhy}q^qW`BnN8)lq_JJA&{z2010TyP&mTM`?+2b44uWg` zf93Op{ASsS@L|cU%zr%n_@$ipGvSG-EBVlZN)+eg@c}_Nb^7G&%#o8=bDuQ6wS=Os z`;U0x^fWK~gU+9`ru3-0SD&@Udp@oG=ZE~V{^abbp}gyZ|EtLj(e>{9pJ~&lP0pJ5 z*YzgNTRzuo-lTUC3vFhMHR;Vw6+3U5_ifOh^m6$b3a-PK@RMm=%g2{mIPx*n+w;cI z-VT%YFTY>N;>{+n*WHPJ_!089riI7a&)*u|kIpY&MV%C{_j7-cQ0(Am+~(>V5={MK zlWy@&>qXw@o1^>XW0d>GJbuZdEnlkI$3xR-0l6)WR*O*bhQ zhH~W&?#GUlo~`fg(0A&HNUzd-9lYJ?B|V;Ht$i$u_e)}WiPgK5i%$1%Z->p!+_$(j z?*8%E4$R@`nfR9{y87M&rp^+-KH3l*c>p_9r5wEG)GHagjiydv=nsIdIo~~Y9z1pP zau-vdEtJ-8wU04*_F!b^=zr{-*!rT@FZSX$8;87>-)s|h0_az7q4Vzsg8$gh!=Wka z@=eum;QJ?~mX3XQ^>%h?n5a-nI^J#8Z(YfahR0<6<+fGAzuC< zUITw9wZXMtZnlpj^LTmQ!|;cXV%>=O#U4z+CkhW6xz6{?Uq1~!{i?(9*CQVan>8EM z%bmB^7G9XET`ewlQd$MkO z8R0IE#@4&69XhIki&sJ(1a*lmseYarafA2EDF4yk^$sq6chz`gN}(B1+w(i&{l5-z zUngfrsGhLF)LaVPnRN8NCgAld$4}*V(*H-xn3N*#cM@F}&GU5K*}jU-pQ$m->!tWP zf@Iz|qZRK>dxL&MPnjRt5sH7`QroRZOCE^E_q}5pJnQ|_iiaZqfQyIf&t59tq1i-} ze74t{wO?y1{JP3A*Z-~f&gz_Rl52+Ya4YY&()FtzeNd@)w)C55J$qj{M_1kNC1wb^ z9bU)OXzcU!iSF)ze@b2`PW!YEsT2SHq8U(HbgTK>Kitv%ALHmhyrZ_?|ETfXm&k97 zZMfd5|3i5s_{Mj+rb-0gy)1&OeS1FO*NhSO>G`uZlUL!ONh$5tTkZVM9_HjR>m|X^ zAzU}Y;g8yX>`nY&&0M^Y^rsZ&o6@_?{~)jSwKx%9X!}`q@xzCjoiRUS>STMr{n*D` zsr*H+_IzRb#E3Ka>;4P9`V-=ML%n+NeCGQFcdtIlg_f*ujf?Ud-N9sJ zzS_mnDGuXpV!RZmacW1#pd4`=15I*8)_Lu`^kCi=M&rJZ|KsOncLDR#HG=E^5U%HI z-pBmg$C>trhcHKn!OL)+R(i}n>@XF{!w;5$hvaE_#>+#&`OTKPef&3hoGN>~6nxnS z?)N%gFQ_xdRQb-h{GrMjuYB{8SCe04&6@YD{YoUSbbr4Y?*3Yj`0o!)`Ct4#O~tVl zbhdbFV?bvyUd`@~uGaaQp(>Z~TSK$A%T!HUyVY&9=K|Kcb$n4&ucMl?>`}OTl8pysE z_2a)@eKo`(AD*@VI_YP-U_Xw@PCGJ<#FE*q$Lc!fH)A5SQp4?om%g!r`K#2`)Nbze z4VxeLB_AhrC%P{6Z?>7_tseh0{$tZ^^LGB{F_-`DXUbm@H~;&PZz^>*`tRMQ>R~@W zy8ram{`bB9yTnvG*Umrv&5!KG%xPIure~49!(C?kuQ(LWv5V!6v-LMjYB|q0<$qRe zkdHIc8DM5lvgr}-dsLj;S{jrduQRqLr(>5*j_^bDH-8R%XD#~hbNJJj;!jVAlUwLx z!!L>SF?2Dlxn!jHI1#Nk-1`tdtiE3EfNL+5H|-CYiydEu_OJ_VoRXCb)W2_I(l>d1 zM{(H7J*9n5vWt&E1BH`KVi>0?eXVzi*VmXI>gMh8rp7)$Kk~0$RmRvnUFcgul`hy! zolWCPzJ0;>u`aJXUS~nuIh&z}PRj3^)J^v*0(J;%@=w*r=U9h!xyh} zs5)ZvpWDT#^mx!zwd?cyenw^sLxyQ|W*yTj4}@I>UDYef6mox1E)9Wb5PeGp-q9Td*Gm zWnA6T_2J2rCXIKhnB^mR*)s?U!GU*mruE~E$PUxV(l6-h|CVoc9ewyL(qG$L#k{}4 zZ(q3QmBYEJn%FfcVj`*cUbdJiH4zxhih|6LYJg^+wTGBieiRY*Y6(uUCow_APPO^gs^!l6ao? z>qsvfo9gtkv&MsCF;03H?wxIQyqutSe8zbNHHS+HL#eWKC zIR3_W5S(t;9l6Vo&lAX0@S5=psw~9kHqcmOFN7;k!Rzgf!OvqhmOxnGajogm`hxV2 z#XMj9a}{Iz9Pe;ZHOD{g{J+fedq?`kCjLjih~nVBb#|)OD{qE4A1Z_o6`Ky>^QAXW zT;Ta5RQ2uy1c5Fx$<;i6mHa3ep{tQEss8&EQ{}8U{bCRAq$2&~DTCecFH_}8FP}ue zdCr{;~W8611a&d^Ku}AUr znkI3%w;R-c5&aT9J;L80biFH2j_3!tV%KdUnW`-$mmm4A&#x|fx_FVZr~7Q-e&!j! zS-U}g{^ifU61vg&6|CcLmN9JyM(e$T7u@LKd|!$#)#mNLz`3XEm5e*OR__FG;ne6{ zAoc&D?QVSDT!v4C_OjYV{108#{Pu`z|0wVI*7xk|{wQi+{Ih7b^Xn>45;3CY(+(y% z&F4)OeeUM{wEnkfICw%^3Zk_Gkq&MkyXtL>@Q448!ynmQiO`1RyVjpxoxyxgGX1md z`V;Hn*P_!DKpQkD`Li{f^{LZMN-r;e1TT2n!L=U18Ib1o>L%r6-#_G6ARXw-edrBO zn4sL5G!({3fghTmJb1GF9r9x;b|iPV_MhU%Tx{RsxQ~MO!36{VwIu{iyzqm99qsSj zIX@$(fA|~y`pDHSzh?hj$j>dOAIT;<&(i-hKj&dv{rKjGG4 zSc5VB7Mdn^dOwxr>x_^50ej{_liT3iEh4;dV~9S$eWjPOc)?W#8-y$YSm z%vxYh?&sItIuXBk`uVO$bKy-wwZ=}}I&YQP>TDQMzylvKW zWFAW1rcRvNC?BUrKJB0~@<#oy{4+Ka^ULOyu>Yp}vz*OQ#G2QGJUflN2D+bQB%CW! zUhgOT6nuY2*39WYdzj+!(~iIP4B7ENgXa%m{5LCKhs(#J`8n9#!8N|wo3L{_n56w) zuF7ueb2sfjkB{Z&iwVXUc1=z`U2#2=*VO=4{C_>uaP$c+NiaHRL6ORj7?&&rJ; z=`wtVuOp+DM*KtcxA!|IS7w4suMEa-@JIw#`8p&z{7 zqy1S2pbr~2k%2t<&~~BL1i#KN{L-E$l?&**FUf?$+3^?r5MyHPcHVCa&&d1M^c(K+ zNBDQ>Qg>J1x5C>^J?uVr|0(#D61bo7Q9h?!`1>dMrbdppdxd|>p)UNxA8N}Cg0d66 zKUCxU8+fO3;RWuS&&0jN6`6F#8osid`HlHI`Tza6^*8I6Sm2&-`4{+$omr!$=l>eN z!SpR0zab;JmSjRDe*83lYniu;f3?pJvKapsUqt!EG(HD3XAe34QwXnG_?+pHV_G#7 ze-M2aK=;;f0DjH@e_1Q4wa|~B;y90fYwY>!dSPnYwd(baG>}8Jjf@AyOZ~MmKV+W`96#@8PEGN?2_U}KD-nRPBcK>Mg z-SgXt%NY}OXut2@3H7#7S>v<*YrTzUGEU(-QtxsEw(aJ(SKYJ9ZuNeug6P?*Y5pZ2 zkfA}Phsn>!eN)!}@cN5pSvFb0V-f!9fABYEmkGayKpU3-U(ET{(7**b=7Or8|62U( zfPB3Rp9^a#^=ZDzPo^4Q_WAM)Yy~&Z-HzTty!0h=@tdU`kH6aUXYm*MECiRK(HQ=! z{f9d`xYm2vn`ypjXlh>Q@k{R)IQ7%=r`6#2+E&4(Z+iZ$=O3Uq;-81m(FxE zzqbrV#~NztCHwai`~c&l=gV$cvz&HHo4Waa|E2P$_aBek?Be8u>TfPJ^+WoV-%qiY zt#7jZGJ9{v|L|+H?$8FAs&X)$_q&LD>B}0I?84UAShTzhCk-L*U47sONvx z+wl*bPw&e`;raBE|NDA5{kuzfe407X0OxOZ@cNDH;y0VQI572ZD7IbcGfeVkKfYFf zVQfSFM7qr5znGe5di_Vw-;nE`I%HP(cx}b6W%YN#4>0B`nm=8;?fPKof)GE!@6oC7 zN4|3yzf8tBg{V?{@Ex-(GghrzxKi*Ej|K5|#nXjf&-;#LXUO z_r_)JR=$=}&~eBgn{MZQq4!b??CqxP$GoxH$*tD7l#SFrtEK(YgxlZgQe_h~lF#jc z{mK81y?iiSPj5S;?HSGe@BaE_@J4uQSi<#|>=a}EfzB`reNE*Ud{}zW;c89~k{)oF z*oL&;rq(^)KQ8}WVJCdp_ZxGLfA3ooOvgL?y0!S=YwH~!6dtW#My`cZ#cG>5ISd}? z%rh13m+_?r>wlJx4)$gqnJ4L)x_{eJd&S@gOh{vj`;V}evN|0&cCWWFyzEDyVys0p5r6BF~F8H z*D`itdE|am?iO#S^L*>W{pN1=*Z&KhY%5nqcDP+b9Ru!(7o7$!JU9nAaKwy$)9>?C z|961@c3&6x;Y-#HK0aJ_^5$mXGAQvJ`1CFF+Uea`9$LE}NB2mMEIG{h!0Vsh6v+|U zsayYqc8@xHWBe%O+>eo+q5XT>v#0%g(vx+@(c8;R(m$M@XZ8F8wB3Jh*fkTMXT`#Q zLH`-ih;gNDmC9^J(zozSXP^{v4oh+uJHLu;4wBcKl!lJanDfTslYR~!!@EfjKE^nL zX0`7&HM^Zi&pF8Z{hdyK9?;;7b$66$OuQ-h9F_qqT+Oa;5}$Y+o%-}5(J6L3n?9^O zV%Hq)jU5;}N>F1haa+(qT>cilw>_tPM5evQ6pcrCu8j0Y$)`$^Ji710255bbj6I--2%jr$YNlb#na2;`0RGO@kp^_1(+k^e^DsACBOv zv#%}E&wwB77{OJ~%Z%Wly!oat`rnkuzB+i7sda|Wk0AR%Hoxox+23cs1YhZFk_W`u z_l58+72%C9l~@|LeC5^>_zLTW;w#eM_tOT&>F=ZO6sc9hiwchM#_Noqi=&cV7gTKG5TBrw_IZZ3WIvwb z(+A2sK7IN~r#o-E)b#p3j*lOl=-|p%v7Is5lV;9;D7?Qm|HB7VE&!)|Ng9ehWYV!6 zTf_UAW7(V1$G&uQ5#}SY@?J8#-vi7$H2(3)v=Arn+f;>je&^zsL@$?(2HzW*q`6)n z5x)0$mbD|^eF!vJwjc4ZBrmo7;Q0sd!-oVP((_q|wdW53tHnN#hPHo<>A|}kT>9ve zh4#)`{(M4<4>~(qrO#FFo5!4A*3`9fM0~igjPutNfa}X<7}NRYh>r@NwyyE`)StdD z;2GV_$oT!c2cZee=ZA*vn=7}lPJ9e}wDXeyE|f(Uf5949Kz&`rPqfa}w<&Y}eC%FR zr>u)V)B6>%c6MpDgK1xZ=$4ZFm0!oq=+6ANb^1Q}ip<28=mABh#-paM^nIiJ%tgy| zi{mFpdDq;2cR!iPRN9P61(=Vp>n?Apu){TjqwsAGmOAEh;=l)pc|A+hw%GLioae3Rl{Up6mCCux9uQ90jgJGG-&5!zbAGG=~G#!>! zb>sBDlh9dbIlDpeu1~M#|LLaVGEdLCA3fNezw&w5g1PM9&cAB;$)Rgp|HplU51+A2 zsTlQN{Ged2;|ChQLnkwSubQNd==CNY81JXGSn(6_8~q<|pX&aDE8KH?ZI3-aiTyg3 zA6vcE#PHJ;Qs?FCp6cxejsLet-S~?isb0k4bwfSBl)Ne$>-00_r(2hUAELBrTHVWA z*~gr>V)vPeeqVx~2czbU_Vk2LD^E~oX|gH`#0Iabw12a=x5|Wb2di+S^ALw zw0NPV{~+O4#PxHsT+G7v6)<8a!1QKO6W3QTy6wp=%E0FptfgpAu-e&q6wz+e`lh=Rq+4 zwp28w-ZmBOK701QTKK;G_?~-t_(`VJK66rRAO4TXAjNeogI7=Mja<+QEk*C&^cluy zFFMb??p~dBn*L49e-bD^QORWv)|;{PCGku7r@6oW0eE&t*S@}wbRuphE}mWR8~3@p zlAiM4i%n-jLt^rJAY+dI4-EmmZ2{|(XGQ)$(eKcC?mp3%>PIRD*cU$T7kzNbLASnx z-5<~em8OsTxHsK@Srh*w_rI`IZ3Lae^(*=pBwUJYTm;_%2O5H>73M|H7yjiv>-fVu zXnAdQg0fg#SBuAZf6>pOyoi2OFC1l3eEv~uAAL6}k`JmEua4{!@>ZL}Q<(KK^(6A@`EEFP=B_GxlZQ^ksB) z;VxIV`o?Z+KS0Jz4m$FCTn?rc_eiAs#8q zkGJA-OD0dxp5|bBf6ZSZW1^z@SAA63;H;H?{sk{#{zJIxg@=Q)c6hkt^TRK=@t3~- z^?QteHK(tuea*k|a)Ed#TdIF&n$$5BEPkrLN6NY1D|htY7ZH?ZN(*lNB3Tu{g)I8V zp6cou@Zv=#Oa5t-PF~-I!~@(7Z()wb{|dI_G}>rt4E5)asr?xVuHD2O|NV|>@r#dp z61*tQ(HGxArBjW$a#%#af?v|o!5{gAYg2*8*$eR3pb7+!e74_rmu2OrF_ycm5KHk{foKIY_<^Q7ZqAni(HZcg`$}{E7 z`E$Mg&~z5#34WBo1I~npUJK29nrcqIA>1zlyr`#xTm7Suac*fEeCXw`;*#h61HUSK zR`^R@`)_JI;m4Qf+h;0%LVnK=o5Bx{nw~%V`^6umv#H$4T>Fyvs9&F#ej%O2uD>Av z4mKi=?nxU0V8>6kluB2|IH@@{75t~h^eC=PaeY&v#S!4hAH9%6=t}ipj?=H0KjN6J z|3~umFnqdrnQ3~Xldo2PItX0;DSfN3I8a^RnqSf9A!txV_#^4V7fn<-#@2PkKO0UIU zf7STl&$8pA_yVm}jrr1~%rI_$t%c|K@vB1rprua-YQK$J-x0i!`PKO9`8ul#eJ)9P zcJzMIU#0UZj}19&g38FSau>w%e%Spw%1NyC4dnpp2(9;x%RjETL6uMMapSY99{JCP zo0QG|`J&Hjkx6vhp0D`D8sY=VQ}dS3FRAf8GK6c85BO`tGI5T##|1BX!okVgrd(eJ z|G>m)ar!0eeb&Cv{Aw+*I9aJGE86ir)W`W;Gza+i0s=-=&dV}xAEx;0_Io4wruvE| zk^Lk1aBxF@0^z^vg$WT{_*pcZ@!7@N-nZc31n_eN7Qae5xYM5T<^6R2_1Vpk#kX3> zjbWaq40M~9JGk+k-I@J*(0aX!G5gTkm+~>FJiOd}^O^KL>r-lf(PZqIp$@;)KmGrH zwEipp9#pu&-FH6t;md`un6_5`k-uT>&&cPstiyF7h6P@s!=rVb@I(34*N<}g<-bQW zw#>yTarxZ1%0{4C|(D!N3 zXnl+WJxlFd{#@wtR7nrZY{&ceiSkrg_+h7?NjLjyGx2E`dHrm$S~*-DQPX0J256{_z9~QhTdBxN#=k0y)AxMB<$R2-@XB^=EWQbi)(s+uW z>5O;rGx6g|j6M9V#v-qe$X}pxT{q|N8Hap5e84m-^885q3{;5MGrwPrOab@XJQ|DF zv+*{M^R71DhW2+ccT7(TM^;;XC~F8f!n}x{&mad<7C1q<@p1ore78aJ1h?L*c!!~F z@on@p9kc!O8`JN@=Q(_t4sUp!dYz02U+^~thIlgho5U{`6NjGsqiIhnrjdGo*dVa$D-?D{kcbQ%zyuU!X(8W_NKfRbWX>ftk3;$_DwJ&-uPIdIGye_}qi+^ag zX?L%Oi=LOGqo^nk=X1l1Y5lWlal7Z|;`hJd$B{or^Sh@SKBd>p4X?$)$v^GRd;ih3 z!{-h4O%=y)c=vtpxcQepvjiNRL58XNULPXgusO;cDBtioi?P?b<8Rn(>Obf874=^+ zYT`$yGsh}@Mw|W_p+9OoW4hV-tF+H+?I8SDoRgIA^f9YXXpJkYx4qSV)OaM)C#0`@ znuor?jOg5sH%GxwR)+Du*bjNESNHDQ=ltgBZD(|7f9e^hcIa?wbJv!}SL3txTjvkb z^7qt*7G~oy1ed>2en#Q<26Xkr9@w)rBm5S9?l>IDGwMP8nUOrx{2YGYJx}mV=keEdqmRwO#XHI#|NH%~G0#_%uVria zJI{-ccj)R6=U9P*ho9l|v!SEfA7Jxc>+jd|mVf(4c!=c1^w#)@Ucr`{V7SupJNY+mpB?!(RL94W z@_A^#06&x)!BsC@ZBkzKaN%pwWVPnrPq@2&U2xv>q5pCKbj3W`}C-{9%8SI}k;8%>n zw4U&*QHuX|aOr2i-)!U%G!uF2rttN;w?zI5!HcP!>3Vg`M)F4QcbJ$o@mrne z>B~)b`}2v!54XW9#Si6wDB^zWN7d^+iWleMLAusQ&Jn(SoZ_?E{ z1GnR+Zr_vjKOBA+oM`Lti@M2KZF+v?=U?kDht78L5c}73S`L2Xn|2(@-0fHn&&_3g z9{_)#je`UE`coe zd1C85^5w2h^YZOB@Z~Wp@6zUae}nKvIXYHwAGxN3p^NE5Ts&&=rNqYk;^?{W4Dk9L z+s7u4AYX;mzrW1$2YdL%_%^{wO0!a4KM+0aZ|VFQ(jQfS?LO1?{m@?f414i_#pj^% zRm2j#j=ud_^!}o^92(U6sn&ZA(;ssGYW=jK=m|8lMfC8>7x>bLvObQpNj=zG*RC&ITzIWPCS_JuX~kpE&+bZzn7 zuI})yCJ6`z_PVG?|IB{<`*!OwU;t;bW%e4-KL~_x{mLWgrZcJ6j-C%b*;qH>llBEpD22Y4Y}(BU{V(8KG4E{Q z#1>SVj=l{QKhHxt$z;*ZZsf`61J^AbfxRS8gbszeYYibH#hez+zMD zT9e*Q^P~2U-5+Z|D3AS7ywRLpF2oPu*oU#_7lV5}huZin+dnJ6zW41-#Dk7zeVXU1)Lb5mKM*erD)RdcFS+=Dz0ljyYUa|LyuG3LEaiHT zJt=;%tAM}jOyX;vU&#OcF#S_0x5(8eWt#@c;r>9==saH%tvi8W1fv)`#VC!oO|1m#f=D6tc!;Gm)q_6vw(c?#qnU)!Cto={?&NPE2*t=h2m2ECa%tyC( z?-}&Zg%9tH{PFD>pAvAmWp&nM_hGwoOUj#}{l+@v`S2uYQu_oC}?&VJSX&gXsin)0%5t-e&EHVyI4z3jI>Chjq z*YG$?@6zXPd;)#!TgAh;JO=82W$X&+llVt$S@n#$>8Qt7(Q^s8ip4J^pZ|CselS{F z{@pnulCMV=xcjjG?OEOAa^OfFXAfvUXi2ft_ZRZ)nb1AS5PRqj#>e^}b}|OiSEYYY z4^j@8h8dn8XK>vsr$Oh;x#*F)dFn-z_^&v9zIdtU$NljoFvjzHF@yHlA^GCVqPSI6AY9(Z}Cdk$8RVtGvlmv$7^k&gPuHOr=_#Hg=L? zjaAft$+Ln2x8DJNACzJI;rZI~=;$4|)-bdmxeK!8EaHPow==bSdHqTJpr{jV)j>|& zjxIPEfAphq@~}Jiqep5#i{$ltSFm0*(bVJ!dD}kp9+Yn2=w1Go!<)ckf^kB9T=Od* z+T8E(3#?>}k(r_Xr~Yex(Yc&Fpnp}LKwjQ&Y7=MP(8A$2hvBEvZ!YVD9{UpZ2+pYLV^nmgS1Tly?o8QC+}ehYr5nVx@od9VJ^54A- zep6C8N8HX&Q{L;=HZa5?*vWI*6aOH#Og~dI*T-wgKm5{rRvy_{mtBd*G|r9UUFe^g z%QY(G8TBO?c$W81>HZ@#oqtjK*r6tj(}kw#Wg&e6$KP!I&(g;f+jjIf(_}}ek1-}i zyhFHN%Gz#FWwSXy{yfd2^qmqk*zX@t*y(dVzE=9e@6fMG63@2ZXPGu{#I5(2T7Dx!bYuY4uw{FK+n{Fy9f67w?RW_KN*>3du}ip}HS!Hv1O zsU>#I)j-MPKZ-p5$Dp6~W%1boZ*em7`;EIF8wYH1{7w4MuG&tYk$q+BXPC4JnjhaU zcbEG-()2|7K*E?7ORBzm$u`zIpyjX}Y2j)o)(4^$kN>0(#P&D%hVOgAR)U)AOi**} z@%tNkTx9}{#}V*o7sCCE@3|I!e~~-4+{PD8N<~N5z*+_0g$tp_!iZiqpO@a};DY_h zm{#fOxI@$YE`y0DI(#kXOWR=y>;&wJ zWS#g~zn;+2Kw}!lo&Rg$!;u&8RbBUIdEk8_c_DuB1n)0-r}zZwLBc+h-apg_fFBv_ z;94)(FcW#O%hZ3?={r^*`Z3+KvU;IKm z!mdYE!Ir@0PuOOfoe{?`j?8dy@#9Y!-`~$SO_zFpEdT4FbEddTG`ur_`kIXKGyj=sq_`Eu(n zQ_1R^ig!O)$U7Zz-|r^CcRHFfx{mp=_JzO4WLYY=|JBShb)0`MJ#K%B>5kpe3Oz;T)y3?GfZmlKW0cR2Vde2b3%2`nT+Jlso7z_2m3?~j0cZbQ z(GmL>`XrbisTA=W@?pg6C)J7JO#IgCbJ&MLC2+UxPrhZoQooDh2PLo2se>{@pd)az z<7_U7-LB$b_&x5h?vHqlE;I7pt-l9*`Dd#Ts_LJu42=`k!`ck=x z3Bx8>JI>PEr54@2}+uIP&-SxqZi)PyOZDHJrP19lRziN4|A6 z%MUqsBFks99Bu8VF=Uqd_U*x7wA>AYCcaemw)8POa3$Y1!Zp@ zL%*xccsIEsNn z4A4|(WVuRu8w2O(dE!?&@Up7pG~$iV$-sX~JLJq@pQzJ+m2W}ovWmC(p7rC37lAJ% zTd?;R=rby6ug$gSBV40$D|qfp^>18!nvD-(y~Gymnc&Qw(CJ$yX|LCZH7CDUaP%#G z>UY}P+tb{3lE;6`AFgos%U<#&iPW3U-mD9MDU9qv)erYEm$vZZE&7m6)`i@TB#Si< z=^f(eL-xp#o{oPU-NLxv%lpoW=)?LiQr&pZK^Fc79wc2Ijkoq|9ffAaU$dZ}YoEm4 zdpF{*I`?PF>lPlEyUA_O<7=;t!6m=U(U$J5?pWyGju3zH_lrMS_>*Pb@5(zlAH4bU zJ#FErZsnJr|2uHMlx9A!#(Xz04Rizbd$-p|GZytTlsAI;BU zd^>aP=_XyRsDEwiun+Dl{E85p&QITvihn%aByIBkCDy}(DvR8DxbWji>;=}x(|1R3 zbF_B^ryf+?WzvUud&bJ&QBFP|84hhFFxQC@|CN4o*A4282^ug4zVt{pm92abyvT9~ z{9hhexr3>DN~n*PAh(!Q?T`PS`IYab#=8-JmVc>aAM^xn$(~2=uWfi^{H(smA<8@DuE;xB2~n zW=?;4VGTCXJ0|%RKR(jUl(XW@1`dCwGQUN0OyXjXKiXfUeMK6d;mq%p(#%hBG(OfJ z1AmZwmVP!afPZ{sngqUm$ye>MQ#?r%=4vGTEM<8Vza;+h;x5l$xSumqgYw7B?W4o~ z!5LZabo<$OKJ}pV7Ly$A4N z{u6l+RDnO}{Ns*upac4lTgF`Rt@Pi;Zd~I(k1|hxmygeP7&PnaO-Ju#y@dA*%aK1_ z&B?#N%Eu@oK=wlGo4{|zqSa+4NC(H-dD%bZ@ z+j{+G6KEXB+u-s%fFs$J!J{10=vT4jw-d4}ny4lQT#@Y#r_gmHpJ&MB;ZGU)v+X>)ZE_@z7_0QeN&E?=hFOwd^ zo5DA8;k7qmGs^DG!>>^90n>0nX!lm&e5fDYI)wag!`EVuyls-3dpvE?6}roIa$EHD zJu*6JT_m?H{1+!je(J`x%y)bqLCF#9aP#SK_k8UcTUcNkr~BtyIYZwC@A5J9cp84| zLer?SvvUIN;~50+wEKL(p?%1eyqirEQb1cdVD+?RUQgrw1~ovpXk$7ZG_~#c34V0H z*VDNF0@i{m*D;-53Hc~`-F2BRKleG{<&RzPQ4BM6uJ&^DG;nA7PnJ%DQ;N}tpi|BT zh>gGa_up10 z%(FG0SgpCvk1styb$q9de-|I5zke;i*FF&)Rd{O2knN{m*p0ZFHqjl|3~}`n>zUIc zJyYjk|N58sqG(AxX22igeJtP3aeP~PPuU#gV>2Bs?&6vy7k-5%l(*`-k&JaAdi{`C z9F{s1G-gcyxY+eg{}1}nR9|H(Si3^wwGMo=b}M{~7&OzhvYArB>rLn#!AUEauQ#y^ zO3+Q9-IRnF-*@W(!pXC+dA2j(ZFxe(*Iiyg;9>a&+9hfTyQhlvqiDYWe8@qyE;RN= z+URZ?we$ES_`jf0l`60J?-eHfLF4jH3g19DMxF z$&5qiS$a*;b%Jw$pq%}`e}s-ag6Dq?AWm--JzWb9H-s*C9#06+T0+Yy`5+uFJN z)!vFc6Lf<2X#9Hn@e{usJjC%!|#3%791i?wz*cr^_ve^9D zb<2`R9X)8DwaV`Vt%v)p_5O#?c6!^{k2^S@HxD4Mf`30#vNlfdei!~w-rV-jQ18}z zAtyq91FtceubNu7vHMZ?OD=EAv-E6wB3~;XLGPUq@k7mjmk-=?g&))Z34WfcqpCTN zmHRW&k(;zBx!4)L`}}b5b)KpHfT_~Z*;U!&CUAa%&U|tIPn|xIgXN}A%r+;a_jxCx z_dg1jJot6v(mgmA3R(!uHH?i)cwWNsb|v(F{IT{%>u>G5@Yl!QW`<L5sGgUVrpe?hgz+R52?4e*6FX z{Y|r$USH9?j;rqOmp(j&xgR$xs2TbTwBGqUxT*DW;f3nUHAD*}O>qjnE=xBJ!a(KA( zHPr_%Fv(q`{s(F6eE;vHAA09=0^{?@SUIp9oKVrZL9PU~#+d4sZrhy-U%AWDh5ddO z-jSRV(FJrB)E!RDH24^n2CZCvg=3p7-JAWZT|Pm{`PS!B&o_yiJYQCP>f*cI`?D85 z$bv7`e?5AC;dKG;uadOYe;+Vse(L!e@E~Ed|NR{QJ$`GbNaiVQ+LPz&gZc={@(62yG}$mtIM_6dhx@V-REcA7^iQR{N?ul#_ytir>r@v z1ijBAo)dl>mZ~HCzC`9l{Dj=iR{s;f|Kn+J3q7Auo6;xHH?90S<#X%P4l2BkEV_qQ zkzeeau=1%P@?W_UKC23kqP>mqLiSBJc*e^Q&Eq6LkD|kux-thZn0l{-b|bhqjcb~N z=lcE@x{}eUz6*~;hrfHCBKcnaLwMLqsm4~mTfgkEA;vU&n11kmCVgo>$eED3Uv&D% zAWx^Cu*VL3Eo^2^{@I@c$r@%*X_n*vkdm1X9c6HiQuuuNRX^druWv;T(hjoEV4hmish&A=Qt>?_OL%GW|VtB%?E4WP9G=spz1vM{c7b^ zu4DB{jbEY1r=$m5yGip+r#!pwnD+8HUXRq><3^D^JagLkkt0Tq%?h8-`|JKEpLah< zK0Ns}eBg7_2|8Q}1$>#+&Cm^xfy`!Be167}@(3H%v}aOj4=*E^b&kY;q4dJ}$rb8t$jm9PRg&A^(ElIw${xKcxm@N2i;V z8$bE`$+h;GW-hqrO3-+X zUnjJ3V50k#IF3Mw^}<6z;~jqdSvLvB@b2R05h4NCVwhQS}cn@k7LuWFm}mVTAjRz-e+-)_ez z)Ej%DN@Q=y9(<@RcI;Spojy~ai1H%Xb^51V{~x697eNQCS10SbW8j~ala)RFUCf#w zI0QX5zMjw{!KHuhLO=X;IQT<-PdfVK9Mh0>nQpwF%|TQGZ;+hU{BLPZ!*rp)=PylX zvCf2iRO$b=`{t8#T5DPTD?aFMux zx&ys_XyXK4iQw!}3d%iW()O8J4e7trKc~Cr?q{5?{e^m*{?7A*%E&3r@0E<A$~!$6P>XCwBk*=` z`)PQGY{)u~#q3A>{-amA`>Y;Dy|5(cR3`L$<>7yL!ue%&)&HUGyu++0w!OWI9ELQ^ zz>o(R(tt=3Q2{|g0Z9UqBuZ9-5)_Q6n8PuPm~%oUshANxia9HWqnHsB22>Q7@BLL( z@7@ac-0z=T&oi@o@6}yhVdb@|N_*HhdR3Sm=tJ^tM~S|Hmle?CKEi)~zH5I&TsI*2 zG2H{4`d$8T)~Z!;?H`NvD-N-ZcO1k!RK6;}R_c}VXCKEX4Swwv;6Jqlzjmf^cn>cR z{lDe+Aal7rfltWbpY!m_^nVp=z@VM!Prx5A9#os=-@}pp@=I4e3jN?m@avDL$E^+T z%>I8Bb?okU`@K}|m{Z@(xsf2s{^hO3ugf{vqhh$N4InJFp!5u7Y*FAo3&0%b$7$d8d8+e&Kq; zzVg#o^YkWs{~DiC>1#c`=-Q6G&T>yku=e#y2<~h&9FSMH6#FMRYy{K<$own9y3tvm`gMY6Q z{+dJ5eXIq4MDza*V*{Q{`~2^4(c@D1wTkqGQ{gF>m2n4eisP?+c2;uFna73C(H)?t zA!No-G=6#>ao~&R7hJ7h=ej26*9m^tgaE(fvGBc8~eW$P@&85lp- zkl8&s+Gj2JD+K2^57#<@M>d1+E38wqxQ~+8m#+_S*&EMv0>>))rRb$&{mM1;&nvI= zh&ss5(N@1<%qx|=+yRbDpOQYYRyyGdtFS!}S$AFaP$61D;=2e8N*n z9n=f$s{H@(Lj<&M3%9!g(C``HV=Qjvlo+Q@&MO8F2IO;A*@SRMvM%s^`ndHa_8Edl zsKoKLT}#9G4*Zm{9l|&^ur{BDygHv3cqjUx@=wG@ApFZ^M%&Fd|daWJg3f3^Ye=W z{r7zXnR}PDIV#F)@t>XaUHbIwFOU(`U#C?n9|SKsg0}C(R=NXuNmJ^!kNR?)k286; z;|gMZ^Fuo|?!Mk_;W^d65*}CZb*g78zWEotU;9oAZ|6Ktj{b#~_eAWM;R|u;_rZ2o zzvuRWu1=zT-=_U$y|Z(r;kmqb+%f3l`@mN@G%tC-^!RQ4p|@K@`)_6rs;wnB8u^0u zXH)V1F8YVg?@HxZ{TD2=zn-(z;U3Lv?s@ptZg-W}C;k7;T$M)X#)Ftw=5G0S$ffgb zz?c~KlAXLA-lP0HeO~=0ZjQET`;^=F0c~G{RTswn z+q%%V7r?v6t$yctZk_OcL*?*(=`}Ch&%JNE#wGFng6}E`aN&opOUk=CH^lMr@WCm3 zy7B?ObB#aEhW85aOFD&5SWDyYgTGMuTfT_yuX`N&*@O~(W=hwB?*jkMxI1|kIOm?~ z8~Ee->UC|*^HqJm+ygy+P0Cjxc~|`pVp=VId|TJ{czvr`oY?Wyvui?ttAD4g<(mC) zDqFEtNvR0_Q)$EYy>C2E~jGy!($$i!~*~VY3eR16PU3_KH=YemW z&;!}poxEk2;-BURThJD*hG+58TOQ(H1*@Xa8a2 z2M!uPtp8BK{dsxYPMA1j{`fh5;f8*s{MX-qnyW*O=gprodA!f3)BWBLID6tO_NXK5 z67u1yu*P!*_DWmwWd8Ei#&`@*F97ru;q zYm(F#A4s0tWKR1moZXIbnT~DwVgR)6YES^}itt@8A!nhfXUOR<_X9kvQ%Kp%z+VIJ z(8(HH7oKm~HKkkpd-me9S^hon>)R`IUZh{Q=J8H8k4isi@J-~1@Gd#mLNM$j@Bh;} z39en~FSYMof!8NxZ>+v4(9IoC>nN_f-jLFb;JfIf;*W#ST}MCZ<$6AE@%{7guj${H z!0E@$3xPkD=52X6I3l^Je89zRfZv(&?czfC!j%E8Pln1yr{_(3zV^U_dYjp~O~WVu zYt0V+K@Z;ry{eFx<))QEcYe-l9ht?qOG*d0_?oVF^>Lj06xKnBFFXj&s0coTw(cr% z+3R%duQ;!s@AqN6wz@h;W#FhiZmw+ZS60I%7SGF}j&J zl&>wU}$-8IMr-5D1?c}=B#<2p>iORf#Sr3BEqxxI@ulTGob(SF`4#es;))vj zPyL&Gy|wZF;0`y?X7M|C;^kZLC0@wAGspMnf7_edu1&cg**yphe9-qDpW^ia^tlo!lT{ZmAuho{`qH_+eZ-vc&o*l?KEB`#_TG|@;?%{E)ORh#Q znx5))f|pz#;QCa_<6J>~(mqcQC6WJ#KfMeO9nsEJZ=S`UL<1_vgNvcK>K&qgR`@>Y zvhb^(Up|KM?B#M^&3e8oIH{s@tsdCMURSeS=`zt?llSPx$x5C9Uzz`<1>o*r@b%EtpXuS?hvd^?hai7`0iKl? zEcnU^Jm1dTK3&oI`e2V1r}PNiRfpcstHn7H@XlLLgda3Y;{)>V>TC+xtJ>ph`&W$5 zmQ*j6-ucSO!R|b8tsfg(^q!AD`0)|Egz=SKDtr359q|9xZ2$Vvo)*8@e17oP$zRj$ zP2#&NLRuyT@TK2 zz5RJgvA?=EDOYXZ6TfKqR{q0wV!x%F2i+yPllC(fD*wAb2R!=hANg=WEu6#&DYF+G z8y0A2JQVLBAJNA<?x(Jp}h~*61$vSL=2f^1JMM&CgIQvQsDdtsP1W z-WK^?>3jG*bqK#y$N{K(b;K{?d(Idy)xYowe9Z?zKWxgY`+WVt^R7X^d<(r3{CWrd zs&1A)N8?=<{FdFm8QL0l5y9scsa?6xleC|@6fZc7aX+>T{I6cZAE3#>@cd_?i4Q~j zA3!dRZfLbDXPs-Xqmfzz{5m%W_ci&|3T z{~I1paYd{Br~WPO6x!$c%hj6$|GTy^{^*Wo%_gS&55Jgm@FlII?!xm&zK(olU+6wY zzAX3$|8T-_o!|52XYh|P)Sl)y`u0^~UVZ!dyeAKRFURs4hW`2Z`4Rh}Z#>1WSnelL{6-d59HSv zQ9aPtXn6M*b-@3ubB~oTe%jUH{rBaVtHt~@x*_lfD@67%w(s5ukDzVZxB9JZejLVJ z5clnGHj43Y5uU&L3-ndSIRDQy4^8`M=C2R_T+RRNyF3nbcs9%Lck+Y2PV0Dj_~d_& zH>|4nTZsQ3_e}U*`1QqJ$ooca*!5ZZ#WCZpO@*s*B@uL49}w9xe8^7SGI6v8)n7NcNGP= z_^0OTxT{^|_7_APBxe(t{LAS<|^(&*iozasu` zKL&W`PvODP?>7^z5l4?4%>4M6^p}mn<7)$ba_y?jl{y#qg{Ob^N#HMcFCdo#9Ll>V z30tzLq<==Cl9YsxsgNfYg^b?obk8uXE82+1pfRm^X&*m&P)8RwBJ?B zz;&%0tGvP4@R|WG`eDxoSMF59B#Qew>iOCMF8{--GK|L{%c~git9UUy>r0Q{w&57= zqn~?sN%0%{H|XAUFrbUXSasM>l5f zcdk#k{@?XW@&OJ{*Ki+NfFMmScnw>RX$bpYKfCCjn9Rn{% z9@S3iMg01jLjp|r_8s%_X|WsqJoqN6xO5V7WS&oXpEzm$jN{3g3^(&%^s47qtqVWt z`P*sZnm(?_tr1_f&U6Mi*WrlFV^*tkN^inf?QbQ0?+(WB)~e7Ro0jNq)n8nQu1g(> ze?!;!JMwRi^-Es4i-Nqu9yDx0JLytulppgYJ^Yja?~Xpiy|(TWYuMjvdVU~#T{?pD zHwL{0ZGV8?#-V-5`xW0j6FYy(a(;&=vFDRLx?V>mgniU}{nYE>@XLFPdB^G2Xnd?+ z{ICRm)wT=1Dfn`aPrW_nXG8rHKXjKeZ#$X)K6)$q^j&HGiR9f5-5un`%Id_~z|{t9 zLa#eAaK;>a-#I>Sc@$=z?z11BU+LlUWBIxY=cV}P>qlQ8U)ec67k~?m%VyfA=Y7mq z`OF)MqdMv;Lf9tn*Z7~icNpJp-{L=b9KL;{b>G*jdwo&%xO-Z6W2c1={m*Y4?I{mO zCsP~}{B-4L|DuWtMFoBe+*Z#IaQP2!xdmmrrR8^y{zKtMm7~%)lyr~R4z{R|U}t_m zZ^67{r_7$GeW~UtbTNBULLnNzro@mc4+sq-4&<*NIK>(ajq@kCdn3Rbo*h4L(K$0A zFaNLKz<>Dt&PUKYu47Ib@i&XVU&6irm;d+3Pti$t=cj#o51M}Pn4aWc%z_6b<%e_sR7 zH&}xQqMo4oZ$ZB5{cCR}_WCCJQeOIg`C&>S59CJ^UXDXgIq6EPxzzS8?ePje@Yqce z{t)>E=wuX3W!CS~KKbG9-xA=m18ZO_;Md9D5b>@Fxb!x%)}K$q_;79azH3chjO~}6 zx&F4e4r~WJ?|Ag4w$|};8}I2(@Zsnp%1=0+>p`C&CyucGYJ}d;Jlf$`Mmz7Fa6NUo z)~6FcU8}qPR$QrWd%~-u@;*QA@J~-$wXAr-%FO+)6nso2jZ*~Y&eXYcX3vKRXHRYm zH;M57az2BBm*X}FKSlEcz{>(;|o8hti=y?rxhLzT(!J{ENIBMCw3s; zv-9+QUJ_&A%UZ_%)Ze+pkJCTyuSES;a#E;YeumYI#hp{F3FkX`{4EAPmHAKfiq#+C z2Yt-?am1G9C)7Wa=az)J&v`Y}ANC_O@gUc1CgXB0ehlu}ZwBzxPvP@?TQ)OqCy4)i zUxPh7hZsl5`uaT&d!06^T-GIgf_BYkST(N~l56Bjy^d`PU9w-CEA=wCdabsK?G*5* zBDU*y!4IrF?MpsGPibn+^Q@kqKk=VG`vm@@_kX#{pXXXLStru;0BF7`a(Pbp{Q6_` zj3*;xwUqJkdk;MU-mGuu<*Kdx0{q-=xum9L+V>7T zNc-o?uc{oum4mItZL$BV|7`p)4Z4QsxwdV@$y+7-2N`$j^UT@L1fz&`<{nOLp8W!s zM*h|TesFh{;D^`elJm(wDU;$q^XtmN7d5}#ndfhpfRDKBA4%pP-dE{*eC5~q_xtO2 z!Qac``*l9&n3ni*dW80IZNIXVbXn5A_2|v_W#&iMuGG?We*F9~XMX+||06en1IMNC zy{l;?@vZRZUfZ?TTIg-`zX$cb@F?Kgfqebf1`qOY&%+})oT z`a>%6V z=;HXX%1nlSnXh^sQ~BD8Hm$!Y@SlBeBMyHq!sq%p{%d`8+5cRr?R(? zo<)AjKI!e3-4(7qfA{$*fxrJVKL!5n_B!2M0XRf)L-6VF-Cx6ttYCS>=grl6H!jtX z-#cHf{~9k9@83s$m1>2K@ddgsU;3WdHu-{J9e+ zu@n7*sZ&`V?4tlBTPrpT?<>{V-%9;Mx?zj_b&j?`@a-l1fBl? zKmDR&d=5Gko|j=Rh3DPCNtK6xv*GW={CMxLFA4q-(c$=O@E@MzUGg5!l)s&nixz~d z*H88--ah^-f5@BPM1Kt9rtAIgvAU%r9~T}Rxxsw?ruGwhwt`s`f=Q~Wg!TzfkN8i( zQ}$i8KhD4>y2k2U9_d)`SKhezPYOQ_y zwcbi+$7&yO#j`eZ-_Pu;`+cM%?HhF#V@SNhRiBN_-G#s5%`_gOd=0Hp`0QBhFLcYA z!b9W;=lb~dUdrFzd1+{$^0>cfPyY6;DW5E+&im<;{B2)Nz!$SOeCV@G|9!kcyjbOr ziXrgT$H)AHt-jjKzmlz$nng132&wszKl6_c=%LH;E8YRU^Gx1(sXi|JDFbfB zeP8X5d+@ncuzF`lf1TR@$hqMa=rMK*_;S(|*W+dBF>5ogPA**O6Zgai)}3?I89Q2* zJ91g^%#F#d_#V)GRsN~xWuNijZ)i#WZ&l_Xj-zNs-zjbge74~gnS2eMG4D!0#(2?I zm6eO}^RjqO*Cm^f`{?5GS*Tpo9D8jqF4$MEKl|#Tm$=gZf_|>W2YnOz`q${k!*r+h zM71jA;plRuF9>k)^^Ii${6yp;aDDf6==myKZwjCM&pjpXN79l0o;NMv>x_was7+2Qu}VoLB@8m zyyP6I_BY{UY8~+T{SD|`+?QV~gU^1SWzn$TNBJybdEjKXgRRcunAa=2%1#S*%_~d1 zZDV~ov{5Z(d|jJfJaaNQ4BjLq|K)Ujr1*h&z( z;5{NeuT5&qe7e%~VRw7=*Mnx3uYT%7?=34nzE9S@FNbT7Z{KU*q9AwXPMI`i#_>~v zQNb-9{$K2hWFJ)N5EPgDg#WZN;2jXD)zYg~5aHY3dt-B(B)B8*Rl!5!}ALd!DDG7WIJR80Vf77R{`5&_ywIV$$ z?{sTAPl@GMB0PJK{*3kdi=Fm6wiP&Cd}pe^H2ECev}VAgNh6_Y=%#ilJA$TqJO%E` zl;QUg`XvvJ-kAolg-G5W%a?sEWeq~7hg0K{Jb&9rPua_&z@?v4ovjlH<(N6 zNA9@_{juenFmF$$bSl2fy4kSK7QED&TS~n*BHxwVYE~Padphxx>!FwZfM&(96{k@- zp0Q)zmD_EXePV?dMg0|Z&^GSicko4cv1>Bdg_fJ(9dQ4Q>bR2ei6xiRGp`pE7Y1LP z*RRn@u6hL7xYJtZN4#iO$b6j|?K|o}eJQbo9IM$g;+<@#O3dkLl|%cuc4fL)(_>=$ z1TWJmh3op%5^J(4!bKOa!iRkva0+%R@91-c^*k)g{#nA9$p3OKjemC-a_MPn_^@?u zs`=BtPYa%BZg!H#@H99~TbklDR6hlmUw6vV;CCbs!cDo3Ii6q#GDQA)^m{w$m8jpJ z2mL)udk0&`Lt-36`hOYb)$9M*w_LlLuUN+eBVNmYvI1YR{3lO9x5q(4weziC@_s+R z*!ZPRHoI*H@$id*Fu#fYDgVxj?}C5lggV&w6`1RNtrV3OLe`LWA`UMRij5$a!D z-};90;P79d-z!&9>sJQh8z{9I=A`)P^}e4WNw3iL<_cER z??b?Q|503N=5cpEf7V}(nyx?kttasxU7C5ql{qV1|L=T!4|zl(C3d$wq9&`s=hMkG zX#=0+yy;5B94c?KmY+v|P_IA10mf0~lCQ!i|MS}=>p_5*Ll09?e>bBi9WcQ14~qUE z(bJpoN%>0z*Y$lHtmZ`#uKBq74s*R38|4+882Z?>Ld+|WAN|yOgI=J$FrU1i`TRDW z&(7!_W$rPzkNAP`^?q|5TUg<-5nnx=-vrlsh?hJ0H9dvDMY#{$PQEhpyxoBRrpz7I zINyBUq=TMq`L6-r_;i(8L2rL#@Xh0E1^Vvon0GY_;CFKy(ahq0*5GrQhXP#u4BOsS zs%XQ1PUIwV;$Z0Urz-+KyP-b(fqfOej&S8Ym19gr?>g6J^Vw#-4@&7>_I8;U!+UeW zhvm@ti{p9>#pUP115|SA#Lu=?XMKdT-pG~bp3|Z8^5E>g@ScM1MlSO+06#T_OK&Q@n!2zh-adx8F9Y(_&-goh-ck9R%-bPP zEW+0Zywm3yy-ofs+j$Xo?yS)ECy*IczRKtc{`oSD(X=)}&p59!*PX0Wi^PsXPP6Z! zm*a=M7wX`Dvd^EV=kuDy=Lh(lLfcZ^I>qxhLj6AkxbUm$7xeQt>%>yf((tPQXAbm! zkAIBimOSe;Fwq0hBQAY4ykGeLD)RJA^axz`dfw*^wA?$jQ+184TKABw=U*Kf^^AG= za@Crxcei=m zGVvk&Caw;AGAV`mmZNLo3vqK_I8V-(-{B3=My|dHu08ft6qi1x67$WNlPAGdglqrX z!C}6(6yi&pNQ}2tI$!eNe|9o4qeb|z;Wd{qUV9HupZD?~8W_35&zC(1-}Z!(Z;T{L>;oCr`sw?GpO0zOS5a*7%&X{n$3HEP6v; zkAQDn+c!HbZ&Rc<_5U33P4NqzA8-aE|K2=n_Ez*u>HX4)efwwAmrJl!r&z%~F}~s3 zKR>{ghkE1?^p$>AP@LpBgKM|IXO-tw`4Mp}67j{~FMLQWj>Nqt%8vy+Pcpf%k)o-60=J#a#B#SOlik3ZmKYw~5(o26H(DDEh{ z`FBn75vN=IWPh^6ruFlV9Bu^eReD-WR?>CF;uUXy4u9H0`4wP}5wieF>brsoxgk8a5A^XF z_dmAODxDnleyz7Z?MLivZqa@YJ>MV~bA#1BD(>f?@po6k7a04~8M~3tNI_BR-%wn3 zYws|>!}}mJkTs2`r1L9(AoJzpDx!-4k3icwwl`Z>Hx=I!ew+)Jl0Q|S!jU>($LAOG z?r+dPI`Ov^dOwc8r;x)ZGlm^PpZ+iZ@5vunmiFzgw_maMr8~cDvGEDcty`XHkt-K3 zy&UlC)3WG_MP&1%i{^jR>xmm!i$Y?(+kAyCuap0-FK)eo^nY1@6mB(BD*D-;>jyue@UU(JuAey8?7&JW4Hjyr04`@F%Fs6Q)SUkci6{#MAby7wOH zKQSHOE(@`@&cu&X3mfV(VipIYe;u8r-y;t=Kf>n|bgPO_;3I6!UN-zkEAslO{D@V% znziedX`2Jt7G7s4mn1p7;QcJJSWe0$7VG>Lh3d)-D{X9@Z#^FC-(f48WIxJ2bhWwXE?Za<^&z#t+}Vu(N@Nqfao2S8>vZ2~-@kI_qdyV@s)&B9qD^e{ zne@Nh#bN%Ywj);h6L2=c$%5NT-re&;Y|F2h8|I?cMOK)=m3P}^0quwX=F(5sg83~? z4=KKWa7*V-vaZ@q?SZZazO`xQJy&1j7L`ofyE ziTWJ)ZSpI0_`uie|J6D&&Fj^92){Bu-ad!^KPyCMzS+i}9M6N${5=g_$N95|h^-LU z9F?5+p*+2HEg3iT7U?Cgyw3I0md})Ttz+vNu4e5Ds zZ|B1JlCP!wtYkkFe?5JM)$0=V7QxvcB?IT$m0NH1Hbgk~ldEw~u%CoqIsYc7>>_Jc zFRnY%x{VztF+UHZAM^=h(516Msp0+7H&?GUD?Kd0js$bcj!*3?!GGToVAU$d&mwE= z(sco@9P_49hIVYZj#yzoJL>K@KYCujsc=qN`25C>+DRUvu>Y0~hS} zx3d&gjxoyI0qvCMp1X$mlQ&tcJ$DL9>~RZb%!7)2|NQxOQ(p&vnVVg&A-muOwGOrB z5$^q|)xq&8;FZ?xUcxxtXV#P>F1_A@|IBU?eSJzh>f^8cg0ZA?$@9t!7dMnWw73^? z75ZrSU1AS0|669vo-}^il-X0}&X~0Kd~`tNEVoVC=al!q_C|Q*y5Qd!%=4qxSm9A| z{A7^|4mM9geRnSf}Ib&bb=oyrT)Iber3L0<=esEEn#UrhoxpsW|%MhzgjnCYp;c# z&I{K}UtZ#GX$`M>Z5s9gI3@ovXJ^|hYpnJo$#|_NpXoOANBs7AU6AMB!%VsxSVk$t ze*pHp`U`D<(I3EE{>;2mrkoVcU-Gt2S8!HE^t@s&KKeGURGDa>HY;Qf_ z!!>&#xtz!1`&(Vh^Zh~4?a)~+vDiB3>E&WRAnyn6e`g(un>G{LX7K7fuAXPwXLqg& z^aKK`hg zb0!@Vt5N@HR0#X*8!V&FFF}< zMOQzM_qVZ{Z=`Tnp7sf@`I+@BI_5!Eb7mYLoqtpw>JnV~+Upz1u^OWzw1d7Teezsp z%dexm9o>&PdUvE1+>94R?f2^}7Y2IYZx*r%c&#jb$iq*@r?NKFHyw^hE5rB#x7(rN zwwLkQ2HwK^ZD}R0Yb9w(;_`=U7Kk5*axhGS8 z)M-`#j~vvL>L zFFbBp@%%BNF8;gn;IxY8cRr4u+G*+OcoF_z_?_&uj`uP*e}(#vx+Z+*o2$#eOn#Tf zoBnsZ3Lp2VAYUGYU!6O_+8iGJw~E)6e=@*@&-gT~`&*{1d(a<3&IfsH9v{YlchkYi ze3D7^X2InbS<)W;dWe1rrGC?t9|3peU*z6;=x<9r&RD%!DZaEhAgs-3^&9JPPK6P2 zuMW>sO{yQbE6-f+y*yUVM?s&zJ@3kc2kj3_;k7?a^m}x_D~Z7}?w2rT;&-~f=(?1j zD^G}XgS_8B{eO_U#uUguoXOX8(KGjI&oJ`M13ecro~#%1>;4D7%o@2KjL(PZ zx6UQ64Ju_Rih56#zRaj};U(b?H&oHJQ&Uom0+?mF)zJ9)> zZ`mu*w}&&|C5OYmf3;d=vz|Y2ehSz1U(Y#9&MTI_{}o`ru88M#{ceGlN{96Y@?)v| z$)DuMb5r4G#G8JO@?q~8=IUWX$ewz(5Sswp$gP|5FZr(@nMuq5`J?&N^&1aaBT`g7 zy=h;Whv&xpaNxSWx1r?^jN`+3;r0vjz5FBSxGDT=C~aJ9byzBLu;y3#?#aigg+U)a z1)Mr!=-bu&Ep}=r+yUEDeVcWh&Ox(U$0>dEOk~xa?X1p(gkLbew|$4c z)y{vq3e0!?`KccgebH6u13h5Z+_o8fXRhmgmih}kyuW|m-=|!UdK2UGYeSo|{<{ie z_rzZ>{CAHR>$Sb-O!8wFW$t$6cZKU<_x#NB%@_-c8%Rz6fY{P*T7x*z9z9jytLtnw4l8av(Ij-XKV1FULkBgvHVY`Lx_YIXM_jh~`zhej9 z4ef;c5gk>+xhWkwlf(LK{9XRq->1!;v*6fpo{rk_tM9?o8B=CX9^dir&o8+cf9HSj zjWCuf!hVtafm=t9E7bHXvmR%0eWHK5z$I}Q_|7}O2R?JsUeF+P#Nx+Fx=ZyZ zX8^AUPerHO#y~Td*y#DOf6YphW8Mi}2pmxVjvmo`20V+Kf{o+R=N&03-o$w7qjwN=cypWGNttO@!mC7x}%jV zwI_de1?1}PdeWR1UMgsI!IK;QzCP~4H$#1%j=%al9cSmbijJGz;_2A+M^7MM$6l$K zX_giLo}Qzt`9`$Z85IIP%zzfz<7eMF5g)|&U-~@d`?~&pqxE&f%_4&2vY0={a!Y6b9FMSenx z8~VHDb8fefzX)EXp8wt36*mqdhE-iln^He;g%W76JNnz2a3BBAJj1GaKey!ScH;Ls zUqSf#Cv9CbQ^)!Rd{u7kpTM=Rrp~ANneQt%TC)%0{#4puLq+E?iXOT)BtPtZE1JRh zsej|(KfkOG{oD6&{Ftx%+cW2LkT37gMUz~3XbJB^FKE6al?!_z^QRze9|0zMJ(uU% zlRLBSL+yKesOQ@@YdQ1W!>mp1h_7q?yR!eeibZ?Ex7$y;nH`R_h~|0-|jG4fG6lBf1_ z_$z3-IwSo5d24pMr^pk+f1<5{-Z6}GpUD-0^-VY)_c+kCR9l9#`E3@v*+qHR@ zBIh=M2ds~GP7IsbM#ewHzoJ1^Rag1<)l?k^MQ_vV|BtsAV#n~}dNZ=&J_0j@kE#ahB55hFMRSp ze~8r;fA;%X>emIsu*;9v6-h+5Wb9y1kIIEwz7(8lhb-n=^murrN8!72s8qBcWh`el zu?n95dwuS)us_MVlUbVvzpb?^-JeABd(n};|5~5uV~w>Ri~V1lRG0a56~U9;)w~cb;=*(-lUVVg3H_z@VPeehGBgN^j55F(80Zj4jtcj;P}2n zhd3vE7XMUCfa2;544(z$_Kjf9GW-+zEG|TUq20utY))7Db2j*JAR|WcdiJk=|KhL% z>mpxIShrRMUIndPN^WvFa7882zb8@OrHtLs;`sYN`SRxc-hLfWi?Q(oAqV&M`4YS4 zwFyt9^<6w4f5H;{U{zK?{-9M9B(t4KsK-`RW zjT(~F!_?4^E3RgYpu^voca@|b&R25vTBGyV&-$J5E7b}<1>PTeTlih^_feO@r+2ke z>5x2s<)!epSK>YTsLp$SBsVYcK+hk^OLe)7W0Hr?werrJlA7xIf##=lgCIZ92mD&Q zi67bUE>S-wpTo|Cj(k21^YbS>{@Q>0yvTz~nBO)Bg!kiz^Xp!Y$t7+NX1c zv+^44@M}W*xJo?(T;ua1_%-N$t9@DI*B(A9z@>jY z{XMqWP%Eeq^bhsbC2J-0h2rWqwsH%slIKSvp@#~X_m<4fYIJGlbJ_@NoU9|4>@M?x zdB5RyaQ>M>`u}A*zk*j90DNUwhq$>9@Y^%|*zY$xb7Zhz`E;X}Gd|5y`&IVc?ZaaK zz}ughiy6)eT3X1fF7AbWicFKfdBHc}G5o#u{#o)s?;jiL-@bF$8PT{dG6JZfWx%KlB(BX+;96et+>%iMnKoEfv{PnoOlv`_j8K_S2X=lCDPtveFGXR^{h2!%faw`dGuoN#^+(Kr5^5I^oi90g_>%7H9qBk z3**zZ3A~H<_4~ydas-fvOWzqelrjI598BiEODFWHO(}l&V!SJX+wzk=Scnc)=Rkm)Clq0SzHD_lV#v3@Ls@*vSAbW&LY!&y zRoG8ITOO(L9u@m`JZmg(TgU~3%r?{+><^82yM-KHr3%qT{esZ!;_M%NQ86T}VeFAyG>}J*( z5$Chtj!xr%e{%0@?^(kiqhFr=Vr_7jxL@qyp`VX2e~+6#zs&3Fm5}4wvs8I)HzR{U z@w1-|{;vSv?w@l-ABN}of8JAJ|8c=>Tub_h9xp#S*EX)YowqinPgmJR`UKBUua9oq z*$!)LhiiO1{cZtwM892j;2%WB?l;QAn+pHYm!)TW{>gbhuHv<3P1>j9C;pSW7x=e? z_n#N8U+kLtGbA6Dqo+$gh<35-w}S3pU&TLBd|5sYn@hzJ86FPo936{ zv1^}zzg%PW4zRp~)xNfj>96hZ(JV!-zry>QVUzUNx`Af2A3f~*sWaxHg)Nx9U>-+i zgiVO4M@7$zzrEfkd>8%G$?P>l+(B|0W!`S`_-ixX z@-=iz_A3>Bd@#)a=Fig%S9ay^mgDsw&3`Uqrh=Xxi>uwp8tVN%51|2bpi=Ft@L9c- zHNpSt;h?VdIWGLZ#n zt=Y3jwpt7Jsq*xvyr3=h!}HU?BVs+)D#@p&e);!5r48B-U!U3&ztzC3`jHN*ND@Rvxg+<^u_~jZc2S26+ z{OWRqxsi+gy}h=^^Muv6jVFgZBKha1J%zvRbE`Qz%5V8Yx^!X8CWX)YXXCGE35TKh z`5Wr%^ZLg#MZt#3OZW42-v9Lo{=wzYRaN8^I!NA%Odf>O_^kqW68-6p#f;)sVZ@)V7a;-s75p^B4sK3%_pORKD)AliS*OP)J8qJ{^=>X7 zpSR9PssDYt-VHhGa?tYzl*W#OXHHvU)@)n4E=79md96YmRCKU?9e6g*4yYFCK>LaP zP>3z)f}Sp$X*!z~plW(O!_xu0RCEF#aUH?6QQa+fW0aHP^Y?=%$}d*^U+3Y&`oN0o zMmq8N$M8tOk;AS=cX;taYqcxl5qRoyz7BXQJuPP?e!{Aj*C^`Q?5AMUuk?J-S!;9k zX=}k0+lw*sbfo(4XF^tbp?3VK*oPO>cs~1}yTU~fQB0cFO-dXD3 zL7%U^(5xbxXy_)O^T_x)%i56-=;gTdthsA>S3P9F3i4>5rLLP}eiFa`qqv+C_Jr@XhX1zs{SVGQ zhd9BV=@b2L57&OZ+-F(zzT25lZ71nY`B&Q$*B9@ixB<23^K<^%e_zQy61pg1Tv}a= zOaR~2?~i)mc_)3p`1cmtsyxKgKF5wihUA`} z(zW7+GoUHO3$_2%1IUsOH&~s{c8tdx@ZN6833xC6$EnDp8K2t$O{4xIyuXWgKl}sF zgSUSkiyd}>)xOKRh3AF$HwXBEjPB>-G;&t^D$DVBr~R$InqYq2#q3|fp{w8yhvE*oH0Y;3el=n53|$)6E~mTYCHo2}PbLTX&AJZ%c~=p9r*&Gt^slkt zz1Dr8hq;^w8LPq+uK3{g+ra&u+z0(!#(jCKGI?6AEe*QjJD%sh4+_oMp}&AJ>!DPRVzLB4(HY2+sTyvuZBx+r+u4+ z*V#!r+~V>6(>==3zul?!O5go~JvY2Rg89^SifpYQJ!`m4`h7lPOQ)BZ{y z8c;RpJJLtC14k#pwomtCP`@PM)4+3n%#63zP-u_)`b}a!jP@(a`3pY>xUBW7za!7S z-(rPF#`UYfZ6P?};qcra{ssJUYs?n^O*K9~pQbc&Wbh*c2Njx>)`{z9DzC4ANAciYU0-bwLQ{nH*z>YwQK`_G7Vd}cM@ zjq@ux{L^)QOandhJU*p{v$N*^A?8K=O!*Dh)Wx58whfpW^BdY4 z+V#jgW-gO5pklb%O^%R7KV_Cbfpk2J-)2us)`@NmaXQh2%9-#Fm4lu$R|}qz6{quY zP4QxtnLY5)wBsT@chmcscF=e6nd4q!{u#Sw*Q9i(ypp>L10NHQ(^>NkPE7fj@D@Bw z@Ydy&fIsuC;9O4^=)wOy7cFZ+fbd>?_^)~Jf-ljpz?)c3<49j`XG=f%>g7~U>H3q4 zbhKWOQ^kwH<3^sY?SY%kZXFF>GwG^F^~+CP^{4=!3jY1B>$pC~3O${;DsWZh{dD1( z2j}X^m`A|#%8N1d(s-_izyAI=D^B*CmJjmOY2-hA%s4!1Zq!ZqQ;uSUDSE%B>(-HO z&!V4Cqtjn$O>(20Q~g!X2;)EQQ)KWKv)0$9<1cuXQ_cGcbl=y|o(>gB>R11Bu8(pQ z9Gx=^TkA*L|AWZ4H1`jU338Y?l*{jc-;hH~ddE1F&bhq$V#b%Tk^ZXdRbN=GWWOuq zsLQ!KjNdGH+MUN^$32~nui#ZK^Z4QKdt@!}b5i{9@T)@qv^U6IPh%(kmFb`I`JG~c zN$G>VVO6c%0IRBfEIs}LcU5j6R~Z}`x(ImI`b+88d5l@22OT#Q{?N<%=7#?J`sEAH ze-(ZJ&7QtE)W1)t-`mN8SGk9n?E%1-08jmdPWt1DKhPa_u=gPS)Y&Vwj}Yd>`TaKR zu_5|dGyv-WB(Y7e-u~cnLY7^jYaj#59xl!L9D-GE|W5Vu~zYX;fpLe9Fy!8 z{f#Tc`#xq3*^JqodOC3?2cM3gIuR$U4@}KnaI7{NpTFQ(##Q}t4L5*$>&P`hkBOz$ z=BT#|UIp9J!v(spFm4L1o&O>`ky-C z-(=BZ7Ti^NKj4M#n|}~`f7X7F#f8{96M&CEUi0i*{~_;pO9pS8;8ma(#@*jH^HtzY z{{aVIipui*7-aicv$iWzy!8I7bBNpg2b#PR{T4n1R%hY|(4BqWJwx~Y`hx;%u_eYg zv`?S*=F|HtpH7VFT&`bA-!FN0`^X?K|2mDmaG{-p+edk+JcJ*z=F=~9BcF(I<2hG_ z@uuB&8aKB$ zWH)VN4C)QFy5|SG$>;S}X%Y2^s(dnUi`Q7oGKrqa`&i@a*ZX>V{v4h^#>Ov-{8n*C z#T%t3EjkR@K=T`4pXy1hcei~P`~KSsc*+2HPC*u4%WgP)0{%!~(ldUBAN}~W)}!uO z&!~#L-rYY_z0FI_zbf0tuvfvOqzt$>TzS3T??)8Y*n)jp=Z+nX!+(cIx> zkU8s)L zeu=%;n}tv3oDteCyI{rf=#{11eqEzoAoy5K5=GD70iU~LgKM@k=*2z{WNgGkwQpe` z+StWv?2LLV`zyG8UoyYHg8V}V!1rdeIo@4aag_H?O6$LE6LI@1UB&OB-p%`6)e|F} z`ni|9a943%tY3UcdV%7!N8SW()0ft1UY*C+s_g>4_CuCVXRatM&N0sIT^s7n`tPcM zm%HOjx3OKX?Xzu7W8_bR%-yakF6m7hBk$4kbx7I?^{}5u6ULu8 zRe$vPQ+;@2x__hJ-|Eek$R=>*Q07Br#&Nd)3s%qT>FvR#2dPc+b^~=h+>f<&!!!8c z`D2YkLR?99z&K>j$c}cv#7Mu|r{?Uf;r(Yb*IQ|8lb%s7@q2bD*;+a5JKbVPsiK|% zU&R||+#KS{;vZ9Xf8<4|}Il{^oRd*uuC0pV7vZ~HMCN8eP0Z_h0OA8NS$ zll4QAyLM)PPfX`8m!q$}J}i1FH;%U86UOi98ZJj4>5$rKp5C5?{~eCK0{{7SI`sBV zx=*qAZ&j-A*$Th>KJY22M2nV z9S&`~YIoUw%cDL=T;0`RfTvVs{GgW?R+%gFvrS9vy!Q0z#p>Ap@C1#ou9u!*dHGRp zi{6hOquvJiuKvV@zH^Q5&Zfs-Q}{8X!Jltk)$>xgJv%wTX?iTK>XqSKG&^Jn^Z8@= z`HY7WxYey3<4U6U%6Es~|1~gyyTYk+nXm z%*Xgl=%+S2%)p`F5e1pJs;$nW{cEk`?*ackeXt|AkGm=^ywATF%jc})hw1p*9|wWE z%+UdDkafSH_qMfTK8kUFjo)VUJ;h#ooTaz=a%sO97uERx^(uIUj9o_`9;c4nZkf22 zZg$ygQT4<7Us=doTdQw>E3R6rJ@KnI-n(d@*E+AfnRO}PYElMl3RfY&;P3j?f>~Mn zVAHoYd!_v9{Oie``yr_XJ+wI%2&Dvi(0c4r(?cAp8*#i+6U;DlK93<{Nr0aK3UgQ=-Id9XUtkZTwF-~!-Kw~eY;jPq^-+^=DF&>*Td_>Z|WYJmL3k=Rht_4J@+}|UG)+> zWidRoI)AcpUqH6*%OAF8ReXI_&-YXIfBJ7v^0^u|$?o#`ghQtHy|(1^so*>MVNwR{ z3RfQA{dpr%p9@F3#nYs~Z%K?+&dBbp>Kx2I>p;c z&q(7E5C4gc@r%`K6!ksX7rW{Q`$F~Wdik?fcxj|(!TbIKzD^3C5AuBDrm6iVJ*v{p zA@5On&z0Z6zP->lp|tv^bsDa9pywX5k)O10;%2M+QIZ!RegGYcAE5vEH67!o`P9eK zC5!RPEnomppJzXZc8q7C zp_*6!mxlrE5#PVu6TatMbN#$)AL{)u@nzbYl!1GNE06DfAH9h0q}|S%F*~!5p0z~3 zKrRgW%ir&F=k=Z9hSw(FheP4@MdPXc)c-7GzCT50Vcaix4E{ebop0=2H@b)JhQD1J zKKWns)OcYI?aC8@q6e7)y~Q2$qNGv~<6`Ez6a@ZId9_GrKB zN73u1ED!Wo^AYsqN33bG-+}mHIdUgG99gpJBd*t4(}s~g^*r}`xb$D@vW*L^$=HN` z!S5~S2K*9!-b$O7Z?*$ph;Z%atD<=9tyNhs!<>>UR7t<7eUe8z!AYO@bRlbmpT~as z(%Q_hx}G14zN_a2xZ*UwZ6t1cs9y>g@V6N{Td7PO!&ND*nyp}0lqcdpH9#owpRTtc zOW^M%Ut6tr;<=@w&-bBO#Uchp%kh@~W1vs3 zKRy0lut)W|_FH&KNydNR;lD$(Du?o}So*wW`Ck7<|FyqP%ILrL(NuWM+o^tx{%%|M z;kR|Pe;j#A@W3O6ThkH?aR%x4)w@LavEkmlQ{*z_oXEAw>oT9Ndfz?KN9(<={_e0_ z`;;bbcR_k@wL~6>-)G08wWk!@^30gTKCW4D1kp*yHu!uO`Z`=*+wh%lZphtct=@@x z+h#;k73=|io5DNl-W1-MMn{zDf@@#}PcpE#2(fuPlS9-p*U z^9+3Ahg1OH!RMvm+h;{qw`bI!G+tG}H;t$44SbgN;F~)7x{b#t?XR{U{s-kz4FcaE zdI|Y{M@HXtTBosiCiTJ(wV#g4boMQM!os=NvRBTAHz?2Sgm>WWJy}P+B!dsGBlx{2 zj`4yI!}I*lT^aXPmAuLy9)3r^bG3NKQT<(q8d3j}ys64KOJA?Xc+BmEJeirHC$B$N zKZCJ;ikMyw`cFf~_@<0K_Q}4{!yPjXHX8ncuL3g;?EuWF+e66(| z7UiAzMRjbZgrDT&BY>x1X0VO{dKSG^yCl$?>;Y^68&}2}JsY1Fy!yofuDIF5^!3^! ztkFRcpFRAt02jT#ME_4E5C7qm-?-{UVSGQFNnOaDyz=Sz${yb~nBSpw@uPcsAn&fz z5QRKn;I8@&VSJBzD}3_5)?91l=~43jbo$Qxx$4W%Rd|1|x6}G1Z_m9g$Yb%t5f#ua z4zW6HDdhVP+*Q9Pz;$k`?j6kLfY*y286OY7KftB`?(-$FN%nJY68M#$pQ?8S{a^mC z$&J1Jwf|8GKOD@wqE{0ivP4mz4GtlQ8&%GE!L@YVRk(BsJc+pk4}&xPo2jDhwClm8XptM%OO?Eybu%KI2R zo!p7juoGUxx5U`8e`M`LgMZu4S1INs$vf8d`YzV4xnZwtt`y0rl)v;F`sDqkjQ=;(F=vcID`Ec|=+We3mi#=Sj=y$g z#vnW`oUbB!)tM_^zXv~BoP|wWXtlQL{Kd7QA6frh4eHn(-#Q&yqw<2!mU8adEXFt~ z1HlEAEPLc{2e7xD6yY1q+BP@&!rY|8(8-v~W3CS{{<|@Urtt#V&-*?RV3H5IetCgw z+cL@r#a~Z>hurxCu*1PkaQNMOt=8;x9fy2G!C%C9J^U#ACdZ~l|E=V`tI+|U^NoxJ zaC}+z@5*-bxKO{>2lShV4?*9eJ*?%p`QpHz!t?usV+S!`XQG?H19m)RbB+r5?w=nr z(zo9g!NX%Y?pJf#k9=n%TDq!J zH9ouJo1NWyPxv;bpx;9|qaJ5Jp?OP_cObXhhHLRJV&dMn$}g@LV^I8adSBh|qd#YB zc~YdAXXK1ZqQ6|g7>!JIdw$RF?e9CU)Zadm`&lP!L&-I*_~YN}nLm!4@)z(&3`~Bn z7X8PuBJfM4B#uY;CVIi=k4|3`T4Ozl|D02ROsn!g*a_Ny=npA%a~8~}FM3}2OF8Ju z%3l&+tlXDz?_|vg)p)+R_akQecP0mK4E=|W))gWvFSooV;JH?{T|66If1UP4>fCBi z?bAHJc6n&Ao}ZIP-ep@?G&0hm=D9`!r%k%|-g2&}Aj)yY9iQBS?sh(U%D8Y%9J2Ng zF^@y_pE5YqulWeYwLQgJW$>s5G^(QcyJHi$l;_$W7wgx0maTDowcpLwiR2}oW>pKU zTxpGu$HN`|asT|(@36&gbd9!0I%Z!ouPf?~afQgJHe6Jgg^?OaeG2GkL z_WWjeLV0VDCp!Dbd}=&TI38RGvd_rk3w|X zjl{X@<5#{Z%&*R>r1V%H=QlZvRCeiBc+`_+pz&Q9KIoc7de=VG13Q`t_Jw4eJst{|s)8ebFh)!7ZlygFSWnW=t}ssaX41(buuya%&Xy9_IJmtKmo2h56yySH6!}2L1B^e?{*E`hakYn8!>(zb ziq^j!!`%A)?RZ|-cdWDgu)fheo#rkG&nd32>lf~KO&-aL>(AOh1Gl>-aL;kB$>uEh zU-t*N@ayQ2=&jed+KaugCjo`e!UBil^^=?Pnc`k z(DJ_253TxF4GYhMpZ55f^sk#6baSj<`A=iu89QEL{^*~sM}K8?UyA(`eoTW$E`1=( zudYYm<3leVza)=|3;MF8XZSR8gGPops^=#UeH;Dk;QF%p$cwgC^N1*~h2IUJiQ=;1 zQ#Ew>GSH{+BM(1hF8vq&v451`FNj;h`iD5~$yI+M(wP9tfKO+y(S6p68?M37Fq3IId zH+#y$`QydZ!u}RJNF9Was(AQr_0OBLVD6+Tq5g1R^55UTeNs3lg88_wkMQB_F)620rpS$Oe_&?`J-;##{Pa zC-AN5HQ|1JFFHgzv-IUI=*!$+(k=r3r~1MILoeqx1v`HExxtP<;8pCdbHS&FtmSm8 z>E)OFEV(-){C0T3+kP+d<|kRLNhLhrZd-Vr@@TF3O@C2=o=hM|V4SQx=Qu(CuYXWYukG9`; zo4jZ{=?Qf6Mb@%a%!>x@YVH-_(jRp1=bf#^fiaG!JW1&w>-wY9_BI`;==Ejfdxbzh zA-wwk*gFsKDvM{~@6r^cCqU?-hd`>R2&lABG(hN}Xb2D>N;80hH3%v;M8OtR5V4@3 zA{M}gqJr2^QL$14#lH;;h>GU>&F;SCq(Jn_z2EnIcc15+_dRFZ?Ci|!?CkEW>2INr zzp|Xx1AXjZprU`pCzynXQ?U!8$B91g?MoJaXbqq<=ik-7uTqWwaQKz@DCph9(|`Tx z)|g_$UpfjIT2!CifAhr;d{8cZCw83cg5*~TEQHWHo3Z1J@jdN2OAayv z-9oOcF(H9*%IO+92D!XyYhcGoSO&Zc&}Zo9P4&^+MzGFyn@g&*{&~`xlxc$YYDm+{t6#(U>5t#JW@8+S z5GK8R2f_5;K{iEZXHAt9Mdd?~R^Ei3#11vFjBkfhr{_WQEmiIP*r7yT#4ToyXKIu3 zs9)wE?cMxC=y5gkwifn0vD||@@)`WL4^#1b>^-=~&QuN>ANz*oSGj}uuDYta(N|1) zCCgvxH?pp)wR`1LQ+O8oo z7JEny_K$M8f{uECF{W3L_uqUghThdx$c>`(e&a{q_gZ@(e-(D5L>~ej^_YD>()>;4 zXDyr1m%rHbx6-Hbo1puD$qwC5{dF5zm(jJ@x8tq5RKFIyz#fmQ>PG(&{b0jo=wHZ? z4OcMV-i`i#erP_;eEzY$R{zgo+!;EIw4r^Ja&K`ipRVuP=Tdk!wr}89pLiYh3TvA+ zShrq^9u);Y{TS%KGQM!{x3}+B-gVp#`WkJ7mvJJ4P8ERzbY6nET*?pMdui&kda)fxZ9e}ShH8h7^LBh@o^jx9(PLAR zMeapYM|7P0PPM-iC5`-UXMZP48u`r@AxY0z9G%F|lw|vx{oTKgYC%FLBy#AdEHojF}tDZ`q$9{woNxJwKx2_lwH}Ot^NdeexZ> zL^ZYZ=8BX(oOw?)Yd_HDoAZ$iI5m-!#mGS&-M=_Fn0|WN_g$7(xP|>SH@8E*xv-F{=~zc4*|cAyTG-E7O|vHWOP z)8rqK52-V3+^mDxrFPkOzU$oV)~$)x(Z~gf7yWDsky~b{I@O$g$Hapl6Azs~MLTcc zvez4&{1y4JHPgxuS@(GXSv+Kz>M&TPTlst%`Y1Y{$ZxTyK7-_1IY)I}>g=gvA9?;E zYafwy-=P!mH!@enyyVt>WnFvy2rK_)L089Jiu?`iGurF}K`*Ylp84q%#)eMl_bpVj zzN%p}X}_#vPRg_En6j?(>dWY-cc=zGy7|AHiNknm&Y7$P_wQ-O<~gBrCK7*x)wj~O zV2|$1JDY$(lff_fmE;rq(%$a0KNmc{@5dW`Bl;Hf=1u$$e$K%@Q}JSzp5(>{=HK$4 z2|XLwC*OUys}xJ8+3+EX;SKB&JKM_HbPT9mm+iY2VsI=ud}Ky@RT` zX@6=b*4ck#9hq@K`d8kUU!$V#bnQ=K-0OfmU!6`oc#!umYO022->v7LvDGy)owsr` zVjY)#R`l0pfB61W&HFQZRg)evKVRdw$A7uH4Sb}bXA``?Tfenn!#nBS-^h=@lKG$) zt_F4qX5Z!Zz)#k|L0!6?k=dnhm-OLha@n8fHOuseta~4OleI^k0zNjw*U$D+aSa3? zZaEK|8{v~v;~48t zWvow82?JD&=|`D|{q!fa*xB}zyqAAQ)vD&k8|*~7+PTOu#(UYP8&4hePYvlo=n>*e z-`JU;gSVqNf4*Msld}6m-KX&Q~?C|)qt1}imv*3G8Cc0G*E}pp2(5Y?+ zJra7I=*`pE|5K}`tzYb{EPSd7pR2S4XD3PpXZKA3XWJPMk1=`G%4Ai4tlJNp%DgOt zG+DJ+7x)C3e?CI6TA;@fuWOaDc52e;+Oceo$#-^Yk)sk{!QfY|xf(f!9z_~c6LQAh zKkMlABV?)EK}+eZ`&6^*Ub24)m}PysJMtu*Jg>#8w4dF60y*DXi@B%lw~+m|@_y$g zRd2QHe0zO$YtaUnkvDog%{_=YCinCOmJdgi~FHgM^&p2k@TRp5|j&b9d@MnH|$Di=m zFN0WL+oz)Q9sP=(_($jueM2{ZPM>Oy9Dg|A578&zI?uu=a`>%rVoTDgja>i8y6>Ik z+`2Ekfq2qYE2|h>DRwIWe^^BU$Un{65L-S8ukG#3A&k21H`mG;1g^wG0IpP~KW zGVhjvUkKwTXksPiVGoARC&K?1gH)kk!S94G8IxwIQ&%|rO8ukC+Hr6Svf(o1Wt|s- zaWE|f++{)=q?0g${;I|0uJR82vMwt@N5A7_BtK$q3jFv8{e6l|6#5fA;hYzkuVtua z=UP2M^?*0m&ZmFD{YA7oZy(BDUU2^?c4jq;@{JvuG`y>a%cy8MKcZq;0|IY%U<-2c zN4@tN31CxC{z(6fBcFuM$I>^9d80CP%1EatwP~T$+@HWdc=AGBoQ}x5^pE)Yxpfux z$xn@ZQ}?_K4NOoq?zQw`;Fo({WFCv}2wiSG^827KUyL16d_lid+4kL8@KHqnEwip`?F2|gY%W!SZ5;d@6nO@8OL?hbKno$uDb#{sRe&rCz!GD%lXXq z4datXJ(Oy8Ui4 zkFK@O#$(4dHruD7Rl~(9%FwsO*C^-mBmWzrH#h988clb0M8;3Gx11e6<-Wv~d!dJF zs>MQkU!vF%)H7Rcyy!vC#-J-+t5QD_KR>`P>sV{)ldpo^W44>kuMwJjR(Gme`l~}KNenCsA5u`d=>tB!c{BddxOW2vs-jhj+37f|L2o7 zf%M<~;P38Xy16<3waqf@RTC5#V z{K2dOrX-7V14o_y&JGCtviC4!H~T-pm(-8wP@OJU&D{AzO@3VkxJBPni@+7M(O{3? zpE}j`A?xl&Z&~vPhb{KHb-g%r4}L$=-&CvXYx`S%bsdP@?dJG;8w%LT=&8sxg3d6H z;49Ug#}|9v(i~_y$;M4V2FY&;ms3w|9n?Ej=0KDyA&)l7ZwW0^m8#Oy@e}bPXQYoL z{KRwP$M#*mId_IMCs1#5`sJD{%rBLYVt>o8S@37g4}*H;3`@J}Hr% zC{LM>FIa|t=K7>7I&0mb5@Q47RTX(N=@>)3ba7{)FQT`2p{94Qx0E;Crn_pm(gWe) z+QY}@W<1$%%_7l%IPzHUa)_Fmmqw!|%H;GH0G1i6Fww8h| z%&$ISzGv@o?~&f6=fKRK1Nsfl$n2h$o;D~v=aU@LAI)n9?LD(B?VTM!T)UOigCrfc z2oEpE!}Hux?}s{Eaw9*aJh{K6MXZU^RUfm@3Kf+~y;ueNxMd!=r_jCQfzKFw`M4`@ z`sMWRPE(G``dH~YKiYTsuKcT;hfwb&-F>>(r)&W}6g@A*tZ@8Ix>0wA(y?|_?;|f2 z{JYcY?eK@Ldn;w!Z{u3LV1An)m%dBAT;^$hkgoPUz;usI$6U&%`vr{2UOK_cJjSu^ zzuR;l-%K7?w)|831&=?#%kDyW$-V$@j+tX8WR08ZA;!bAtl1EBUCZM-W{6V9KU)aT zU&M`S9eYY_9M?|DUbEJ*DXn8Wb>eqc>(;G1ngXP}wm12BQKPQHCJT>v0YBJL@-FGx z{1T+Q_AlBM>!m_(KHc_*$d`i&*i&dT!L0qrZ+Rc^1@n_y0l)QH;nS7w2M>)$W_uy! ze0Pq9dWEiJkC%jYwd}J$&!2(JKOaE4mh=a7s{8%G2U=;4Ugm|w>F(ZL(#3c1+o6Y0 z&TsE~snEZVv+`8h(Q*^x+!;1*$9wj-{5pXT{O~-)iw`ZC5`ctJmGdod)?eZ*KKao)oD-J$RjVEz}KoO?RE9G*=T;7#ECB> z@0$nhXpY`i_Y1iU-R!BzoRXb8c5?2-tVyG@anCe%va!5CzfnR%b4?Md1$`~QCCt8% z_0&}!{-D!c^$|4Pdk^f=H9ak}Z@)pkdkoL))+If?D>kNqnvv1c%Lw|zjYoP2^6{K= zB*uoUAHwAo^5akT!u@vLN6L#Ypo~{eiH#LAmfP|&dU|fIFez&UhM}aNS!ed- zrOudwoOnx0vLV^qM_0r?4PN*A<$CPy%T+n6PS8=)Z8?87M~*-f9zA&UC1)fhU43{> zo^_6=e%e$d9ege!&Pp>wTlan$k**ALC9zMa*5If3pn(s#OXK%T(tQ!wBQpl{?l++K zpy6(e>eFSQWi)BWsGpIS@7Nlfw^2GK#GjQ9dgBu1Z7)POqh?M+eU!bB{_SHPUSuvJ zVH9&tg2wNW#*so1yohaHLgHroM5gK(WNd&xX>ZB(vTi?V`V_gJk950=OXrsqm`4zY*QjXh>utTMvmCnGP-+(KH=?kUp_UAHCaL-NDnMfK=r zF^8)h%tRw^(*Y5{*<|Y#Iu^D^gb-OO;+sgtx_c@O8erK$? z58J>CHof@((h zXV($B3bl7Y8ZFE$Qk?0JE6xPIoi_iC&EVq^L7COo1>@@#r~B#j*vhnbU68KIw_bat z-oo^3=rn?$O?&r*?ED=1&4nk88^Fx0F=JfO9$&`C+CPqOYM#0d-0+OIfY_as9j(Ir9L#F8KSd zgpXo?{e%<~qx-TREx#q4`&q>NR>w37;#&9Oy^&3K*2Sc|*Vkio4EBW>*Z;B>#BUQ8 zOd#E48LbFXZ)#8m`k4HdplefaNWarDb%Qca|BiR&bP|5OG0@vgdCVVO8Jtt%9r-As zgn&;cA*WC2T|zL=j|e0f16Iet1hzZqo%x`#KDgQT|?U8=D}AyN_h|1d8SF% zj5rIEu6u)@$LOndP7AfS6LD^i%-&EPV|4&E<%7U3A?1}pmc^W8>mAU={5CMuol3e3 zEuPIh@-yMzU{Y4BBTrKdUxM#+J`N|G-UAKkRhC%!#F>h{{IYwqXW!lJ%GAEPf# zZwh_Qt7q_NYG^6+FxIOKKk&N(d<%cdTDOE`t0U-ohv?@gBl#(-8|AriY1o&XHE_6+ zd{vvddHoi)Y$0Qw&EhQ3G>JivpJ$);dsdgup`QlMRu<0NF2zo95%oSCB#250Ke6uuzkzGM{hc<-JT;pfbj2+pxHf?o z#v=4U9lZg2Rxg`A;=7E}-8wVewH)sM?UgUSSS2L?XrFQyHe+}o@AAmDN~xwd^O=jS zw>*0hXwx)kBPkc#T7k`X)V`swCL5&m%);7ZT-=n_ZQ~~KnaXE^Jn?Efd2Ae`dDr16 zEgAj#r8AMXpkYfMm}$!iq_CBmK|!O6FD$(uYx5DM$$c!UH8LXpA*FWEzrE?7TjH=S zu3)_(Bv)+ZN8x)syfsY9EqR{T5=4Z}O=*42gfJs*K#zU{`gG~rEsg7ad-T&fnuJUf z`Grb0U~tADN$2K??mSr!Xky{{K|B2OUUSh$oem?hLRX^&s&{PKi{aVhJKA^o#&3NM zd3y9Gd#xp;SYFa~Mj}rr&mV91*?8~U%hwD#m2k%-^N=}!%o#%Y7=I6X&XB23=5q(k zxdk)y`{f|Z2)f>4R}OQ-I%kE;G5`BtMfP<$K4s5}3EMZChm@gX4u#91{$ESpuja#Z zy3HSLtrs!}(sdgbE+=%}L-fs(=UG#;vvNm|XNpoB+;ZP_+PV1fgRk#K)`dgk*PVWB z@D|!XZ03oD^-P)9MNWr8_#T%#8Nbrt>6(82ny5;GZ<_rS)acJY%)C3a&fwu!h>CD^ z5AzV*%A6_G-{yb+%i+_kLCT*u(^i7uQZt7N;K%*OsB{U>4e>*%RX?7Mt>_Dz|M-wJKc%d&B%A07<)VF&t%?BVeO{{1X} z7E>SlwLCkiE{ENO3w!*MB;PktK|C+{!afwUheXi%9ZA0Rbbzl0bY`Vvg_A#```r5KSq1od~N@g#%?D0ehuw&g+3VzeSP~B z*05^d7S!kKZIVy+8K>AdM`v=D%!EWo*RrM~A&`GAU#k7zr_b^B_mCURQ)~jd`rC!_ z{cibIQb@jM(Szh{jD+p3Jo^hfS{1kc1ihd`V<(mKOYK@ipDM05^oh-#`^F0ji8tCc`@Om66dE=r&~2h_{f&) zeII^aJ0@qWOKA8n>>oku`#hKrdo$r_lQXAJm^^7*=IF_jF39HGuIcyO>67?FwuTp} z&m{J8hvw0e&&U_qODFQBQ2QeCh1*BEzs9vKv3(Kw3bil1pS)1}Y@=wM2ddvbuO|B} z3}@t4z@R>nFAHu#$Hk^C;qdvwc(LjIZ=o0D)TBk|u$0A9O}*H}>Uy=X2XA%yy5KXk zUsL2~ZFpuJ9|?E;h|V2j-{t%LU){L^(|<=8H!WKS6Dtug&^3D+H9NLU5I$l*lF#qy zZ&BZ`Hcq}{(*+|0@`Ji_zcm-L`5Q`TnMToS6+-?hJ`zW%?np0viz2PI#4A2;=NeSz_XIdoJ<&b@w3J(X=4@*VVJ@SnU1 zeqLeZO;jI6K#B?vig5AFH3K9b3$Asag-oCEvMjpMc~G>GP((9KR0L>n+|b zt?D7@cQx;^d}!Ji(hp3&DSjR5`sa9`BGpk}Ua-HS@c3f#vCih|P}fS`7rJ~`vk#?; zvwH}fAwA#ZLw9s_sB7Nl{W6zt9{IY3;0&FEHu=y!T^(x9O5U$@`H;6!Go8KO)EBa5 z3O=v*>rmHqFux_E9>N?h>QT4eUR=HfejREKcIJ8uTz&9V)E;ZkDi$yKK^W7eAGW9(g)X@!ot@o(QhrEh@&XW^DpHn0B^LkGOb#%jC$!}X9dab`sY4B;L zI(CDUz$vt4>ri(yhVa|wdy{=Atvx+k=%r9T)@EECY9aQzdW?qzJ!C8SGQEB`{{>&j zE^N789cm%4dA8jlpOEhsum7m;0F#l-$>#Dfk!L;cwsJ`dbF&h^+)kUl`UFnv$3%t) z$=CH-E9cYM-%)!VYnmZ>hCj>dQi$Qd5Wh>l_-~azex8E-{q8ltI#su}*MGr(=8g6} ziXPCsrTzarWR(1tka{-z0=@H((hq;+Oqw#?P?>?VZC+5{5c;DlveyfV-+1SUy?^Xe z;B4E`&!;y2$yk^eq-k`v2dCgAlK(1{!{%W%H*;o8eiQV7)wKQ5kUnxCIAtOA8GGqf zwvJnGw|Q85FndS5aYeA&6~4lbY=Yz~{|e_bf3m;l^ZV_p{0Cko#Q);)5pe#QdcukJ zZ-bXMOM>>@+)(Lb>bpoD4N%d|FX~%30b5^rR*A$9kI^R!&2xkO0Hgi&Rl^TqeTzNX z?BDYD8wd}771Zb7`@1jr&%Dv^vge^?H~YWLWxYKR+>fePWhNm+h8)M^fL;&b z_nKspy#x{lPPM;z)&2Y7FA2Yh^1sO!nh%iA>?vvO>N_4;?e>@mjjQV2LiiND-sp_J z-9U48%Y^=|%|j2R&8#66)(e7hdWXS@=DfeTgKQ^bVUnVh;r7AG zzRudw=)Ak|QFy)5<)EiJWrOp`smS}TG0-Y-aqp)381SPOJ3NCQ(V1s4u4F%G;lFP# z`{_Sb(LWgYq3dsD{$^<{P~ItoP$2nFGq2uxYxU+7rRFB7p8dS@)~C^a=p%cDGXC-K zji;;cmg}YMIVCx#uz86+r*KNXQYU?(^qJLF^zZ68vyYqdb$xVD$uIj_pIga(=GCgl zx9%K4&%NZ|f$rYMz^{8O(k3Sz>|8i&?+oL?!fUAKx^AV^8eu*#N-NdVr zZAf!5Hu#f*c){PpFR{Ovev$rJ7mq)obcKr)dk#u;|3}_p57bx--zAJgpKn%8Z*}m= zdBukYA@9)jUV4MGi=CLq>~`ZJ^~>IjA?wMD41Agi_+!9TdyKQA5HI&s?5FN8(J$K5 zHzV3pUyN!{*ZBdCk5%SQRXGPR0XVh|!*+hJ(+hU6w+ET`6zvl~#?Re?EwVFq^uPRg z)Bg`YV*6kG7Pk0+x3sgzDI86PeO$!?E4kfRg=wbU$oS}lzPFhz@Zzjp?w1b z{E6T2SzD<81*Oh-mh<+=&Ss(ec-gS6&TmZq_wa9r4Qx92t$AjUKRyrMJHWc>v7B>a z{ikAY{A{wH?br}}%Qp&itY?86^X#P>uXX;MxT{mwr*0`)F5eAL8*RB;^zc{=3MVZQuTF%qyNIet!U;ksqY_fIbr0aqxK(7m_bE&NM}+z>l@A z+E>-lQoiud#jKeMeG7f9jl!1OP@#5N`byo(T)i!L2X7)@mS?d}G(gqftg4xF2*m69 zv`ykW4rkqt@$g~p*?8KWlM?z(xYq9f_$EV{Gi%YG2J|QOKl~8wBi*y#aMt4>^5Fz; z9JO$J-*y}b%@2iscR{mm;1l|g_bHtfuJn!-_{?6MrN~du&*?JCe|C{-alSim8c*Sm z@eV@`522elDEp-Zh+K%AtM0@B5`j+S1s*Io7r(dzrYR;_cTKxa&xt!S;Pe%M9 z^bvnB+mL3#>lz39>t)aBLou|CzL0(z z0Zq;rrfPlT`UyFv8&tM(?3Rc8GHM~GO+Sg8JLP5@e;cFfnXj@>bOMJpRGnr8Qa|{= zeKB}?(w5J=_?d})+nwjYccGfO$lia&xn#MULLW0mH5}pOjGPx+3x5eeO2}A<-qyg) zCn;af{YKwq&;1G=4dnBEtg5%$$w}E``e0{x6MIHw@bnvf$$gs%QkK9c_hU4O1I8OI z9UdUf0}WJkU6)_@T>g`Ixo_r=W}I!Vs-pYZ`)0&OZO)uYc`tuJKh@)fe#&!xE`?5! zt0s&II;rNP&i}vgS>w(&9{ij4mAC7%--CY@i*4#`&JLWEJuz#__{q7r+t1C$)xAxQ zK;ryc1K{s$KHk5Fa5g;*<$*i@-ONPe7h8XyYrI!sBbs2u{vk- z@5eUyHg>Ep)ss!lh_FZ^@QLCZgK zf83ei=hC^V)ur}4tSBV9!5sD0QJ#j`P&rs&O8yc|^Q!u+Yd+^%Zhx#3kT=b|6RHSu=YNJp3cR{ntF8 za7Vzod*E-i6dy;!ke3x%_q~Dgp9BAC!Tom9zWb3c5_EE*|=k_tziQ?bkc}n0VXwhJHt4PpEZ3Cyxxpuig>lm%Alz z&eJD1a`C740>8DOe{dl3q33SH12r$S@n$XWuRm=5xi#&R?^*?_h8c&Y{;{9h|F6H# zi`OZix^Y_QYaM?JeaU&jcXvWRAF7^R-FZRItE;!)1Ao|~$`QZ(O6=3O*mD&H;5X%Z zHB5!|J+rmEioDZm`A1FLZbU|G;0xhkrF~ zmLPs!(`O;?87Mp2^QN-LTQ}~`+;#zHo#C_fq^U3`;7|Mn>l&XhkA!zbe$1eb<-J9I z;U5P0o2IbFSOwnLiXHg|rEa2+2?@2_dGyxH%)CUWt+DxUyI<)JH>$?C(l+^t*A4c< zH^hs-^}mn-Pd~13Wo6H!i=Mm~nijvOb9+M{wDpGC;##SCGpV0=-C&=M7k>cwFjjZZ zSB)REew=kGW!D5o;h#moCg;a%&awO<@_%Y)KAr5;5Kp~aODEvlK>0>bp0eGHe@dPY z(4SYws&bOT)IWpsfwVjEESu+zwb-XJ0{M>~uNzi&ek3xL`s^!o!g8ujZ`IVmFM9q; z>UnFnQk~wg?+-3lZR@)G$Yt;KGfi#%a`(WjL-1dgqL-ZfBmeUAZGPz=c|ZF^g#EQP zv~qlcTNkqV)mZuj{lGlWd6adjYeV?C4nPSq&wTY9WEkbg&JE-b^IY99+0A3$rwr=3 zf46FVnrpwzgXKS&2P2=gqK)HUQLX12`d}XV6?S@WI}RIZ`VGkJ)+?>s8NK`VH2ovz zrAN%Q=cTWF(!%o6TopAz)i?Bq{L>9@xBritV4r-~sqXyynDfL>vDWpWl^=4pc+I1# zVJpXf;uq(cHT26t;?Xta{ew?b&2%Tg+BLRLYj1C;>C}AcX))*i}A_$D-b>V&Oy+`4D?3i#0S7xu6+pqaoCdD zL8H)azc$DY>bvb))oiHsw;?*P+Sb{WsZJ-}h4#NW|4>4I{XT)dd!d8S_f(;p%ns3;k^m=r6t^_aDNua$j=$>dg6}v-!JJ@)~9DBNBfO4HqKA7h~hOlJs_XPy?t9P;fl=l;+y|_l2aZJvYV?Ix|2OlXbJyE= z8UKfaVD5|D0??J{_8#ZVQawuQa$xAeTzbtU{j3Vj6mPaywwHl6n!iq}n2vB#nV9(RWq8(DwSR^o3#|8z7gsic1C zzwywo1epiR`{USYo^tdnc9aXCJuhC~A9zHuMK72qcYsHdFSlvryKX_?PatI_w#kgq6}5Xn;#Od8v>h&r+*~vU(-~bX(9b9vx$^y`cF4*i_P;owf_?rpPWek z-SB^Vn?~-yZTeN9zYwpc(B|2UJMU#HwS;8Ny>-AHj6V(0XI{7Z={Ixfzl&+hi@ttp z;-zGF-d_*@1sN8raz;b{BL6OG$A`M*Q#c5IrGGEG&BhE$@KgN0S=IFQAN=K+AoMxq zSk|9Ase*d8eMbMA)WF8iJ;~2sd#ly&jE$g0EO$BFiwz>z-XR^f^HRT#u5R<8Um0I} zTe_=)zD_?9JK&;~%Gd#ge@^?B`Dl`=H^R+Nggzvcxzs)fj6sehy7gDuC;Ar`&KUhm z1c2y^Tgnm}cv3Vzup&s&kd@>0>^)X-?7WE4-Z2At?={TTvs(T<4^Jy?3eEED|vSzsx1C==s(>E zdir=t;Qwl3OOvAG4Dc`g%WvH%&c@69b?DbN{(4o}mR}$Kt&Dz0KEa>7?|EG8&~|)0 z@G0ZZ8`gh9Kj`m0JH~f8L)AC(Bk5LCo{|5beZpOK^i}PQK>kbrNtzBXFizeG9F$+k zPN%-Q-j*TsBk$*C=$I78AJRW%saNDv679d?6!gE-eEDShuTgjOt7PN>vh2DV#G^b* zi5~q5O-hja>Kdn`542SU&Yz1}V|vN;Yt*wgUDRfE!c0}3{zd;e!u=LPUyCZ*e2ov< zXKW?$TYRj||IMIY95?GeEVECS(@~y=qzxEo4qr*qSmy3a(CM$7#MXh_=~Jf3&a7#< zxFENI_>o`HhdsQLpAqH})4rw<$18Pw{Yh=c7J?4dEK#MH@mcopezn5RPbc=pRy7j+ zVOP*Ua(3w+==K8WQt&VD_pmR?^E)m6#0G*>nLoD&s!zV<_k$`Omr17o#XfNg@QNM% zy;{uw)9H(k1N}wtGjoG&4t5C>8m?0HXBhn0vv!%#q}Z|LdH$o&&+!3#VyAwFI#YhI zdF4AQBhZhwoCZ*&3tEA)E|GE#!zr&C3AsqR|;=*hPXGoLbkV}*alUy1yAMm2rP z+JD5athxxEkv;VU-5FUSk@7>z7yMklSbkwwaQJDwQ8k{VDv5kCdxx@zV80o~+_Ex0 z|LCunT7mro`;G~pOra0ZU1pR+pBSTJ`+54`EM#IPb)i32eVKJ0kQLo9;Ga&_@qaau zer-(D_rA)`B75YR`fH_&%uY1?|>KO0#(2ph{NRlC65mnmo3xgX8mm-Zs}zWj$ZyJ@07 z+WWkdnpwM;(BFD!%dSXlEDW#9X3Y{D`sSR8@Do>eQ@2+6R6%lgHuDyubcM zfIopxV3K_oKSAFa%Yd(z>b$`^l%jmhWTyRnru zhw=}rsJ|S46R*C@a`Eu5yyKHGI??bi^8FigO4JD7DY@C%6U`117{S$_S{|N&fA8)N z-L+uw>?3j}M4t$aNw|?VJQ>dm_h_Bq?$K&L1HPPxo;}Xq+tZG;D`Hfg zJ?`Ef(I37ViOhpW{{tP=eiL1AyRW}#ssD-JZT%vDa%n5@#58dHE&cz>ZBo0HPrQqc zdEh)Zev15R9OuW&yKeZYIxyVDBmdOoC#?Jv`LXw0bd+;dlbx=7qo3}u_MP|OuVwp? zUm1aYXJQ_6mkst~YYD!kf24l(h5Zlsb=Avg?;KseLI9t7($gP7``ec*-JqQ==j`{! zM?%ie*8ag$58sCR@MQ27&2boCG5ym&MCGhLUx-_eKo zoBRa)Og?1s_vBNILETh6T*D&2WE~#+$H25cT{3$08<6H%LTq``KIy+h(4~YbkGtna z)#whl4l45fLG0H1*-8s8fM@U*s4IML)8sA>`~^yU zP8IvVj9*XE*E!$ldOc}B?NetgKxbT$Gp4oppRvh;Z{ipAW^7~pkx$`3|N8USMC5kj zm60i=|3&|Lx0BPq;179!K3DdU;D45Q#wXo)i9bHcyIOjcYV@KTpG-V9+N$g6Kl0y& zJ)`lRs_}6u)yr@GGx4-HoPl{$^Fpj30vE$&NmSzBW}uo{!NjT08oRk468v z+0?J=Kfv5?EBljI2ji#2kAKnHCr4c;-Hd?0 z6TnT>S$2MVkg@NTi&?oI@`+}<|?q?S)N&iau_&D_a zC5kToF7_)={}%cBeq$?NWgp2O?5U~LP&JMh86oP4v?p zHs0uGjIaGqRE-8&{t{mcnlVP70G>DRh0nkx+7siC^=B*oKJWO5_&E3&``7UgV@n!o zTz;07QFhRF=2dIRLnz?+K5hNwc6|8tM^3{N?apBCtd-K|?rpS`crE9AH(&U~Pgg&6 zdXswj@lV?Mrn&_De81V1vlqF!KQ8Wq$vITLqQ(0fOg9s2igDLVkvX3M4ltjV;Sd$PbU6!)LUWuDMQg$)+hJju?~H%M;}`Yy~cZ3e;-)1zJL24<0s)$`nPxA-h+B~N$-tU^)u22^i4~LF~spq#OVp} zwFy4l>N#Q)k8Is~br}Fh#>!wAn}Acc;Ga>PDtC-pG@p2Ki_GW$6VCS-^{orlC!}ax zo|r?}_<@g&4_977v|plu<6Yn`A)z#)jWohKn#1v&ZGpklhXzmGdk;wKHYjsQzuw(5 z2ldM|&E?d)_0!X>Uti2IgOo}C0qJct>3a8d8H>$e(tk|)(D{`T3x^0o{^fP-x7acm zXFhC3#3qkIVqJ*O%$&$AEJkc`e0RdsjA~xJ)F>hn3>-fGf^>&t^J4IajPBVtbI|Y%aoiCp zbf}>yzI_A+HM)EPke}XzKg?~#lrQv>#(Xz6BcPYe@cDhtoBN06yz;~N3Ff`Um2TmY z{`Z8u6Ph5&Kv+1Fk52^eKwObA7>Q6e&%$X+|E!I?LwS^A>aJFYLSj z&HN^|mC`YbBczqrYvWw61)h<@a?ofURuL5b6}!3IHL(L7y*G2TtCp}v)Ra9|TiJ*5 zt6$^Mc@ey_XSB(xz^8Hq_4tl(UGgNtyGkg(5Ste4t>Nz1JE46U zb0e9($vI4a>uRxI2pdZAq5LdN0ZhVd2+hY-i-WA44J$sEQsrlLIX1}Wr7D=qeBs6x z2&|B_Dsj?UM+BSo_GJ4zy*HcL@pbFMd?~A3ax1>^_dzoK- zTIk%MbB81jVZGiGmkZ$_c9t3N$wlEgj@SX%IClqwAi?Kbf3zf6pmXmXFi>K$jan|d-_vXjX{L|#nX>YKmve)Jo zIl}%@ks%UvdOY*%mu-J(ks~kJa@OZv{@h=6I;S7sCO>}Ob2jZ6$epI<6?m3_kCkzw zjsI^qDHEmFv#QwTmCP|YQ?o`*$nF^HQj-3X(8NMUr-8!<4od5j$pvDA(&C)ga4MPa zDpH}tndZPj$#Vxtqg0cIq9v9zaS&p2GluaN2Qe>s8zdQz3;CrkfqI%#N}yepNb|0} zof%J_QM$u1k8?YYKx zH!hbSpHtD+{otRZy~Ms-{jD&)`~HuEV~Vck07>6NHPzN1Jb$=?%Taf zUv$Luv@Qb-lLLa#Df{f~SyDh2zl%+847CFuGVSgdkF?nBB^0a&kDE&cZy||qJK`U}ZO&T_!k$kM-G-ant!$8XAA zpY3&&wso;z zTsH+S31(b*sg(3lf?%-an0wf@y3iDB`~Wt^ZshapXAYjqhwkgNdgg=6u)|;0(4La|6lj8h~A~;?6>UwZh9vl_La*z345J28!wM~5P2u( zl^z^nsuJIex>>Xe@b|gHUyXYX?P~Wy>uM+G$DhZ#q=ZBL&>0`L?*@OL72>-H{F%Wg zLe9#)XAk|y7p7i|s??(~C8BS9x;t4L4N1n|rzI+q7dDk6(PUl=XU!mThvQ z2XMYYmw(ijC4L&~whPs})74vh?=!=yeYbUIbbkDN)_Ek1M9*%PYTy60{s;e=D2gkQ z83g0+v03*JJn)&pL;a+ebHA0eI1_@J_}E3Kff z3C5pdGwkv{-#~k&-q^KO*Po)AJU%Kveq0?}*Lv0gnhm$_R(>3&-wTa&W}JKaNCQ}@ z`O5U?*~q|e%Ncl#f5&DMLhV5I*mlJH)qdeg58hvkdyS!Y3HJt>PHWBDLFi!xaR72 zQ-9+gX4)>H5ACfr$-dilvreoAo;o&XLUxCwZXJ^P3{B6OmYvimds^1etlaD*T<9io z^HUP*IysZZ*{fd)c2FO(d0YcqP7M4ffz8lnA&oO-F^0|)>G~cra&!PCd28IQ%un)KqAJ*y?9Pn!XuRSB$+rpMr zP?#sAy*04&)vWJVX4<P@=Tk0{(ukB-7B#u3|jjww#p=-?OY)u-Cxj!8!^ z_am%c5wz2*&-yPdT2n;3&a?H@Dr_GHpKa&Su3=VLkW?krO9uN7+|MizJ+|6$^#cKus zMg;mj=3U^fG~NHZB>XsQeNp`6adriraz41fu`hba<+PP{c6%I~^22_yCB5k8Rgoje z>4jU!zXzR)@w8tQd7tCVVtz^4g8w7hxx)Of)fqv&`$zS98ami|n;%h1DaUH@-`zb!#Mc9)PZln{u;H!Pw)##4eE zh>Q%>chf59vMNO6f~hYg=aH>bIT9q78Btd$<-B9hw-$J%x+nFuSxbFoNBa>5kK2Ow zdGe?PG)B?|^8*P37Tc%)O+6!4g2%YC{l5y+h1a5zhAy%5RYQg>eaaM}&-jG%tJj3) zKR<%d+?V&BRBl(dMH7DQcI@r>@pB)u)vd+O*P^n0FL)5U*%L)~4~ntbEIxYc34iPM z2>4?S`;4zuy21q(KDlr7_zOeu0lR^(V%eY8eO9UFujQHFy7Bki>ewY5i%L12nCD${ ziY=%1T=eFfL**cgO*vJgTPB=%U+=2lRd57!|FSF8KJDfqU}tIzJl9`&$EEBDIl z7MD1xl3cn#bcedJFCRJMcQc=JTGSzg>Tt`t#7q%CheKGxJb} zla@E42EN0(^U3`81akNh=6K94!0@$9+q7IaFzE@lhH{?dYZ zdXq)IU$Dd5Uq~MdowwK!(rijz7c=|N-hB<;`xHA8GN?^DPn1`D)fzu87Ko$x%^1*g zIkFx*nuLP&!Myr9^q+}K%-_X)6+f>Q`x8Fsb=@CqmXQ9T+9A)bh1QA$==16X#_2&P z8~&1bk%t)*IHQ0+PT5m(1~k(YIxzN!+=s?&wEXu~cE7iVPU@1}c~oqE{8i_el66LV z(z^DDU8FWLe8wzW>wq%$xBL>jOug@{|K(rC7Zm(*zP&Fx*v6aO+V1dV_hXUZc73v; zNOn!iqa_(H<0WDza0)j~dwE@!oUtS%z1&3YmZpaF$C;Y;a^ms1|qq zx2vHLY@v>ESxQ@j)aSBfPnen=>tVT2e-`dgm!-4_4%H&B#Ur>~1cD1^DGtF!b9il$ z++I`umtZW5hKc#;6HIa>$s7%WY5%tgrf7~M5lnHy%(X>mth5Xe$|BiH!vKY|l!5_5 zSxU?Qp)CK)FARPnW<`V_H32K#Uy9)RrL^=VC5F1Pc=}2?u`t7gvlK^PMRSB}DUM)- zUm`g_0cY*6xzlPfJo@>YM^{c0^`m)?@w_)!jy@dA1;`e!_eYbY9!hGiMl__cmbat}Q zBU$sX>q(}dpW_M&er{LVu|`IVe>=Fri1h&fn&`}dU52D(cEM-czg=1J<%Pz>U(;` z5CTB}wwN&X8*_%aL<~%wmNoi3IlCM(E|n(7c(y)fv%V)eoi0`gg#QUl6aqmoQF7LW@O4GL>CU;uv*d~TEIK|TKjLaUr z)6+TVa!F~SDFlLKi;DmOaC~PE2<*a>>3;-EF(CYR z4_Adi_`gIhz?0U>UmCd(!4e5DWHJ1BgzhPXh5zLU4_`$%B5P9Cgqas*|NFdPYb?|e z^5_5G9PvNFkb?D4NBnmSW~p9+1L0CPKVltK&ZCWE4oT2MIHMoKi$7m{+0C=&jehmw znT=n(=NRU}Pn)zVvo7c1B_To9W98nKv#@^<^y%zVuEV;jUk-cb%)Im76P_LXLbaOF zyEs4C*`!t3FR{0%i+z`JdN6+*%iaTmuE_dqQvmYI+2qPu`SdL>oV@&v^cl?iTwDHN z-_k(V{w2u#@s6fSAJ^LczJoP)*(=aPXpNu2)+_luWnny;--5>} zEAY9v%+#V|*h|)WZwQZ@9UdR=8h68?b1u(%oAW&mpcR`)>#y^Jmo0_o;S(mybVSad zhwXIXN%=pq&%InusUMx4Z765@#22C8@2@*}pPq5{3(r=+_WG;y<0oJTlJE=rn_69L z-;3=3hc3C7LRYxk#{ZV2RO*CKxdo=&y(cBidh*xR^Vi=qKR^CryWc>Kzz*lxz676g zzsTojnsRg<&Sb>b49ZCbQ0S6!ZjIYHv}at8$?O-jFzLqYNeeGXD3&hWJ|}BBoGH67 zCyjFlR*ju>W8*;TXJ!mYle6JCcsKLmfxY^rvgdgT3(pdu=?t zrh;<=cgKY2XMUNN{nI`9@tbHjL04eEQ@rEDqqfg64?clET5t}fh3r$4I;k6|#P7}+TTOrVq{*9)pYjerT_^8J>DaRBeFgY8Xlc{pOH{}AvF~=DUyfYP{7^X+T{#!#G#WOl<$vNkGA`Ayc^`a|`(dO)f|Mio%dYBdeyTQ?P!9k3 z@Kkc;%xnJHzPr-eByiqo!9zCfjOW1VHTK>3op`W*h!0D>->ek9Z{eID$DV!YO+we6 ze2{rQoX9%Er;7(KO@Hi}yp{O3IrmhX_T6`|BY$AurM+i=M>$S@cV+Kw*N;NwRCnbp zzwXzmUoBbr=#!jJooDl|%A>sxxN>AXEY&{IBM`PN&h*2@^vn8h>>oqsQWthwzkSG3 z)4tW~PtsS^ShA0PnCjY;n@rjl9bCoj6D{fjDLfRJjMko9s;;o<1sB+O0AdpcW$;Ei_he(*rwTQ7M0(s^B3Uu$C1W)L@z z^$iKqZn+2Kc1MR@@1-2t<WLAx2xCH$A=F>uIz zsB&+-gs!Wh-TOmu)OK+EruR;$dCCpB$*hxoYLe>e+~?2+K9lg@Ava#S9=|JA7VEa> z;;T{@Hb(igT(zwe}dr@QvaI_yg& zjPrj3B7tZBF!=j<3s3ED*`qx;1W!E&Pm@KTAJ^dP@lgXf-|?7*;Z5>g_m+bv51Rju z5Ap$jg}O}xJ}vlk;WN;tIhx< zSK74a!&|ef*>@@D%R4zAWq+!y`p_nEe*Zvgrhii3T=x3aeP4R|UHa!3oA^iO!EG+{ z%K7*DXY(}HnH{fWRi}>mA$S@)cus3{%xP_Jd9>hR{24uGVfbYmem2q^JZ8Utq4`t5 z4@Ji*<|}29n?Jib;uR^>yEs&DtgE-@qT{d4I{)>mb(#M<8saRyZgXF#-cJrwFMAX? zY8&{)k@0@*k><6fCvf^xM|b9~8+0#%F1rQT=wrV>o4R)Nd%kV2Ie(s*^$h1Mezs|& zT9ft#^KQ>s6!xPO;IE|Vr#qkex8ODRySxM6Nl1MF7~nA<-ewNo{=bzORp%rT@`rsl{;#WWUUt7y1Fmz0^Z0KYU-H2FbUs(}xs}hOd|u(h9ITDgc>}2a{kJ3a z-}DGCyx;}8`3ZS-(2XM_?x6qBxqQ60a(F*KdgSJFI^8;x`Nj=DSh)Ac(nqcX%|4); zj%=TZ3C)~>#Y*FKO`@F3HXGwz{#&wD!@|F>HFr*4X<@ozDezw(f}gpRp}(2+3g%Q? zbip4dK`A?JW9GWJSn{V;7~PVeJ^I!rmUyB_;y$L=*6t%d%a zPQLUn>ddwI4E{eXByZi~SvL3W%``sF15e0;|6V_GW;@^Jk9&i%hJ@;k_v*cU?AJ|x zId$Yp^fq9TZ~*;o>F@Sk%4z-@bKGV2cid{=&kmJCKNlE{mV#}_{~g7{A0DI%wwW_bqGw3Zb%9%g=*Q@cs{A&4?ndDHZ7z2?ZL;xk=)`Sj zgy2eWa4q~P|B(%y2dp?VKmLx*Htp3@NPDS$H*kGk5?sL`_Gex}!Jk)^)_yDFLMi+O z9$qayGSMGtI6Vwgl;m$zuHNuGlnzVlHrUt!S)=dUGtD_{*7`6ERcZ%O(zw5SV~WhK z|Jj-6Qq0RmgQ1ddE@ zjnP{8qSg4>9fjq>72g+|9nmdnSDQLzq0x4dH>@1r$pt6tVW)FS{k&u zdR)5_UNXOR)Nl6xd%xr^q;o>;$^*7$d^+;M-r05_pAmedeIMF9NAp|c((8+`kKJl( z`Lj8AKQ4sV6o=O(LvQ~0^1E-EUm-vK5~o{z{03>A?qT%2H;;_hVwF6q{-^j&bjX>y z-M)ZZop4eJzqId-_wkK4%f#zC#}m(3?vH1wu6;|tyL;ImnKNtP5A=$3TUI9Yn}A%F zaJca-xWh15sxa$k>y9iEOG{BcpVYJP%!R%PI-xF~Ga}lnE268HMTeC5I_-&13$>TN zGvnXNug*!hb^PARtaHttV$!P5cX6*M^eMr#_oEW}vzUb$A3jGL(~dF4NM8sqtMVTN z?Rhz@8YKKtdvzhm+=`LmY}O#Kw5Z5!r{ij+-z(r=TFa> zI-c|84>FFgKFkPk93rf5KP$zwE^T)Na?9x}w;nQJ>9+3zBlC~&xW9G|`jyia<1Qoq z!ccopaP56^U6XtAuS|UNc!5 zmGD#Wr-gd}@|NEcbZzVo`0uPJKSVyfguS_zZKtkt3NYOmg8xJZ|Fb)%KGyyH-EqV7 z;~&9xB;iBOG$$;y?*^`2CBi>_qPM;${q^KO8Es3jLD}kq{(8myp`(GDAY+V9K+cBy z>z54H|LHRc$ZMUjGSuGouDvf#&Fiz~?qLn8VP{5$Ncfz2PQq&YZuqCLA5(Ah*!b)T z6Eck!?0OA6i@o8g!z)-Nw6G==Jg`fTv_Zo&yA9xys%~AtdYx3w!ZXM6xU^L# z){1OzhbHvzQj<=%#dem!IP1&DlfCv{@l50KSA4uTFF$_L*S5?p>q)!CwO91z66ka4 zgzW4o9(~Gs#oHycq-1p>=)ZlozM+p=c;Pjjz`V`xzdU|7;?s#w1|QZd67aPmcN)5} z*cNb-o&x2xh!VB#+;oPOd#$5(iGbciZ?oU%@`;cyvGO1c|LpK0DrhP`rE! zZ}yxtd0NicnT#ucw;iY1dOF@^p2CAV;g866{7C;Fy4uDwrt3st_uFx*YsdT7x459p z;Owh6=EuMLo-Ok&;c3={BpA4Mme7vrQ>U;k+4O}O7muQxO=65A=(;296B^WspG3Cz z*V{QKG{we?zMptzsJ-CJ=m8&J`G#sWyh2&_p^UrMq*cGPC9Siw9ZsKjx~5al(9N<( zpXU*xy^rEBdO;~Q0Z;Eq%CWHBTG_UTzSW87k-l7lPJd)9oNsyE=n084LhbG9+WT44 zi<+g@{HogN`SJVTv}Imgp0X~p?}wEOGpA0=o|uU`;18#&pcnj>ab!KTr1|w>FjQ*i zSN}xC^6;8$o2~9$Z(elL5XQ8dBJnEsoIjIi<7GTgWF5ulo9+&;yYKvX)zY{f)!XH_ zso?nkLB_hof<%d;q~YHo^0D;cm=Z{1*M- z6J*}br4~M;k6|0|@!G@T^^cqSU9$aylql{6nbOBX^iEe`wEbn}d)Vc@~;HDa?tM3Jbatgi;^eW{0pBjPo21)`l0VIe7Aq4)Sbgz zJmYgx+Yo%c9DK)CsP)IC^$xYzz_LDRkx=q`L6=D*%PD~Hs*wGBu@TRQQU$oBml3tt_u@uFM3LVNx8o$lJ#Xx;9Y zmfgGk;12ZK8*Ex!2CMDp=n_0Rl6<@Qsp~hiPh_J`%8jgV@I~0p7T9>vvEKnUzdpu( zL(fh7uCH3-)NTpr`JyIm&3M{|B6v9hChnM4js5XFmb_BH`N?fN`UJKOA1dH?3HEMrnID z;G-00e`x)fsZS@5r*3SFVY*%ouWZ_2p zWpw=!Hg(q`miX%`IDR9?w3$``206o!WPeN6R~?-R zza}>iwQHbjSMQ&{uW|BwSCtvhzIEtO!WwAr;y>;CVdP_Y+1Hm7spW0Hdn%ZxPFbXM z3N+y3AGkh6M(wcrhsZXad{PLmK@P6|&3aY1vd!!noF}^UOk3uzmq}~oo~4W8={w@+ zPQeWNJMTyft&uabVhxC;VD-b8>jM1Duz0Cxc~+-<1AZ7&!}!_W8T`oL1}YNQ)8?~6 z_!;c*bLQC8S1NQqclrqIWqWMeZ1j@kQRdy!R}p)Zp~u55>)Cmq@jrWnrA}Lo->zh* zFU)(@!opaskqN5&zF?hWBec5VCmS#NL-GZob`5du8hQ6?r=9s()|L2`nP_!W^`rFr zrJ;5e_N!~1qKDg6WLfPW%efP5y)8X@#r};<3EGuMJ6YpMq92oKLUMgR*cg)s@UeMp z0Y~Xu#=Tw0*)vWx6^IV6lkW-Pb(q6z_HmEDcG9-h&y->Qgj|sD7VVf`#l9Q-6q)ZE zdU3c64H{(e9sHm>YUHv`WsN13HJlT%LwBmKbZ1AawuEB8 zbu#AwQqUt(WB5P^Cw3+;P3jDOyWdf4o`^pMKbJGMuUu&UwsI1^(;rWVJN%rtE}_=^ z)fuN(!Y?-K9};#lXNda2z8m~(D?D!x<0oQR4e)cl%|FfR7lIp|yf1>^btB~Rz4c5w z(Q$S1M5$mUoUw& z`=QW_CG5D1vdY=_;>T&x1u{oXA3HWXH*@TC7Nb0~wv~q;mSiueDoaiM1`p_#mf5Xe zcdq*l`uz!8-v@TQl0Mfd%(=pH{x;;{;)hK-k(D|nCe)s@U3)Hi_52$W9{MJ(1M{=# zw#=p7mAb#ZYmeC7i>xD>_P9H4t%cX)*VOB5zIM0SdXxK5FM=x!*9*wvS6bP4bW@$u zCIr_x4zA0Z4tV{p4{JWox#7E-*fPf>@1KaZ@5SrU2CnQ$a`mn=Jo|9nZR?A=#y%Mn zb;{L|a4lv`oDgl}Mb4xk^ZfqLba2f*<&JhuW_Nk@dhqqWh2=l&A4vgc66`oon2#-7 z_6F;m3E1HrbT0ir>Hkf(z7K$rAhfJg#zeN~wn0ig%p6+cMNdr`7HSXnd_&LkW>kIh z-O9@=eocEmGig=+v!taTB$)OTSr-enXZj@W-wIk}>Hi1|muiR$sOsT7EeYO6wPk2eE@*3u+8=-;4PuqAS*KP^H1x=WK zzGX~>9w!fY@fgmlkFj%YHD!uYo!>F}Y(Ezne;izNZ|?LdT+=d{ourc|2=RJ+mBLsf zVZjULAvCCyTSvmT?a` zMfS&7_@?H{;y$7^XVTQ{T)Q*FgAbj+gk<=aAh78a<{x4Fy$UZ4wECarqvt~KjrHJr zVa{#u2M~Z_%%FwsYUGr9;CX zsnCy4UlSZ&R=@k*g00^_`4{K1rY*6se9{g(CS#xkL;r>JR}U}7k;Le*^(~NZse4U! zUAMD+B93$_<3N}{H$ubT+-c*5KT^{|@J)2^J+t-rS`Td+KKMoG|16VMt!~HFVmnMjVM@RiNqc?@_&EM%s#u%RrAg3|N3QKJoj0i&z>{0GpEg&+1(TET=z@| z{uo_RvG#R~1G4%rD_fIl-xHqx^5DOat!UIq+3oxAO6)+jooD%qQS@1+eKSJ)o>=Si zfv^8~^{f+#Q-V!9@^0=usPg=+eck*+R{Of$K@`h>S+H;Cdz+-TMWZgtZr^d=I``Bn z-#*2&qpsvgw_Zw%f+U#`Z<=fi1 zZr_RIN&5KXpUc0|EfKuiX9i!?)wUtiHZ2d*4PJu|=v~-PXNAyRy_Z?yvG|e0{lR`fu74je0PvUD1G% z9=;>I0?pnm1J)7;AeqbE`L%U)%joVf6oTod# z-18bm4!s2V$c*D$+F8qI93On=s5yL2=W`jKTRrXn@~`acO-~Ug%nR+K8%8k?$jCP_ zgxQDB-)#Ew{?+$gG79_PVzICR5Z)VSX(&N?5JY?jFT#c3a_&SPoFQSi< z{-J#r_H@y&zYDnh(?3(~!$({DzCHTMBi`Nm{#$s@`sB;}xdXn%eg$7{?dukwrQ6rd zJY?F}XsozTc%mIdwaf!b24=M{TAMz&zro|Oza_s)wePUdz8_wEVDED-d}I4R(SN7d zxo(f;&b=3WxXD$wd3I=D+C11k;>Oq6%Z3f2L^}{C@P9k*$9LZXXBJ1}x}b-14^(_uQ}6 z&fr4>J-Hl}N56JO_qhCoeshoSgxxM#%wEjDyP}=lZ;ZZ@K3GUSB~!VN6aMQkmn^Aq z1-AtL;86*CR)lW{pLOsN&y>1?v)lmVZ#eQ8)7!Z%u3(ddzxa6^+ii7?arpW+qa#^%g>{q=)b1jUG7x3PE!AlDSDkd+2wBGdL;NR0jK{;TIipVE;ldTe|vbm zj(E4MH#y-!E@zGFmC)nYGVR-iXK!5Maz0A)pR7@J?t)JL&EFhS{%dLc)&D)wpUvyx zft*z#|AkFK{sUe@+}uq5ykwtkAcBJoLj-#?ZF8`r)`#CaB#XY-7a&s_e(ARk6Axqv_NA=z+~FL3#FK|W-=?;-xU?`fXHccog5FL~GH z&5!jLpH_lx6t4EaQR&>JpSrxwlKR~f&hwXkR|W|GMk< zwd*%o<74f+I?%5N{*m=pzZ=r@*L%EvtZ(1_x4M2~gMFx`&lg|k#}_mzH-_;s{J}tveu`JwD=zPR(c@?O5Gx%wO|{|kq$kg(?DygP$o{SB^>)~(<>MdT z&f&RW)39$UzayR~dDS2PykAb+?>J%!=dZxtzyHfCjj?@~?NpinqQ$L#y_Pe;7{=FUa^KEc+vG3>IaP)Sw@8GkKb4LsS|6`(`HvSjVXI}oJlGD+} zCtTi-Y5D)y%8y&&3!sA z2Yk8D&$SHp*Pr{9|E_1xVA+K1elR}Y_@9l?=CyQT*dV8 ztl4&~Kbvgn`k0?F`Vk&CJ5)>?O5Ko`f}JpYWCo8)IWFyRL&m!G6MAw9rswouIdzpb zy1^H@z6oCGam5K`$AGuG!AFER!T6(-F?}iLmhS2{{xB_vjR}3J&b{7k{O2@%YoNzY z(DtZwyxVxMbo-dAi~lK|)K6T#(^+n#CtRPw8b7OltjD+g3;0az|D3_ z2+lpmA6tChZ9mAAkoDVl`lP9|CQP+^0@wVP_7j=6GXGio(ws0VdnRQ!KEw`xy z@61@N*JyvyH{pSuvuEo1-RO4KtXYpJV~k7b>x%v1xvuLu)~&1lb)$dp@zOKEZvdYG zj{PVL_Cw<%`qFvGHa@TX4Di(WfLYP_lw*%yUqJtUoQ#jr@|)tYsxk224*YjXoMZSx zi*ur?7V5bVJHA;a&T*~qWxd|YrO0o2F^9BoAKyNIeSM%?!r0%=x7yeJ`h;JDZ8)9p zd7eJ&`h?#Aj_z=c+1D59=K6GPQ7Lj-)RwwF(cW(I7ghC#zSOzGrxN+oUW3x5{`yK6 z`B<*tj?DGhUIbn9sRcZj=@8ES#JPfIS4bXZHCq zk1LKZuXXN{gI(?eA&xS9S-{cH3TzNIK9})N=%4Yp<`ETJffu{nI_KvRigPL|ke?TP z9IIpM$f*x;jQE%R$>N}>R)bgl%2O^0RH3kjQ=wGQ+6)??^bm6 z3FpR*b1uKr(Hov#{a1Ez@IQYi7lCEZJuLA**1xMl9KbmI?Gf<7-NuJ8qkp5)hj`~Y zJBe=TeDc-Nn>g?qE!=iGpG+#tgn9|1cV{x{ioRJV}v8RK%)7WjMn>20)ZXH(KY`2vEJBlAQkLWk-+kO|HfBuD9pF7yjbz|DlsXzMTpU~95Q8}ls&nJ`Q{KG50%S4k9CEmAs#Y&LyRO`@lbgl_&A5j-e|DK z%kY^Vm%S~!htKh@pnr(B3_mpB=xaHCsoc5z1tA_XoESp<6%UrrhJUTgKQzR1hGRp8 z8-IAsX>@si4)z>*G8?9Mwjajulp&J}#?&=xpUK;M8F`AzbiCN*4@v2BS&`XGvz50) zU$A92c|FVfBW$JRQ1b80vX@aAa(pIv#_|z7qwON+^2R6nV(q^Gd6d2UifjAQx!m^> zeU(4aT-xRnjBhDpma{5jFHGMx&yc^RZ8o>dnU`uGv=sA4=hFcyj}CJMFZy`W=0o@# zE1C;kyAy}q;u-T<%-9*RG9K=iVQmCQexBNC!-GT7QL z92=S853h>TUD2#Czq9tC=Z0%s$8$W#6~61o)%zzuHWtG(Px*O4%#P&4@6r!@#j^xtpfwxpu{k%r7mD ze;)rSW3O@0^-C|&{k8bd_PFwh<(yl&rz_kg*v0x2_>Fn7<{wq~ii$DLP)-^Vj*(g$JE0%uVFqXz4fk`^xKCM`&=a;EI&~V4s+`TKmiAQU|)0J2Pqj zSah}u8m>s?VdOS1|wE{0%y< z5^Zpo|0Z`6Rghy!`&;W*Y?x94SLXRRu#&dr z--KLjn)qvL-`jp(U;Z(2CB1kti31IP4xU_}{Fd5^pXxUu_$_cN%1hN=2DZ}K#p_4( zCNlbu>3^=HmV0K%P1(iAxb(hqALxQzvE%PuUTNq*vkPB%T=V)${MPCNT<$Aj-fs9e z34OWFo#t{cP1_~eD)Fa(uo;>wu`Hcbp2j*etlnlm-y4iqx5eD*Hik8 zEzx;;;n;JJtXucDV$?`yQV6Jo8Q_eW!DzL zqrpOp433@4*gcLT<`Ox($MS*Q<9zS;Zsd4v?A$&sry-2L_#+PqeFJT|)8!0{>5+}n zMc(g}<6mT>i_kw^sIE`)C0``@FI`CNaV$7NTNb{ZkB6(agE#U~_)sby7CmvY*2k-M zgnkw{PA{gHeY05aAmoR!LA<^3sKpW(>7aOBTj z#9WftHE)5ZH@_EjJi_Nil_RJ*&TFjjd2i`>1^!yO?aGnh-SWbQ?+-o?T)wrN-!z$ydZv;%vDaAx|)@-|2Mydme= z8e&mZH=HrC^+$9=YlDSXcEjPRyie6o#-{@u`Jt7W@g>gA*spS8@XB3X!Bwuem*1P= z`KZq3o#bo#Z~o?867ps?pXuZM_7w7-6_+?y^l0L@&AyyR`^ekk-z|4r)R^RL4aavV zuBkYW&v&%%l!V^w!)g33`+|Pj-0o_ZpA+n#=|AHd+aKn7YA-Ip?=O*lGXG5UTj$>F z@+ZXWZqo0oJ+8QoHMgkZHkaQR;x^Oo>r?cci#^D@C$3-g^pWg?=vi}f_YRc&`Tadc ze_NoR#W!uKD6uU9*1z)4J-g`t;J<5Df$U&Vm0rZo1j?-DZ$|D@PGko|YXq zNiMV(B=#E>gOH1>UD3&Dzwy4ucfxN}32>7cs@t{%3Z|t6*@Q9QsPE$a*wW<++X6Nrf-}pYz}h2+FxJ%S9X~5RU-NE_P==K z%lq8cxBB=#Qv6&=9MQ?#Qhu0YH|J6}DyqCu%$Kz%* z-@DEY=^5l$^)D{>`Mw9YMVDz~-yVsdkPWQldK9NtUdZQa=kn(#ajNWK#bMB42Nj1^ zzJ_l(*A?Cw;xOTr*dF1QKX?QD0#{fO@~MV1XNv8p@w(I%TpF&=@Zx}TeRb$%)fKLw zU(nO$Iq-*P9roS&=OvDBaD`jO`9R`7VpZ#7`GT5VIPB&p6wBg2BGyKusuJ*Se!_71 zry1Z|dHVGFq2bbJ#;0Zv@RXlW|0$=UIMwpWw2ypA-{(RcZT(y8akZZqJ*v6a^&Jx8 zXv2|Fi{oV{PUo|~D>^S+KYr4Dr};_ZJZwl*InL#8o#0Vr2Ye6m>rXYR{~MQ|7vePY z(_=kuaVY2FxAWqCl!lK>;W{4R@?H-7Esmf~ahy!g|` z=M3M|Elp7_>ps0()W~!ce%bZ!#*>!7t=hh z>tk<)d`;iUq5XzW5A@G@`il;6eJkTQ68@D3d0cU9MStuG`%u~HWAjh;Cq|_cjn3BT zE3utx@n3tN;PLv#jy7+!;l|6)DO+(U_vIYs>!?SLD_NIPF+2KR_x;g+{^@rPg!BH( z{R8Bntu()DUz&SHRa3Iry6n^r`anwfO(?x1B5aG<$x= zyv^)FEq<<&xm>~FiCr-I3w_?8whbKrS@7#j-oVFiin-__EN_7wE}!qrxyHD3mU*G&WokF0FWR9`t#g=8-|X#p z-9FII1)rY8FW@RRKb|+)j`gR1b&yNNcZ$iZ|Nc&U0P|l@`cHV}y?%aMRY+S{OUpkx zJHD%YFyxH}gKq{NC3e~9iQg1|RbZD(S2&kr!1~YZ9_QA~a0QD)d}@BHcjDJ7d+~hI^WEUNL2tLkR#zim+V?|=s_>nK zE0Vmd@X8Nt--Y1~k2_cJTC(rL@Q=OUyLTSE_6I*R>0jzMI{Dob-mzo-+2q==FTmRO zMdFtmuAsgiZj)v||8uSAoW@B0~D^0k&oI35xT`w?vBDB>(M< z5wXvfql5fQKB_+P?QeLJ=Nf&0e7%^o-|!mKUk!Q~Ga_Q_zsF zlg+-J0RI-xzw%}mX^!7_e8S)CdprGuo|S(FJu;x6B8z@Z82?e!zoS#~u3r|uouA*= z5>sjqd{M8^e~hK}vn(mn+3-G|woFXJG0AyY+2vOI(%c}bTAA`|seJ%jGDn%ebEqf&eHG6@Mz3$05PrA) za^Z!e+Ao)!=gv76-Up=4`_7(0gBPX$wg2wRVZ(On+;;r%;^N}1ho{c_Ce1JVJl*@Q z;`cA4&O;w%kE)n!j@ZJv-S_1fd!0Wb@u!9#hb`J0d?xz4v2%I%W&Ek9|AWy-RmXu3 z1n*4fC2tMaB5&C2`op+~2fNvq#Yt-q^_x6D>E&7TgsR7}-Amk7t;swgsyZj+6K5e0 z=ycr|jz^37eXtg%D>lcDi5}Xh_86D{ZJ-xkb&9)%(g(w@O88fa*NrZ3yEK34EcB|Mx}&N)T<&q+ zUVD1-Y{He#tz%A7&;2kPhd9~zE7uXz>)iWY&W9l%VfY;$Z|nvAFzDHb^LX%QhTol{ z=iJ(vF6Y`by=)BSj6MA~e{)D_*gBNPr()gA__#Y~!|NQkRouTeevFyyk>XsPTYr<= zYTuN7gD3a^yVjpKU632C3?p)!;Nt|VN_CxQd8o0iNeZadCxmTQ0*BI<5GF44`3xAi` zQQ?{s%Z}DDPpd`mG`UoRBzJ~?>HF<(FM_{LzaE*`QNzDAJ1UY0Tj~mOvg@z#3hOCx7?EkBOe}+?~oCsrqW@-$AcaagO0V0=@WS_wx4YMh{QLq1D7_wSOm${W$3# zqwnqer>+v5I4Sq+?DkdDXSRO18XOyyTbR{9c3q0|P7C&yANsA8%3oBS>FrVjF_Ffq z=*MikR6W4sd`F$a#sMT$}Pi)mxE`; zMSI2F+1Nmp|1`hKyzJM`^Y?9NPOY-(jrJuU6IG-4X}Ke|ju{E zz3cG%rxAOEQn<<$n7uRl8e|Gw_NZnnc#Ls{I|X}XctgO^=Njgn)w{TY*xnl6;&Iu- z8uDP+#DZnP9vV*E6!Wi!SM_$TVAnMNF)5s5<^cI~gFQ0(?E-)7STJso{I1=sCBh!R4(=*(>=#?dO^JH2#eF zPwrbu|H@ufPxf-lJRqva9_6OyPlitodi@#a!iSp^3pEbXTf_JFII(}E7%k`BEL^8X zqtWdXC+g5j(ZeDBAC7;kJ`x<;Sp9|_yCYt3{b#!k%^w*~3=wem261lnVXprYw_%Iw zH~fTvlTWNZ0Xe_Z4d|VwKRJWD;~(anW8Hw-H2vuwm;6+p&G8v-z+OS`jK6-Peac%9 zcDYGQ+<*&%zcZY15ia@xAHw5gw_!t?{?CCPZQT1&ju*HMR|R_d&oOVZeR{Bts_E?*8JHEVZ`7;{j;={L^rQOE zb~pY@_PC9yEc5oLdn%<@W+mD?3Q7l!uq=KsQP2y zC2hB6x+ed0x3R@rrXSz_!?{SJ5i68%2R9?mv$mK2rg`u{ z)^q2iuO{q4b-Uw{CO)1w{(}MMzQ}=`-Xa4@p#ki@ZZsG@MG-1gm3O~lW)$&M{e-9H2qe749@s2BOe>A za(y%LctdrFx4C{hKHv478|(PTv}k^Ty=Y4QGxm@KLq48Bg{zra;&zH%D5l~DQ)4f{roevHR; z{dFU-gNM1IWug6+pW2%?{GNLDpsm^V+48rIo~f<9&$xmAbXz|M*LsWA&XwcJl5gcF zSQE8!F0oT6xhq|c^=~7zb=WtRbNBV%{LMMa6&No1%2s$x@bk?YbclU;q%i#Ytnr`f zaa-5WxsO^3!{o>EyKnOwa|>NRdzYe`BVGP0A%AQ6$r%A>d}MuxP1sDZg3dx-iE2=-NY&D9>)I&j05;K$k)3>$yL zulIQ4#lHRD9`E|G^*I^8OG5p+evaAC)^B`je;e0h{jdBVYo1!?BfaGBt2O!C9~}8K z`D*0&L0e+6`VGG~!CCW*YM!-aU>Vwd30d0g^WBYhj|@@575W&B@C(d%6NcTJE#!(R)y+D}_6 z9&~x}eQSol;c>}d4YJ05$K0=j{2BgspjZFHi#-lZ0sQ_C;sZD5E9@Zg1M3U!kIW${ zo7IPPWyKGT_+;VCd!lK#z~c+I;WMsqvh-7U&Bq>B|1_?`2EXJs+%4fB)qIxFbFRvU zwa!0(#^}HBIP&G@-fnooE0WKjc`ojh2|g~&+7~ewnYo7RqVIGMobJWrUJcuO#=7MH zysTMj_Z?_oy^7^iYrap#!PsAmgHQSDgd6_)`0&jxB9BXcLFaOxYE;|Tj`2t2Isc32 zLNKOQHeG06np5kUNm=u1>Alv%ly9l}lH)C%DV-=ZZibVC(Yis^AU-Y5^({{F;)dhz zl&`2n=E#jZZssh^qGv8C{^W9$8@ElXSvYm-J`mPKBKE$?DD}(2$wAq^w;#aqYcfh% zI5{5O@AnXPsq$=Ri&|MYlM&@(>L$_#Y)?T$5_ehq>!HUU*OBvKZPlDo7Jai{*Q_Hh zth@vqr<8@adHULBaQuUuPK=w~yV={lGl`2;&isQb`kU)NSp92ubz6_iZ`K}<-JIZx zp7Vag))k3eRJ3PQ^EX>p+{dpg+PaEj8?8BNO=X47Brez{wXS0L?%>R$-WATeN?Ewy zQ}tJ4YwNJ0T-3Ey8hR?h0|Crz8Tw))V=2GKx?##s5{+S^k040$(uHt(w0g?ClFy+qH0yTjN;WyIQ-ukyUj zey{AlAH&=4eWxFyS6SPMah^J~DXRF<^J2~(jru0buGw=66mz2!S`&_Hf5*8gxmUbx zIPylUt(-_!ybNYV*G)dwVt)ne`VqPJwB&BJ9)1`7&YG}oM$N*X^menZkv0s%ZdD|9 z)9S{L%5IVak63ec1&<|m)9@Gk`a$iJ&@-aiq?N^=I?Zl=3l2gslChgcPi|cES#sPF zYqqxdlSPkju{?JV@GBX27JssE6bN5VYc@L_>o?S~h8wKMB(hL7<5bjDHso4>5P`FW`HQsW>p5?R*P33syKATe9ZWyxO?iZdwL%`@9oj#h_anXM ziVqI^(}dTxCV7auUHSi5H)yi^we`Q@9VwjSh8#EWU5}exvbEu(*~9P*HgFFvr`tY< zI^uAxE0&{w6xFx!r|J5~C;aP2f_J!$HxKnU>iqdW9;uth^);iHH>Tnd;d^?$rHi6k z{^X|OA)}w@_hGS@R`A~_`|F2D7(a@e&omaOa3@! zE}ZjTkZ+?uD)7Hi?7>fz{QCPx4WFCAqdFa*?Q+gb<0q#0ixKy$i(|_|U-ZY%OeAYP`d~Y2&x5cmgxBeF7C3!~k=L@{u zW=Ik!ApVoh+_G}$-k$-!xlaUM&ow!f2ov;LV!j0G7s#;z~?;?}0k%AVTe6y`@W>>8q;^wX(N`Rg&e{*!$!-mZ7w=d$_6F2d%hM6K_$ zPIa{Bp}+k$2gBjNaP!YGT*4*Q@?ww?)s`Za}XXMe&H9xuTNS6y$ojUq_DPiGDj6 z9M!E05A0vs|C)ZF6N+1iSu`h9lFuRn>j$r2b{(hQZG7~n;GB3qq3i4cUARvAEUIT6 z7!~yPM|iJ*%f9W;2l;;>o=*txozUytde&)C(S*KFik@?^kqXHZTt1)r6+aL=xR+bB z4&?Lrx<2;lWZFmDqWWU%s)SztKOQF?f9!JiON|rfdtB{TT?e_`@#*$sv#ox$eHPE# z-^b-vc>izvFy-Is#^K+dchPRs>AloGOdIEClX0%UhjVvzL#~qlT8i$IL*xE070XxD z*QN9y`855%;_-pc&iHuYmif#l2KaOHZ({$!<97TX-rQ`VoHqFX4=XzemY!T1K z$(EZ(xYlE7Yq0B@GuLltw}AP66;3QCTyYUGQB=Q&D|j}npOm53x%E4`0=6tA z^xLIyj_W7e7Ucxr(c_Bii0PCg%Pkseomy5@TD z!FG$E$sKuPzvms^norgvYZ<>oT_$&b{LQS9-%UUF)H?1fX!o*GK9_St9AtjyC+`*T zerM*C$y4?_G`v^fzs%pY1UotU2VYkiZ7iRVEteK=ev#-CdjzBU%iM_LL*CrU6wYz|AKm6#gnbEyUzx%=uD{N0c10LB!^tbyKDb#%8`b~GZB~)4 z|GI!97u*vaHT=d6zcI*#(PPsy^qgCNryD*djJx4~O5q%1GluP&#_vqw9OLJP{w{re z*ckCweyjZ<#&>VG>5d`4W&9uTxaO&y$Ot*EO$$T*#&Bdy^pdNt&%t>Z%b$Z>8UE)$ zk6d*j*Q|YPa#WiBDUVlG**Llk?NnS3Xd!Q z(>4+N_=el!!mzJj^Cjs<{RkIzIO1<*08;DPU{)-TfqrUFo;JHvG!z72o2hA%%~F}(gC&>v3w$mb~D=l|~CfA{kp(bv;o^&cfTenGg+ zmxNp0@DM%o9bJb?X1-slV^m z@b3aW?bF&s<#R4?VM=~Ahtv3$lWSn^-xeZ@%MH#%I zr^jtRgDf|!=QeyKHGasu(F@mcQ>)u>OIK}nUE|OB9;bb(t6}4Acuv6gvic<>+4Kb& zJZj*${zW(71Gh!Ozn{mq{mQrh{c&ypkBUm#KQO7ExoXrf$_+R_%y+DP8+%;(QI9Uv z?&}6@osw_mgk$}vM;EZY{a2;*Lu-Y?Wq0eJGTYn#;xzr1srsplwf+9hDgC8AMvvcf z*CFfZOTTzs*4kH|qUT)p0rVR!dg2MzYyG|Cj&}3^2JCjmuAjw^nor!aas7;SzCK|7 zzsM6|>nWP|Mh#OITJNTI2_yPO|j~K5e?qR=>$)({38%?HuY=HDW!4Cn4htW$fn2X-CLkh>HG{7T+ zzuo_-Y7rXvgFKt~U*uJQJ8FsM%Jbk~(*4W-Aqluax;u)_0;yAT# zA-f75H5`Y&*7BUw2f!1%>hJfu!qaO{op_|_wO-jkT%h}s8_wr*sdIxKcFHo_Jm2v1 z$t~@sUwkRP(y@}3;7!P%=$j@&k6eN?Yfffe^Qzp)LU@us)ijm^mXH~x7R*1zx4$Di|gR~*?_r5MCte{bVN%QnXK9Cj3N5-!i{oj0kn|sNkhKG576gOF`vY3Cvt^R&0)!)ID z>n7_g{Em?SegS&qpPQ`Z{Sta~M)`5})<+#&`QYDm!=cgseCmlh@Oy)!ZuQe9t$S87 zZ@qf~i&n2E`Fpir_qbX9p18FNzqk?agUG7?Nx$yGUfHPX6Yzt5|75NYUpyj=|Ds`x z?}u)KEP7;qc$a?hrMNZ86IuPQfY*8KN@QiwQrAcS%kY04{_@xAze?~C$v%3ce+zsI zdgOy77O<#@FZ@uEn^lPR6(4Q{?WHFuwS$hJTuVo86WC@c*dc?;e-kev-Kr z`vuKz8~znIJWRhuzn9UQ-8XzE&qKKUMgwC_@qS|&`Iw))KhDS5vd5`MpBYj7$Na%$ ze8L{~i`I;yhJU5}!8|%j{@{)YyB_e&s7GF1m-kD0yAp9vs=H~r=M>Ky+r7I7~Mx!0*be~gH^#|hL3(1FEK!it; z92vfGkQ3qr?kRA&L%Y$#)7F9L+o})A7vG)aQ$qb_XHIMqS1Wl;9W6dF{#zoS!48dH zO&ja2i3yHRH=Op5ei?lvpGp%G9RDv|&qW-)99wsS%RSloeL2RzI^o|4FKnGIA)&8N z;T&^sY0iWY9~wQjQT$o6j7EO~|C?M+Ylx3zXItp4&8~CNz=i(eN^VT-i0ykvzT@%V zcNq1r7oJ}_mzV@P-E+@95OxoB{Rz}h8yY>U|LI@p19=?3R}lHqdR628DSbGHAEgiX z3|#)m!543^%V9i^5I;|``>RJS_sz5C5&qFzKLaGiFYiz|430eg{sS5a0We z(H~?*<$}Y zY2$17@d0NX8qejk%55?v#Gi&kBmRn`!rrt^rl#@J68_UFIfwb%a#x!0KP%v;I`_(5 z94~X5o{^@fPVrY9H|AEm)=mE%_BC7m7X*5>kK@K;+|Uh!{26|626smu0Di6;`bwDJ z2(S6T<7)qyJHU^3!!{1}YhQKamB`;x=W6=;<7s_d(YtQoVD+EywjLQ=jf)yDbA5~4 zz)b&kqE~9a`d7!J?{fohbzAHDT^nQ4h)y*A2^{@w8i3t6S+_jd{tJ&In&clJkM6HBAw@m&YbUSZ1cCD@2Hs`%;Ypjl_ z@(Ip;-q-i@>&Pkj53e)*zt)i*wxQ`G_~N%I(GH9k|F`4yu*-cH2mdP@@-q7R8;|X< zk^SHP^XZeEH$B7|;r`l_3wZY)eYg1rc1q^HTm7EL*f$b~sbu==kD)Jk(AZSnJo9>^=hS8;E+$ z_VPBh7xynOa=B~!`LxzgB{NnI1UvjT4wLm$<)6Jwee0ZZ854dBp2|OKt;b~c2j?DH z;M|XM!4rR(;eC8Hzf+bMk^Da;6L%VI6MT=KV{kNJF6(Pwxgq-BniZaR6YV;FntpL^ z=Oy^t1~*v88N9cTYY!(5xrVWpvSi^zam4-Z4%xLL@U=7RufF~~AJ;eWJ$+aF?K@ex zSjGD2E|tz-XO|#-)mm57ROG&`|J%b_PFvnI=3a)H4O~*$nYV79-9zK zW@%8IqFLKT#;)U~&ZE|niD_686HPGzgIGEFnm1oigm#6 z2WRAmlqK^9!x>ZM>!!~4mB?A?NaJVto_^ldbWp%?R$2H&n-}V*NPUH~8lHvk6XfS8 z@be8X&BBpg;yHKt$NH7JQqKvs`iXGlB#9RdpXb*(n}`>5&rweLJ|xLDJQZ&@ zeF4slIcIJXZ-@G$ru&#HaBZRF?Gy6(#(yES;L`7AUGojrM6(ZuFA6yRytx;3^tUD^ z_!5t6{js?>_#l_NcUXTkdUP=6-y~kQ*d-+NH>7YKFLgQnf_@u4b8FEzQg<_X3ho=) z;F~y~tLwi#MbEk1tCZYFBz&pA>N71HV8`4?Wc!PJ-sYe7o81dWe&;87o9Ylxsejm` z9yRft(v>Ou!+m)^9-@C5PqVyKZv387(~o5yuSV(*zudV4SU>$kSPwD$nLrPJcu9Wr zs3Yqi!=Lx<-@e{|^Or|F(|+Q0o`>L{UE_#Xh?kq*NyRJZvc)Tpop`|mPww#J`~^Hm zka&xt{e@9euv`CEyb|x3|8L@z?TCGeMXX#i-$nf2%H{_Whx|3sd*#xQcU!-2K8UuU z19=-IdLg{&GjDeutmb$D7kzUg*M@)L^_pi}+I&3sS3$3r`}P0!5EnF`Voit|v9XN@ zXU`|#qY^bghkjgQ$NH0hafnZ>odGxfz=t#w-wX`vw1)Ta^zskQU(nViE^kSkuhw-+ zZsCu9sOVn1ymNwn7(F^8-1v)Eo^^$dzu|pSxQ>fm?lwU_49B(_|6ZOyI>K`^{CbDs zMHxJ5<`{k9xfv-Ooyyb?FLX3#neivD@<|f6GG7a+6ssp=-?c-{7CNyf?{fS$yzx@c);2dj7Web%QegzjdHXoO=e;4qh@)b`GIH|6Bk3FCG=Hkuv8z)NaIC9>6k{$c~AwOBC zPvky+2H^i?|KdDGXBek>NBFv0Zs9sO{MB-wC$oN|FIooK$7x(7pOosoU7wzYUr77T zwvWxDo4swSnZvjmehC;nILDRWME>26P0bmuw;z|w!8{L7f3xwgc|N9J3@#p`$A^sd zwxebh?_DtdSA&U%@E5>)7=3MBj9(8X9>U)NH`vvl&;Br@zZpzCgyVz9{NU+7jp=U# z6Ay6Hi@OYG8(_FT@+QsV0bcPd=)d%MEAs;5e=nGL#Prw~3R^n^{exiQA^PFaf8z0l zG5w=p;^FCCXXNn}fxhJ;F!2z59rUX_{-rC*=w0KTK`%7t^rija6yE%V$2GpK8^Np6 zwYLSmGrL^uiO%c{)P!!&2D_noN6YzqCV9W0pH0)ROyL|iuW^MBrtuFF z{^HgAnJc^`&Hv*R&N05TaGx~(SqkSEKU%n38vi2TJMd1f73e?D5iU;G|Bc7Z?lhwF zd$_`NQu8`J6D96nt}SZr;R^m?^!U9G!hXrg?E9ZNWBP=>r_Y$Y|AbjQAj#}f+fwEs zUMJjG;;c||w(@bM%_~~gH^1nn<8w8~C|Q>67n$$4;k)oW3F3E^vXUgek=<Ps#6T>He6->uF46jQwp z*mDd{ATCq+`S)8Vb~U~C*3Mt<*`5|PTFt!q`jw4@k2ICzteQ`KHERT+z|iQ`b2!b{T>ya;G&)0qL0>#e`oxE=J|4t zacmjGKKBm)+__|bt*6WU)p^_UY0EwjdUx61#UuNbNKyI`CiR!QOn5sj2Hf(Sa86h}(ah zwcqTO;jDFWO$mOg$7SyfSDVBm)K5%f{ADi8JZ^a^$NVB{LVg=slKCq07%SS}(5pB4S_Xbf zlBbgXX|B`q7w&=l(4U*iGwKJAzYs9~zsuUL=Z@|-iYH7zjsBHz50FknKWB#bM7J(B zdL!OL0a_bE1}aocm}A?}{A(kmNyi zn#bSMp)Xsm&TgORTkCjsCH#J?`a=6mzNR?0cuP-*{V+M@e`Y^ae>@kzY$5Gx@#pck zFH5(!?m~XY_SNv4y@#yjJD2zyVqfz&Z{2&+pK~_9Xa9-F-&MxL@&YIS+w(Jj^B>~) zc)ih|oycG32mY5IpY%MDy{PrxME>IbYejz*r?V~|m$6;0I1>-H5~m86ebl+F8@RFY zerEN5>pFq{;F#Q@hW>sD!+)Ei=iJuejS!#Ni#e@;P|Ley7I&Q z6o&T=cvTF$&Xpu^;XY%|oAdoopd7{WAKE0{tc#`i`U1{%I4B+x62{a{V3g zeFR27JkW2D(08Tjw@A@*Zqo?Y5%-_z#@#+ojGjiyb(bHW=wJJX%*)Y>r#JWguj9*R zJMwVWf3EcrlW(i|3}~&ezw0#JH;?@z|KZmL5H}TW;`(k+vKbO+U z9qYM`%s;mx69>p{di(Fr8*aQBR_Ru}Vy)`lAiEbtuD+28V~y6T3DQdtB>Sh93tGj|{!nVOvKs{14#p z5MIe}v*x5?>rjS21P+gwo);h(o?6Fp_pX(ZUw6-soWG76dvMTSV%n$;yQ@5X``R2M zg9SA{-Z%c|V>7o8?dLki;9n>jKegY+RxzSo--+N`C-|DVR=$rAt3y#n6L*MWV6B8jU; z6J=Tb#D(yRDsJzF_X#-i1+S>$jczzGo6!?D!7Hk)?uHiyya*f~m8W*Y2Lzlv{%Ck` zuVi-niUVE@4v*@!y5U0tJ_H;d4ZXVI*kWtnFmQOVe?OZ)v83T6z~RyGeK#CiYWPTS zcr+Ju!%G8R3J#CvDcx`kve8$9!=vTAZg_3LYr)0i<8F9kz+1uK(ZBKu;ap-r0?QY{18YQ^)oncEiU7d>lADwqM;1A0O~t!Qrvv5#8`z zefzdy>?OlHjqBFFJp=uo;MB3}N!{ot27Dqob?k;y%DVo20=^G8Ja#+08$K=I)4<`e z8$neT{q%rO2ZzV*>vzKs@;L7eh(^O>_YvLj+3erg)VcQ}adpw28#~KPty$qr|3}Yp z?zm#!FO3{hqP@!9MmmV`ZA-{!%qEX^qJDMJ@3!&#Z(K3;&2{d92SOffC}Zz=l=X1G zwYXsPiJWtk$F;um*;~eg$5(G)ag%av@bGyy#=a9-r|_!B4UE2p9GiG34_CGt-19I0 zZCL-)e!9`~_$>8tQ}xOCh7G@z956UTVLjQp38kQ zjW6`L_C;5ddztpK?(g-_8#4Mufu5LpP#*YlS8%%P)1v+}Ty0eQPUZUsa2}FrH$0gwYEh z{d|UhG675qF7HMc_B)Gyd7x)rYP?q1t0@xtH&eKdKeR`A zCphiY_0c~nQP({#=ljq<);{_--p@Q*=dN}+4+r@+{6mkkU)sHJAnj{&Ie!e}Z}=xE zdd_7}cFtL8`qfsiJLy~h&EK5);XRq#A@lpjeO!>i^B5u;!#ipl=Unb@QvAV>D28sn@pnJ44%UwTOpN(=Km(oO*v}4p z@$E$}_mi-{f;mXk#z(l;X=$sge$?f@>3W;|k$Z~T$#rU8*w)A~Q-PcVlKMk#Dr#>a z?{>XfZ6&WN>_5<2^9gm()tLQ>+CGL4_p`?LOOspG|J`-u7_{HI?K3`eUGDH;pADzY z!gW7!dpr5JS6$9F;eKNBD()|HGkFyqN3B&Z_vs)%n%B0kPyaSK_vicIy^zf_yre*_ zRR7w%cbXqx&WqX>F@CF(@ilz9zy8)UscQ-NA<6ZFTe)j(uAiJtC`H`IZ{ut9vw7wk zxW>Poym;G*uIS(}K8DW;IO9WKL~Zk3;djA48-A3>t$*l?o6B9{^0Ovb@+L8=t6+aacp%Ab*2od~AH_bLn3jeZ6!t z_#d*y$3687ICii77WN>M6jS3h4jNz6{~LmR;#>DC3>h8Ur+`DJ__^&CKG(Qt)2+MV zw+H-oaCCfAjDL#1=6s^Jxu1A!`f0$IG8e!mKTOVCMfY2^J)FurFz>g#!#~elHh;!V zMfrasZ+E{xclV9qx!NE9{Bs&Y-XY%n#;KWn-GxRM<@k6*x#FmGT#{EXx&PAhmR@xp z;g9*7dslcamg(KoUhfolwPCjy+uSi}xqK}p7aYIHdq4Bja_XH& z)$T{Mcc1ZYSvk!@wM6X;dsNJBbfR~m6m^Dtujt!Yvp2g!-s9eH`9JIb{|IrV;VUzE z#D=V>jrDs(CsRM?$973JQP)`TW4Jz}$5x5I^sZw(_@1ud&7gONW2-{_s#|uh-~i9x z)=TI^D_0!k-0$abm|D-2Tv{K0!`=Y;>G!SR$$Ez{E8Gw2j=I*lY40&O!xO(?w5*3& zzHWcUmp;n5KV_G&tK{)?Kd9Xc%CqBSH1ow&{VV!*WK(iqzL4XsoZEnh>Sb{3ig==T z?v|ao_UY(d>ivOs{m6u_AH9~(h}stD`Od*_XnfK2cznzU%y79csDG9^_vJO@@aNkl z+P=s3At}AMJm|&Or+>NY>yOtS&2u>Sp?_5lrp;T?XDXJ@ezp60UeJpvY>PO2!jw7t z#d`v`oE+=Nm=No1iZ7!`H==g(t-lKUpECWkuJ50AzE$rAsk{i+@Ai(b|2*iC!KaqF zoZUm*ss3p%Nv>b#Vw-b#)pJJv@C8=3dES5XH>V@SjqX?6HUG zhT53bzL-|>Nql56O70UG{<0qyt89jSTiAzp5z@xo-pP6lxa8W$H5z|(g-zj%a>o8d z?aZBH{pMKXEf&f6&G5M99Y>=tj5j8C9g}aZBmQZgxG}e5e@gq@lzcCa<$KG`H~;NT zJN@ez_B}sq=em2*vr&8dW3&5j|AKs{Hm79dnsHWX{x{b4VF#b_H>ssw&z|(T5_mOTN}T>-Mx4Y*L0oT+HTjU``+8{^El4~ zQqeQ7Hyjb32W0p|9_M~a!+9odW4xVX{~oHFHrgJ$nHjTe!z<(QZ8OIw7lRv|eosK+@>v>i^hMz^J;jAp7C`{zO;QadbESrZ*+?}t(9$M8+^%mI^@qxwuo`$XFBgfKG4(rQ-AiVsNpT&_yQhwrX#ao^1-{9y|p}pY;Im_#=b=IqaEJR*j!Y|gkfxV!wfT7|^>dv2yOjN+|0tG!7!%}-{}*f$o@ZeE(Xo!=Fh9lClB1BT zkNaQt)Z@w@2;bA?SA{s)=*M~7;^Y%)!)FQwe16sN@qr%w6|c5R3k4GXy9QkR;nmh* zU69~=dff68^TBz~NNI>O#UFl|_H!(GA;0R!&&GFHYJ8D}j@1^*nSIc_RPi@O_wq*_ zhotPoRs6`haE<$_`OCh09`WoO*az&B&ei&O`xkcX?Zfh4@Y7*a+2M(Guz4E!)+o-s zb{*>Z#D9PLMv{M(eA8a@e?#e?&L{Xk^Yahm{ue&iw`Y3ujE^KTW>j z)p3TC3-kRe{FD^VamNBvp#(o8sb6(FZyV!Z}8Uau)_%_NxoMko_aS8+EbP z(pl;9=URT3c;?e7a}L^X<|H%V`yO)OWF3Tou>9qR-fsWQHfz)0G32B=&`IeZ@0N{- zAsqL4{aP&6tRSB${6qAA3%*x*#<>S4`BllM`b_poKZ8-Ufy( zQ0K?|wSLgC%&#Bl9eJJJhHtgV`S(Z~{*1@gYANf)-`5fbIrT$;|iW`u~=O;nFWWT2IA-_h5V)o-YvFpr%% zg=di*e8_&8w@T3N<+cyqv6gD3ltmdzG!`GV^N-o_zWfjJ9(5uylCQ4QIsVS&&QJNb z&R$0EPC~Xq$-OwNAIf)kFvc1``afzs%g)I3zvPGKmn7>~9J7YSqrH;njUZEAzL38$ z=fH27+j@Rl{)$ub$8pCqZdB|)#9uU8ACr8JQLH?`joLLlPet(&_YPS8KaO8$q1|Vo z@fF@VB&-jtjxWz;);|p&7U+}fxAjxen|@+*Eq=Jk=w;7xJA!=+@)va#A!GA0{PSK6 z_g`B7pWypn_NRmPboJ5tDbH_T3f~&%b3cx?i_MGYhsbkm-gFd z_^?UChx^l$zr|pC@Y(T~@v)1*clmid9yjh8^ZQk?`(t}^{Is+C%VNBf`J(O%(SFcS z?EbV2&OBBntPASU-#@YC8!Kxaa-O=^iE)`dI9_Dey&9ZSkt5T1o zGrJ?XFXNTE*Qenp?Qs)bsw#F5K+%B*Hr$0_P#W zI$82z_-$ccax*wSTuwa;ho`QOYtx<{moqcDzD(PHaBd8`7fN1p$j=-92cZME@spjt z&zflRV>q#d;gTP}mt`2K&{@wRd9s zGk*D6evn`O%{9@>llOUaD9^{9e3&)E)>pSa-#6($uDf7Y4>=$_AA7mKFASZsGJH$V zi`-k(MUF9@f5Tryou&L<%pb*B7Gq}c9 zcsVk_v*g@$i(Kw2Zr#Bqhr)Y!+~P~|>g^PQCiH4UXb)|Px_CJNTNo1@+bdjlfLOv^ zyujtm3;QF~KKxliFFXBc@_rG+^L)RYw4wjzFYjr!{STI(;v6fxJ;azT{J*C05h!?|M`>BGmI zyK=lP<`+xU`5HQjMcJ#~xoIPvI|v(ibU)|LtK;4Qj<1>ai?jxq9?Yjt7utVq9k6Tr zlpb7%;7AYFzx&|hKY6_0vfEf^$?@m5HPUusNfpzBpS+(W#HX_knRSr8bt)5=Mj;Oz zjVUy8#SYPS-zR!t{snu}h258bG5?0HazC8)yWx|;h#@jKzFfG*P5789F!2cVV~Cr; zlW~{4EapT1ncNficJY2#Qe!69=3l1^jU+I|;tO#}yy!bRDvHqEb74UTyT) z?wCKmGwM3hDYcW(&r0!!7e2h8Pb@d`@AChleY7p=I@w%kLVsk6UgsWbE;PZ9^|-jHl1ffqyA-I&a`5?AJXL7#z$il zy zz1;on7vfrWrXR51fs&9#NNN4a(Kl0`qp z{UUv4tcA6ydi42sSS_Ri>UO6YZN*PVKAbm&*nljn^2>$vOBuCObP>xAFwajj>J zUPWJFuRad>NaKG`Qa{h`)SQ7W4gP&khAW4m_S5f*F|lt23u3tve{5i;e(LIa$`u?N z?77i19vNI?^Q~+cm|Hwa&OL7}z+RHV4haJ&vU72;;=Cl0gX zX1#Mk{ipeG2iMFqpw7c&PQ!qwlm+u_ERFQOL?*8I-e(R^-JsCN>@#oHGRLyJjXPwM@T;gzwe^3&n+6u z@z_U{qxWCUNvyU(H-X>S1d(CQ6_nXJ#(p2fk zwP_qOgbegMKYLvDY&kuLj(cOHE@TL$%E*P{Rh}?|;hR=!W=L z9FmQjzpCS!;P4P`^SRw@K4*5taP);ap5d}fJX1{f$D3U;d?#>tWZJ)z)o*sq@ZG@Sk-_&e z-0Y&^dx66vuAe=unopWtHGC2{JYxEe0iIrV+3+dg@DOf#wcPsH^vdx4z~LcWdfC~> z?+y6%DoW0G>nHdX9yk49?S*Ft>(SI1zcc2lz#r0EZ#Vj~{w^<}zcxkxFzvn69$Avm z-x%l*XI-2&Qp(Ow*MFswGeOrJv3dY~6bj3oD0OwC3e**}w2dYkRu8 z!#ttSb1v$+PIkN|z2YYHjNRthU@G?92=%+!ZNAO!VpBt@OFsu`3^A7Zg;TNnyK-%- zUEPWhFB$!Zf!^~L3trimJl~aPGiB(f*r8DDIbJc&y}(vK&xMIgefqgDdftMK4?ZiD%yT`MpZGbw zu3=mH2HDTZ-L3p6x!dC4#nI|fe;9NN@eqE6Vry+VfA`#eA^&Z17so(4GoB})ODa)o z$UEq`6IsmUX>@<+mm}x2g|ZVJtYUG{S7F}Edn!lxpa0+euKiWt_y;+`KD=jh(ulo7 zML)?8+5M_%9QuC`i^DKa|8;!7ZRPOp^zv(CiN(g=;4eh?Pi*Vw{3XM}`p?+$;A8FM z${NAHvvarF%N5yk;Krg)#$%kHkBr^Z<4=XSga1dy101^=ZTq>${}!GLFm@ui=V9}i zvC|A6*)yi!2V6Wv|9j{^@_0YDiQV7E`H}GueiS%!1Ioxhx{W4r)|H6vUvQsEkHMMMXtL2OUN;ipnTD%!o6LgH9Y7MMXso2#WCEd+(~J zD-U>h*Y~dVe`|fsdPsL)b?@3$U0qdOUEK})s5`MFeu?)#3aMktIm|y3UJ1rFn7;)6w(_rB{wxJ!8`l0r)XP}<&vo{fgRu?fe~11x zWdR3y$+XIsgA8TK*5Owb$=w^YcSlXvZNOKcS75`l;Xf z-R}JMv%9}I_paWHe=BK}In^1Om)b6#e1A^sr{J{#xPHa?`*FM6{KDLE6VkH_v$8Ws zrRU@nj+^>@)7|*_u}_w+0yOTkO~i?K3CQ+^nK%lHof+bJokUR*w&t?zuAtrjq+nEcjLX~w*H%Tg)uvE4Q|Ju z@qToK|FXQIuz1lt%p@tM39xnKWQyk+PQqk{WnqCKYf`?u%f{rottn`Q;~$(T=ol*dc>ni>mj>SeF1 zPs$JBq5s0$gOj#vjr6a03yWD7-uGi%_y?9p0nJTPLOGm+XaeXFt}M*RKrh-?7qQ&;O$RL}PB(c9+f49o>Fq z{y6_q@a*|smdZl6Z{m{uEBtf%G~A0o9@>R&Pu1%Ju3snMcxR^a`v4Ow`q}f*1r%O@ zFj>l7z2NvSM;R4}D==Ex7h$LI&=uIHShU+MVWX-uxx|A$<`#^tk4-3$4Y= z<#|2CaYk2Y`R3iU=5y0kczAgT->x-!e$2->*mtauh1OhV{d2q=?^VAL&-q`f{I<@& z(*N-I!s@SIO#exG>!JM-_uK{QVXA_p^F^uVN0`S6(t_>0kUmZiwkXIDRsZWx_Gt&;9G1$;KRb!;I^r z{cGV9tt@krUBUFGKb!U;{X}b@ukUlSjJaro8T~wue^jE+Fcv>t*YG@Bo-@Mt+WFog z-^ajxTzUTk-eF+k28L|^udQ(ZdMx@gsnKGR=St8-|N8$Kqy6ji&i~7fr`|Zd)omE} z+^JzxdmFP4e(@sL|0mxkl>T+utYGAc`_KJwZ_M_&=t5j?W$jQK_@ACS`YY?@TCqVB zwxVD2UrZ`XmUk%7%unq6o?kq#QEra;*X$*OPQl{7}rD5#+e6+c4iN<78S&u>77&m_K0P4eDG3b#6BUEyw#{4Gy zu5~2=P^HL;G8aBlY^u#l!uviMO&1%SWAp-wwXYa=ZYv-okp^Tbp>R<@UNV z6o&ad_}y;#Df*KW?`Ipz-Fw;U=^tVnmWTBh#s5da@3-7uch=M6e)`0REFW+R|DOhb z)N=d2IbWZ-2>c1l?R)ARm-gmo>-%47FO2jjG0#=TX)qq+78#Gx_Hy1rOnta`@uKp= zONuX@6*Dv@rm%GW#q;8N4dM2l`)e5Ek#RbV2f3v`j|Vx9F(T!uf(c_vGM*ITZ&?14 zlbe1#9u?wmTfQmaJf0QexW~ZbgghQL5%7nHX{_~G`PLeWluPJkt>drym1KYgN zL|kvXdM~^^N8G&2=E+457=rxUWkQ!GD4eVREI z*UtsY-8fsl^kIB6GflZ0Ppik-{#a=*LgQ%lIA8x~B+BCMgVf{s;913Gh2H&;db|KU zcUE~Et_kAfO7JTUo)_T!FTyWh;;-M4=d1>ww-UU-miMsh3psvh@8+%isp|_P^`RZp z=6Mfp35|beaT&Y`@t@-QLhP5LEIw`X-@dQZ84=FPO{Bn=|{Nx_~P$;geyCBe#!ZWK0jVAD@)>8A)7Sx zWt@*Kbv^)}f0tq|OQy8rF)^WLGz$A}GbUfox0skv^BZH|aae`x3iNAuzT#-?!=mr; zlKXA$K2=PNJ5B44BjY@G?~4uEMKPlF!*Akc1OJ`e-{t<}MZdro{XGAk2Y@eL$Z?#~ zzW-i?ll*g@>EDy};T-;cx9B2#)kV&#lf(ZCet6Es7cE{S22QCzykK$ptcsuE`h9wK z;ADNczrVB%e-DSo?@wXxSET2c^5cIsy}!cW!?;b8HZEtx$c%I;fB%#1J^H)=-u)*_ z|4-zPT>qku2<}7kc;7GCt#_Tr`FKfrF+Kz&_eo9~F9Z({|9{nXcscq%^H=J-(@-bP zKXrde>eVk6%vyjaIQ=LDetxKE!#+(MLFp7=c1g2nSO3#v@s z1`;~HmAL)`$b=WoV(@K%NzKc&2FGrn`G@yooz?TCLX(ueUu%rP`Y zc>e)jz$>zgcld|Dg~?jJJecY4bE@6ax1RiW^V4(4;q@r6z1{BBQP&OJMf zLxcHTa&IzgIU4mD_3d-K-HY&U(sGfT*iqbrQ2)jLI*czy7|Nfoyz_@)9O=h68^5QN zvNjmg`Om>~bfT|To>dLL87~)kCyYZAtM^_cf(~`T_ZvmO5q!4B&HqOqGsqFozfIOY z?C=u(QJ8(i8JmDPgUyt;t5N^?K77`T_`SgWL-cBR8^@`)8>i*%mnDn}d3&3NksZ8^ zYjuPPc#VV!ZQ~w4hY4-t9zSK(=%$Q!VjiFy@0`#W4EJ&DLQlu&ym$%sp%<p_`;hyR2 z*~6TrkiDr0cgPDj5-kiC&X@jWUbq~Dv)Ayz^vryFKas=X91Yon?W_}QK^A&uoxv;^ zYwubwT&AH(XKNt*PtW|xzF&M1>K9Zk6{w;X6fc^4(Z!haFY`&{a*T(DPFm1wnV6T6 zF+@N?v&JU{z>ZT}EWK#)!tzttgvIm;S-Df;8S*}7p`isw`FbwSHk|IU(U=50M=GxZ zmOUl7MPx6hCI41?>79i1${koqGd**_bm27#SM7y6AK~=ciZN|z=N&hU^M&#m^I<2& za}Zf*%U~~@S57C6Lb!e|80^ik&#mxr!8;N+_TMtcn8FK;pQM*rWfv9 zFWdkx+&qNK^}-bd<#fPEFC4B3CviE@g`T}WIBo-QOhf6Ig>W-nFhkF7HXV73kMDq@ zAl!r+ge&#J{oT$x;cypu;ZTQ8vTZm*)3e8ee0gw}7Y=pnqy>S!=eijw6&&yHp7p|^ z&YpC!7j7!gV^{y)_3DiYTM+ItFWl`$dH`(iU6du4-U-hk+!8O`o2I|DM`y!EDBNa* zyCw+t`?CyM6^-|q^Y6E0e0c zaE}@}t2iB(9rD6$M7XtHxPO_x)}FcSYcJfR2zOTyZfk4L-WOiD4G4Fy7cMQZmxQ`D zny>PfEGYNe>yU_D@2ld-9^an!rmLr_k{y+aBMtrdFah{C6 zMkpM{)FyfD|MLgUIWF84tG#eb5zcG>U+87$g}~m0J-l$s5YB7=Uzi${hdi9Sp?E7f zme4{k+@$4!$ECWx4;$L%Q~P&hTLQ+nGqf4+)sPK@n}mMMB-`dEA??`KaNQ9uUh6lu z2V4A|6IrHmJ!tzA@u>GUpW%i39L%=)v1M4dw&PKsJ-JWknTfrFhO*Th<+cxO$Kx60 zCu{8c;C7+C{+Ii%Qp{pZC!DizR#^RF&W=k&^<$N60)wYR$ z2;ma-{1baEz@+v@xLmBOZ4-}r?a9WrUYGfr3uaw%N%5Rnm!Pw<&|V0zKau#wT7QaU zTm3<~cmf~s;0+lE{6=5sTkjQJtnY}Qw(XRQu}$lXiQfhNA8b2izpp!r^AhcQg1Zi6 zJ@Pa=$;MwH+ZsRa@jP*>)8n`u(g)pn2IwUc0{^i-9={Z;zgD(Y|0DDZ?Qys9kG&pz zgfSO%o^^k z^FaJ9r?vnc?h~{4|G-a|)xoEGfFD3!!+T%~!{)nVsUbrDI+N_uV1<=g5den*5 z7n5)?^vmsejI(4C?zx?dcoxUVx;nuABc5z6j+Fa~Yzs@Mgubl)@#E)M+M^#n>8Q%( z_;Z;b&d7KB>WEg7D4^Oab%+& z%|#i`J%RNl>O%tZY||HZz9y#!wz9R&r@Th8t?79K;oi}41MwTSva9f|rq&o=;C#3J ziG)3vfBJ&XZz}6xh%2UQhtlR!X0_x8@hU;~-goCZ@yAZAm!fn91?N21s8M^)N zCPtiK|6nT{#;(8CZWl2C8U;AxPKeMguM-VO^ z;ih2S_9qe^M!2hW97X(NpU}_AL;XH32kRTuUf;e5*G~Hh5)QVqpFy~D5$+wV+x|pf zl+!i$c=5tk_8$=r=O5p5g>6~-qW`d_o0ndM$$q&ocWie02z`T2FkMb($w9{Xf;h8L ze)G_8WuGXVl$V}&YFm)${ixtto5$E?VLuT^Hu|=CXm9y1 z(jdz@DDSKB5#CU^6SzihRyZLqH$DH9K65~}$2Pu)J#JI*H{13>&Otm?->SV6wRZmC z1hFpf$Igv0=F<+W;QZu1E4F1xoCZ57+Fz6S5Jyf!gu9W)%MqU) zmq_f4aQ6oObC?|Tx$^GNzt~oL$j@791A822PD0_xsk!NeS(%v`F}=}ngx}$1{}S+v z8#iWRVeZtdpUU}Ugc)I|%N1^1AvB{Cr;v^-g!Xvj3X=Yg(DsMF4LxxuU zVBZVDejrUb2%Cq#Isb+K8g3rab+wl+4m%LxP-pVr9O*%0?gP%NRnI09fEWmk^)5WDfG$A&W{?MNA^s|qsqw-L{@L%|)>DmH+&kxP> zmU*N+x0IL63jK@!$FDO{Bz~g2Hdg?o&O+qs>*n#~3+YVfF#W zqs0#Uz;(|H`Zs5+hE3dM=;p6%K4*b#GZeMa-e4=tPEX65m^NZ!ZsDkm^by(PCXONM z!2?f|)3I-K#)vUFh3OOdUR+^TdiLnd>D9m7FqR&*pTMwg!$kefFfr_L3f%pH6 zOug6rOJk#f^?IYEKb82C4gb^-X+6VkuoMnvX?e?WHVPpBSxK{ zLlnubWagqM=cZ?8=Vj$`At!2u-8myhr{^MY_PE?}P>`OdsIPJsqnz*1zd7?H4%4qO z%K31wzIzY+-@j1raJh!99E8n7`^|H4P|juP2e$HauU`B&*cZRT9?tWeH}RdvPc6lJ}Oe19HQSJU?*O$yClAE5XTP) zhjy9kL{5u@Lp!znDveL<;rQm_+I!?ij1ja|+Y%1`-cTNdgDuL%c)}DM&&&d~E#c6f z-SA!zFTzl6B;IlUi2M}|hwI-4;i3b3h?8>rgj%0adnC0K=6lH)e+2H2q0Ytlg)W@_ zKKS*hr|T1{-K@^FC%Jl_$a`F`=60-s$@qZ#HxaPW9=}A-ZU=0mjZ0dlZ6@N8<@;w1 zEt}@~9f@!V+a2YW|8m~((ht{(%W7;mwjYb1y{49YM%l(0k-dOh7q`NHFmlW={|<1N3P;%90LPdWZ5`Gj^C z<1;}#NJB1s?sljCfWtU=ox~{`K&HQc9KjOG^CmZU5{y}Cw*3Z{)*W&!XK2zsMi2YnJdrd9&F;3g@lIi>ABLBt`|ylln_#>Rwkda^AZot`>o%@4Zb!IJ?DY)WpO4?Q5>Cqn>Wp0EBQGPl zY^e=16ZbeWS;BT-z)!EKDYCC@3*_pl_sII=aD1FD`z_wvhCG*r z{d@&KH7GQ9e2X>1uE}c88O#FKb znh&jgwukm6_aoV+$lkK8_P&C>xz3&~M`%;pqr$j!n$@#^|G@8a&)z?=t!+6)vVA*F z(0wOPvmZG@_!2xTp|2^0b6D8khxi@h4J@q3b#<=xBdAs2tLcui5Vxv+ zIiG}cx-HtY(uY+p_CAN+UNeh5)J=J$eCn-Ww%^em=T=;o`p0AZUd-3U`4n2%zeCVB zvU}LS@37rOwyDu^*_Ms&XmomRsXtE1{!Km>vZm=h0e$Ph9(<#`HoE-@>^Wb%qs;Xj zQ@f?pSn-QoT1}({F8Oj_;s^7-tK~5Z_iFgZ1cDBUzI4xkoz+48#^a6{E7XPU zpe$lcP#5Gge4)I7vWa=`vMn3kF^1OF^%q$ekKegg$J+z&^ZE(!h4P@mg8B7WSKmx` z+<)kT_k9Xs-MRRUk}WBRh@0}#Wm}$&x4xL}$d{O}?RYEe(4J!qP#5+a?WvugkLLko zTUhs4=w9&he-xOTf5f_U{Bkrte%9Z{ZDMgQ#9SBDH$2{m@xmZJ&Ko^H@%%s5k;o^pLa+s%t{B@FSzR*LHEy#V>FfNk&Qp{4W`mV`y1CfC)ap>bySUrF1l=Mp zKNou>n zA1{{;jt~6{G?u!s4t=7$J7p8kJ;*k1Q1qA3&9Ki0u&xTfdsHTVq7KZfmTf#wfpr^q ziv;L;c*o%mum?RI`loqX&*Hf|tZUq6^DCI=_my|t?*ZH7>8i2)gpH5um1<>QHiOQ7 zhfFSH(bgjhCOBz|c0x!ui6!ZIdlLe<<6$L2b7~H{R2s ze}OS5U08?fl02jZi#!`?<2E%o7#@#j2k30S;1)jrG;V5%b~gG8&(Dw!&%r^5xZJaK<`&dhF7DfwK=+)>Pd~o? zy?9600TpQ224^E{!Pt$jKNN1+r0-fs%Ko>E} zzE`?ld;?XtETp3>v=5U9vxmAw;Nz6MRzF|x{yommwIQ9EfIiIR5mtmh5ic0&Vb#|S zQr&%?Zas8kJ>5aCyc|nP9At~A#D{vx=BK%74Ro1-t|cbv^OnT-!+GbPJ3u=$tQ$Md z)13v~WKUOM-%lm^l2{=R2M!!PTH<@%)7=H#3{Q8fpPyEjnAneX38)vHpJO{iCmnUw zw%l<_U4PMe`MC{k_~Z+{_>P}amn6F2xKk#^1SVe`=vpP6QkTrSUdRhqJ~OMKyWG=V zaEg3M?3XAy)G1DPeoN>oJ>7lUj_GlC`O;r?=&w56DD>SX-{9%~;h(oom!!JHkj|8& zt)ILq(6w%MDqXVbhI+bdpj+$dMxDY>JT)rmL;uhnzk9xfZoQ|w+^?6cpZ%?FN}wx2 zTR-^$Pxqw#9*$qmlB}*Y(3QjI$&Y%v|9bV(4>ILgp!kXYnaj^?^i3x}73d;6xcGv7 zye7IOA)P6G3%adAn8-=4yaf9~x^;o>%NLZ8az+Ikhtvi0fK3?Parrc<#YiHR{t*$UHw`0M3 zT3L6ZgX+@JHe`BbjMdHi>2;=_f93Iu;upsA+gVt* zS~(xwLq&b(a(t}o`GSNu$I!>cLXCDA>VWa1db%SEi}8T~nY!R~T^DHhUdQ!sy90>( zSeWj|&};|s^SY}s_uv8vZ+f90*&h8ew?wSfa?P~`o?)i;hm~-A*Zn5YT|W=cJhgTz z^e1k1^-Hji*F=Z$RU048j)hM1Mgle)(eGc*chpnv#IuP+6D% zI_|gg<2XP4_vXS+JTDZ|Wt;^ZM4F4sFF0^mE<&%+rB;XZvB7axYz1DoGIuF$a8#GV(t?9 z)y=Q5^`_$(7Z`aHz7J*F#um5R^6vOGs?X=+zZm_&jbZxhp@;UVHE;$?%fn&g#W#ZE zx^zT^^46p5@u;=_-3*TQC*NMrM?M?ISA+k}m~Y@aFKw!A{Z?!B=nIV82afZam$t9z ze6bU?mgCy|<7#7;+dgf(7i~T}j(%2~zQ)|!1Y#`hXWRL;wN{U7-jOE^HIEW(qF=S+ zu8yM)Oh>-BrRQs5{y&08kWk+=o~0qqea*!1TFAf0@oi}I@BeJ;$@4ab#s3t>;o-x_ zn^iyXHv7Cpt@ZC&eGYQUvv|&OKH};hdJa;@>z}v$c^p6VE0S}=_#Z9*BRFg&7liRY zS&nP=DX^8iB#ggm`K#ctmAo{J|Jib`cVH{|;V}M|<>B) zjK6F7yWp@jsAm}er{(_yhpj<)NV#7Azi;{b;IK6)J&b>7`G?@JHRzf!{$I=g3l3X@ zUJc`)TK*|GYz_K4jDKPI7vQip=x7-K+VZc#VQcWfFn-8#wC7V`Yj8yvKWaJJ;wi8- z_;>YrJ~D%!qs3pE0$YP0w0wWWY3W@~<16Iz?&AOXMk^LqZu60gqH6#h;uyRy%x*)= z8;Wf+WKbAyYI##|*cviDjN^P3`;p+VHKa6*M`9iT#@F(r#4R(_jic1+dBOWdUxqM< zYv@12^c}6fBRJw3w$b(roj%6$7>#4N8*gzu*78_z*h*~{rbpW>{$ZRWAGT6ghjEMr z2*)*1K5UJoFrEniyMYzp@8#evZU587k3N*>QxOJnjVce*C);`($E`O2WPluJi`J(42DIam= zT^6QagmIY&Lub5$c6&WIzURh)t$(~~_|;E&7_a*X?bnnpI)4D1y1r~oWtGOi?~e#K z4(r!qh6Wbls7vR?Bi>^;ucjKa?R6aINE7|KY0=H`{0ilmFG=&bj4n6P{Y+DNe!na9 z`MCZQJ@V#}o3Xy#v~OY(174||-*2!C_42y|P1FmfU%;1I4*OyYlR7=l;l)0x9rd-! zMCI7;S4;dW1D?<8)h6l;KmIDq5x>}4Z`%FQkAIEj9RG6sHimIrBXj!TKjm}S4Pkt} zIVA?iw-`(Nkx5er?evWI8X;bC%t(J5AY^%n!>0{q#C;7k43Q( z?e_}Bzg+>(=k>iNGTZ07m2>$<-cx>^!IT2~JweW&J<8cWKcAF;z(k(m>-Q>`^1*4{ zXIlT;_pjFDyuRPGe#z(iJigBuG|jE=_4$6~68~Pj7Ze|-z0!~WfO5&-?dacLYFf|m z^Y@^&&*|f|95Jok_Y@_6>O5X&%=B8*>N`LEN4U1Ye1anWUzS!snh1G+3F}+FqxH)g zXgBP}wcAIgkVCop1J#Nd+EH|7S+a1{RvvGFaZ8MQv7I>>pBd0I_|A0KkMM5qJbY^n zMsR%0N9W-fr<(S$rlpqekFecT`B0SatM&RT>X?b`Ch;?muzHlQj^)@MYobbhJ?dn( zpK?EZ`b7MU8f)4G`Y7ee_n>~ny{a3QnRcg{ynrKZqQ4GxZx-yQ2@m{>QJ!`)-ZOT) zF<+f#+Agu*X-E2KYOL~0s_|W|i4uPsd{Q#d$JzLoYhL_-@1Vb9+6VEY-sSlD{5}jH z51(h+T;|RnwvXDLIhUU^IscMPriM-qAIA%@{EuUkN^L?J8oX;OV z7WZs6k;7d1Vf(4dQ?A20@?!G^CbEr*4APfo^*BCLaV%b2V_I)<<)8JavqJHwpsemP zt=CKZ7#H~>cgD;% zkGqfJy_E;7V~x#OEllHvClG)77~wRv4Cx+k%)*8U)5M(looOOG4SqpSQ|B5QhT|+t z3v=ebObg~R)+l^F!fe5_HNQiM`roHk{UY$KsQcG}2j8a_-`HlaPmOt{Bf>1jeckQB zb-UQEkn__#do4K1;7NQ5zRR~5d4y{QUchk_ZT_?Gm13W!R$#pf_eZCP*+-mw{!d+k z-F8wBG5;y>aP`>^xl`={WD^TrDeo&I}kzd_Ky z5lPAI!HH^Bo_na&W(VSlcMyG!5u8q`$452PyuscAK6*Z!|PyUc$J{ z_d)rGZ#1X)4Mew?B9O8TRTV3%LH`yr-#X|C!^vhUT*f%rRXgSrBlXr_6_P-ebvbZQA_K zbRHGbqx~0sb3=1b|DL^4k{IaG{xe7YX^!DO$kc(sBs3-mAkZ*`}M=Jwr;US`Z&$=bf-FHLKJJf8365AHKh zJtp-ZHN?0Omxasrc*h@{%MD+DBOFa@Xw2fl_4RC%Ise^!5XbnF5U1{^8*}-ShFV~Z z9Q{M{Mm55vn0DJu6V4yzG_9%fp}3#h;UY;xyJt<4ZXq6_oZIg*)KO@|+umw210HGh zH{kl^Ti8n$9@vjk&h7WJtE3HY+rqZr5`RbKYggktJWosfZC2R+h42^~KkA=Ll5np7 z$+Veo+i&5q%DMf18D;RsE~ZU{ZNG)bDM$Nl9^V1~(Eq)}w!gyTL!72zeOjuC%<_4n zaz6eI@5A*ScyHT2iymc;^LOYC&_>}}zsy87vfuL-j^l3gU-BBgyVe_R`z$=gi$4*4 zpfc0C%EsUKE@LXn^!l`RE$oj)dmI~FpMujgq#4(*@;4Lh^wdkkI5Z>whG%WihL+`H zeE5WY?+lKAUyKu8-UV93!TEDvE36mr^+h8&e&94MOF5UHD{y!ojx&+Jwf+mwRgUj2 zo9Q#bUpA3>CL+-1TaNw{Y?*hvnbt>q`vuCmet<9L!+T8Y_ig@){URw7=KQ((7yq~Z z2;bi{C>PV_<5wYn1-_5|rLBLP3SR^^7e8BfeB1zB>u=@dqNQo&A~&C-erBFw8Z$TF z;(m|QatL_`9Qqffritp=HfykO`QUssnCeCFU*c!qDtRCJMV~rbG~qLp58+F&Z>jR@ zsxWqq`U3h1|1hmccqKT>JuhOvg4bxmo6i1H@RhtzkKfMU@EVO-iToA)a&Xw?Wg^;! z9Yc7H#w<2%)&5HGHN4N-7hh=1JZHZOe4XX!Un0M;(3mV7f3d#?`__A0Y|)s(j;{l+ zR?hurO$&|b=KNcaeH)ZdL|^aQTX~(v;1wdMD<@SV!VzW73;Cph~%z;`JZ`!&2yqm!Kdo#4BbPe8aQo>1PEpPz^kElt~_TkC5oozjNhl4|uJom$(R@XST<0FZe!>i!Dlj#PM42{mR9ENh_t_ z>ipjaen9zzmAJRFhSw?mQhZ-W{NE3LP`UVDtNa3I{{VQM$Hf+<=Qw^4{D{ZJ7Nz%a zybk=Ba`8{nLg_7>e@AeSQL&jY1$~Q7yg_MSyYhVuynzM~|HKzc`>(YRElqEzTy&n_JwKtP>5-PB{!(8ljlb{7`3EgckMg+K zqO{45M}l{>9QM^0O6%|JM`2%#rZ?q8xGg&`(6{?O9&MCF{n>MM<^b@t=2FUjL#i$?v;@kH=s;g>JTA6q)Dp*&!BdrIJcItn5niWJGwtz*mZqmE7yrap8kOzhPX!;VT;dmB zXw)EQKMg!XdB$4wudn2F8r8$r575%|EahT9Re7|tp8=lhaj``s`TeqT{IkI2m}vW; zwrC`}n98A@cfHl~@sASwBj4rYkM;a=-md?B%@ego<_2k9BX-Rb&*8rA^+CPT@Ilzp zu_*b@hWbDwD_prM1;5aXw^ZXD;W(~UrfXkT^PO@WSOz%P5VgbLqnM z^z_S=OTNo7q7m=AeCM+CTjh9fkhxXM&4@Q#zGH6I^sAL~z9T(YXoPE5prz@!9^pmo zi!U_7)yvS*bo8frIUjxQD_8Owjp$_CEof=_3f^ari}*q#S~>sG7oC2K<$PQuuPF7X zOF!oMPruFMVvABga{LzXJCuumk`_wc>C(^V;@!&6N4TeJc%4$8G#&N4y8|5k4PK<& zNm?lN0q5V{;14Jl`{E0w-sJ4x3;wWj?)P1w=}%qk&g%!jA5$*&#TQC-{T66x`jei0 z@r6>kUoYkQG4N-seT*AzN#%7)9qNuBu9>F)Ub)y8UnsSo^Zyy}KPVUf#TQC#=j{I; z{3Ye%m!ePn9e zF1vx(Y4~F%Li7K1@V{6+msRnFhTrS#zlnYCC>Q@Ftu%a@^Zzg4|4=>-X?tiVuhZ~y z+b@8YrvFR1_%FWD@VUogowur&RjfPdxbB`zBFjnjV){;kKw77csN@vp$YQ!f5X zT4~sm&i`-mJhEal4&`V1LEfNYYw%uz6MHbPsl7MPXg;p#ez1Y@r`trGXC&ni$F87( zGRa5rnT9R5ejpAiuhTh{i+W&%hkBcoDdZXiL{|lr|RsYl$4PERw+W&$i zPcOD;=vc?m{ud;BTx`+M-j1XFFG%sY*rK6L9Y_0*@d8;mf7BMGeBwCTe=YmgKe0tA z?>L?cK34Voe!rKu@j9h!GCic6LrVo2%B6hBv80r0cYM(P7i1~t+^!8%16Dce>whWJ%8CY6;uU!^@WBsck!oCwW1GKXvJ=0$=BG zu|~FxnO`g7**JHc^4@k;rJ%-Ey^YRk{2|%w@cq<@U6=6e1@6( zq3YY(>w9RaV4HF|zTztlZtU!D1+TICL}Q-3M)ZTeboy=J+m%cF;wugMkBh$se1~$e zFTT*A-Om1Y@SUE%hSzD(b56ele3!??77e<}@txqim8T_b}o{@DL)Z6wWprwL+%Ei9;LW4Rv`?cWvJ#O_) z9N!0iz;Z4hQkE#$^>d-6f`gu3;-cigIQ;?eI**GjO0IGIAovl_zW74PJbyy!r#kRs z9v54bJj?MTcpr&kZU4j;B~Nnv74TPLL|Xj|xRzU>`Wk+}QjBP6MwI2~2Nq6M zzQ(ju9*Hm=m8Zhb=foEpa3|(Zh&~EDCd92R8c^tXNAOtXH;+R<@Ht+m0qOX@vFO={ zIOXiWrj-U@3Z&YP#lCpuh~N4`1EQV%IP6PQesi=jv$yg(4LHm8^P!~~Ny^2(_(J`E zaP||yla-5o@rC;Db@r3MQ??5ASiSgYsqEoF`R&#~nPTAGoeoXdxnCF(!ko`2BNjI2PfaZ&$HPM-muYdOlF zmR0KC()pK#efi48zf@kQes#{jT<`+rD{;- zPt!vE{^0y8!oIo6C4TXh`rYH=F9V;ieB~0 zu3YSkFVwHd*NnnAXFy9c5HBxcUwol{Jby#VZv}XzVC7x6X3*uaeg(af3TPYp`#gL26~@s$#bT>RDG8k@Fn%O`Dh<)*e5}vU3p{1D(mGkwZriBtJt$)zc%%;kv{vXTh zlu&Bxe`slDM4;EWC}E(}HwBNhoa>jRs^|OL>_4D3{|ac}4M`Ir|;KV=YJeG%XbG$|tlmGfuh0FTPUzR+m4q;PJ|D znvA)d$9bLb83Vn41ue}?RL=3MuM~fmi$5Owl9Y>m@rCeN1?|5;OEZ&|-_*mH$1ul{ z?a#L3kkHc16y;)He4+Sh&VDj@s^y%%7+$CNQ7->eurJMWKd zXj&+~t@AGpJVW(2euFty+JBEH=igZHENh?BFKMAZhn)Qk?8~*B{gbp%pMB21EbPly zF8L$AQlHmd{JG!-HvZ?0ne`s8Q=i9e{|8!{S)^R@M|`C|_qq5Bz{@P>_{CT1d6A31 z2>a$LABKCYFHGZg>N(clKZllP&R2eG73Qy=rM$mw-=L+LiH_CNHsnZv@}0T(n{SUo&VdxcPd|var7UbRXwK2=<(kHzDv2} zkK`rAy8a`yG;_CSUwon1_nrM+;Crn7i_m_fj)i}*JMB0cl*$_PshL;XaGr{_)6X0wf3QK13?hn5N>lvn)$<>N|Tr*5rn`v5H!Mk?p{)mQ3vmWw|E`=XSyef5R9?sxVhv9F`Y z#TIpa-tj2#80A%~@qDnh4_zOy=P$HW7^__37hkFC9WH*9fxgwh%Kud-3 z%EdqNmAX!M@yCHD+W1Q`e)lP_Q`Zc9f0z3=&{AQNa*01id8&&)5j@#)j$eGGuKfIt z=##K7MY+T;zEYPHF8*ZjROMBO=Xe&cQdUZ*b4y5l<*T;kOFUwxr2Zhj54RG6!JuKzSIsLSmxeOcI-?{VvY zDF1W8B~EQW)E0G_=k)pDMV?-4QI}BpEdVd`xb;8A>5IVUdR%N#m&T5lfzMZd3+67( z(ed4weWtq}-?`w6te(rag+E9ukg6oqL`-~F9%=Zaj``) z>m08Duk^UsqL`~3Ujn|=<6?_qLitk(zTD$ti(&>j{ZjCi%B6frS)!O&S3Z`5S1G?` zBA&fJ#_JSw2EGq1<##3c8s$>{BrmD6n_mYl6|Pe*_QetX%w;v{L7B&i_r|;*&A_KIVsCQ2lwf{{k%)ZngHg{77C>XLo%BEfsF_?29kd zxwW&u6}(3Is@*t0wfuBG-S*F*rNZr=ees1l@$+MHd}_dVc=p8?>J-ZV?ch7DeT<#H zJA~J%(_d`+3@sJzQZC20M)@nw{!VcC#f#*>91H67q|5(Z;Cn3R^h;dS=_04!jeUD9 zNB--vqE3a5@4>!W<&yuBR_Zj~<H_!lLUwoksO{{%rsi>iHIX-eM zDf)eTe4wSGrpo#J(sPlb-TXjksVE}gYKx-pu;(ANR1_K5S6?XF-9LwxilQv%<11x> zqVehqDWA|%QAg$Mf03+G^c?4Z6!yg^za4Xv=QZPXiq5h9Q)sCuR=MQAD(Cd6FVy}mXFmn|(mXD{nsmI**Gj zYUjpxp{1hr9v55G&h;OmrJ`z&i!EyB`j603(FTu;EoxWf;;#nZ=y9<{?Q$I70KQ4N zl#eoAr*^|!`Pc})S^1hf3^kdjytD29KubkiluQ0dUQ)Z(u6%3;->O{fi!apnduM+O z_%^HO{FAg$+nvt8t=Lzioa<+;tEsJOR3@r^lOa4e+Qd^#% z!u=Cysc5g|oPJ3Qwe9NCzX$tjl}r5ME8+bK`uq#DRJ2d|nn>I~6kn*#30FVVg73HX zx&E~LTNnR6>^tDu7hkB&UT1$l_(A2j9X96g9eJJFylMLv&{9#Ia!H@~LTz4h_78#| z@wnKcHcvWU2Y$?Q&VM;p)aG8tj~FUeEYF8&TByxU&c9>e4K%=Quj0GP`us(k%dLOV zQgK5se({ysEU@;WrQ)W_uVp>@fSkVO_W1{BsW?J8KR-TujqsKY@q8m6KWM2qGT>^9 zBHnU50z69jrT@hJ)uW=1c*@zwF)Nll)$2=53q?HW{EGsQQ9b9c+Mqb_|#;B%E{F8CtlV!w#j zsX6Z7X#ULyFIT=8bCNr}seGcHzW^;2S11?z;tMq&>Fk$-FY&n8qUK#3uK=&K9LHD7 z0yTH@E1;#~rOL%WNeeZ@D_+#UO7P{%7h~*j*A8B%W_z4}OTkwv7yrapYPQqGzZ|?u zx!AAdb!vu3VAcLg@HHM6Th#QB<5l46l=Jh=rTTnc)A#KCduXY6y>f|Pe5IyuyZG0E zS9@G+QPV#-z8-vo&qY&{sk}~23+(j; zv{bxVx%el(QqwFK|0eJ)mUH~oyiQGry7)I^-&T){Eo$1!@h#xnJTA7V=~<3%1+VeA z*rF!iJH8EkyYh0pBf#kVfhKR8K6?JvfXgwr^{b?nn!N1%-wwXhvoF3-6L5m6bQZDhw@H#a*)1@yFJX!fAZ)5yux$uTxx%iX7Q`1pR_E| z8E3lkk&Ar=%H{kzAod%)W6v*Wsier$OI*~z%`bwMO3FMgwy1%-{|YUY%(WcHPmeV< zSmyjM!@l{-#eXdy4Hi28=YlU%UWRzyF6DJ;+mOKLFQ**)IoQqP*-}jQ>2u>(n6Hj{iYRC6&s>zW727-28iJsbs0g#TK3ZrHj83e7WVE z|3$n`r@Qe#XsKkS<(xl~mvs6=PQM)cs+5cWl2$t1&5whYO4cYZ{TlQ0*7G`@Ug7+& z0$-F2oevmX04C>Q@EEp&PVm%r8E z8zRTlci-_N!XJSN4CA&Q? zwus#PPH3rQkH^Ipk!v5JrINiK7h6QGe*i6&)G9A|2lK;j;&q~tcK#ou|;GYKLB3maj`{shoH585d4V8 z#TJ>rJ6;EV%;RE<%x1@r7?LUnL8Sf^TV(EW{1|ux)l2!>!s}#~+42P~l{Qq)_1rV+ zzbUoz3!$abrphJ%YI&W^6kC3wrP2uHY+rpLGsM|%ihYsF#Xm_4;RREgerTyQN;%i> zwkKkN$_v%MbmE z{>k?*zln>RoH;HnrgyKHIDCbeL(2X`!S^w2_830j5f_zat3AH1*;OFx$DecQ!9C*A z$;!Dr*|Z;j)Ey7@ahm0v9!>l4wJtrAu@C)RUbsA2TgMkTJ`MY{6DswoP5beYF2C_E z|I*p2FGgSI73oi!bQ$)1al&h01di@UAX7AI{8L}P zclXPnrP6DavwiE!_l3^>RoJ)8>N)>3ufKQm$)KfDsY7+V$)3C4N4oP7?+Ytk<>@u9 zqbFSc-voZE$JN%+U5>8;zuj^^)~T|7^c9ysw_@L2%Ef<8>(NJ@|F?tRqdaFb#-skF z`qj2QgqBM0S1$RZd3p4DXCLn&FMY_fuf80;z}dea{84LvHRjvTQTsXWe18c13D3Uz za@5^VgqBL5_PE+Q>aGW%rPAjt=ls{aJnF8uprz6mJg&Bmxb_%YDt*y%&OgoTBkq15 zv{d@Ca>+l^m)3kh7?)>`?_-D$qF;=og+k@|> z+3Ou>sq{yHh#_@jq8xR{)CpwZ2K?v z)z+ahXCLixX*S>r-f{ zO!vw8V)OEl8y|y~$}&9r>PsE&pGkWKEtO?i`;Qy5v7xNjeQK}oprx{0<$S(aU+Ug> z`JaV-`IdA3XkOL5;nJUreFYv@TXmuGl@DHIIr7KmWu3eK4lVI@IWLkwn%26x&i^9t zxytdKYIC91S9RIW|1xmw=SBS2wAPJw{?7$pWI6k%c-nF_3QHVFaH0wuljE? z*r%oVZ8Ih{!k9zq-`cLGwI07pu;rG&gy&Z`h>f+U@hh@ptahd4n=o-IM)zGemCB!U@w0ZF<=5lJQl#?nrlaavyIwh`-{#e7cl{>X zYO7y}_WC2$w|08gZcvW*N75|KtE&BYf25?3wHvMee7vLN0nt}wn^qb>YmsiwKRG|O zEL071$CtI6t^Pb?E>`=uJZD;}p0!)7p3A3}Y;) zyIEQn;1g3;4{h0gs#V|Cl@Dmk4p=?DoiR&~-wn%6bB!O`vV+Q{e85L6H(cV5 z542@XJ$6Dj*>qNh-%IR6# z!0IQWewO*^X4!A8|DtW^>5r*?w$+Qasnz$!jm;S0*Z&*uALjBki?tC}&-MFWj zpT*ip<-^mO!0p^c2Qr^MoS<8MTYyFJyqCd;U z&)Qh!!%%)7PZhrOF@%4E zYL1`{!LsUR(@^cRHVy9%M!hoZZsZ^8P%KyH*!mq>nl;vP#NTYD@>tVa^=aT4$_Jr+ zu-`<#>U(>BLQAu$f4=z|tY{1_8_GiO&!g!Excg#;>J-Der z8D*Y{c=q39Ol6jdy~{+GGVeYd`t|s2Lit77pF;f02N=AEuFI$puU0+~?>C=?^#)_j z@DEI@ZXv!Q#LXC7Kf_+?x`3OHb}Ju*@_}_;Qn#6C)uU{`g=5MK&tJ1k-VuwC4BVg*cZR-w&?E@nOD8-v3Xtkav&%9p!7iY0McR@iWK%9v`Cb@Gb6N z^#Fgj9yiZ+((ecShU*8!)#Z#3H);5m-|QG;uAOVl-G}dLer+0XIQS>_XW=iu-yVNy)_!nIZmGwi5xx)n05~50 ztjD1dz90M``1&vojqn5Db>M5lI5fiXcixTQ3&S`xi*4FC-liXf@}K<=E!QHPT_SJB z`;|iJJEnWD#WA!?^F0_Zb9}bldF{Ino8}ua|1QKOwaDY=0)7R?Lr&D<`!1iw#mN`4 zd&Rg9h$klIW#~9@I3JxT|N8v`5Acq%lYU6Uv@8w1 ze_qQ^NAL=qdzH!~el)SXCjKAr{7>q4Zc@^qq%`qf>{DiQT$3%t3!jf@{q@*shEgY* zNWOoI_^CI__v}Qpi$CITGQRJEl7HSACQ|KNo}}l;Y_x@EqJBH?H=**adgyvh!8cUq zq5Z}29P-y0+S&2A2e>fIeyW^bG#hP8)6a39Ul?XTP0!ya7a;!IQIE!l z%8$lB)|mJ*_Sl%cm!k4pWTJRIl)elbKh7UcW9pi)__H*9Ek|lzjA$4Zf3CJqZyFqf zBE#RXJ*%Gmd~3f5diXM`eVF|MNuPOaG&u4i?aVOyu!-;Hnl~}OquHk@2akomA1LXA zU-EsRtME?L+3;n|3bl_`lxEMxH=Qu1$$wv7hw=DL@Jzq2BJbayJs+$Lzxnd*A4)v} zj`#DQtMBJGf4x|>oStb{7|J++6};bn0^aYB{F84^UmU>{?bZtYi~pnJ?D>^`0rZP> zKdv84$sbV9W|?Rn54L)mU9Noj6(N25TXcMY?bGZEt4IHYtgMfNknZPFx`12WWNg6W&c6_ z-VpN}QI6Z<`-JuQ8egb(c!Z(8BeYmqXK_83nBlQW& zk8tcq`$e;B@Qtc|;IqQ=5BUnc!EquUKk3vcOut3)-@N!9cqRDn!}MFlKXY|!@M^S= zg<<}0Go}yDm?xjY@w)@OHcSt{`1@CI!+i30^xx(L=a2ZmUC*D3Dq$aK?Q(xTJ^N*r zAzmyrdzUd?cbY!DVe_9?&8sc6e|s9jw5T$%1MK%t#C|30!?&WIxW3E8n*oM~`j>{k zf5Z#y(`@*`3m)!q_D$LYM!tVFdk@OkSH|4`F#@zOXRXxlXPLB@g^Ml=MP# zeo*Z7wBN5&e!#PT1bnaQndaL+DDIijdTq`dy<3_N-2YR39W<~Z_IZ7u>2=JHpKV$` zhmXNQ(>uZE$CPvW=Af^PH1_8Ebl(`-_g^@h!1@``+DqS{dp;PKVEOig1!Sy%hHg4u_3*A8TI*`|F6Ak zfo-cg!~X?D3lyk`n*^FtH+|WCkz@fyO<{4JnzF`R@0h|NqbXoNJ$IS{By%NK^1VL~o2q{${$w;V+Rm&R3zgc7yMsW&Hb!ocucJ z_Eom`iR$NI{V|6(g0lqrVSFA$`F+Yu`2RLBJ{RR9*(CAq%P@C&myC7eRDZv$UlK>2 z3;wS#PkTrtQvWi^99_a{j5TQ$5L;T2T>AKiYAWBqVeWHKb= zH+ZPRkss3dT?n^O1OLx`PCmy;K9h}PD>eK;=f^dE55n!#;L3lFV?M?{|B(Ge!yjpe zll}&c&*3g=cn9m}Dt(!!;B)`^{Jp??=v(~z0fEm#oAMK)TOY%?3G(?mFr7BB*yRavxFI!mj1m&o#$ihh`AYG^Z)LQ{{(+G?wyHw=LZsB z@Q5=$5cmV=-xZhdSeVX}kN%(Mf9osJj>49OTK^~bd(dEh0{kcrAczzB443^P(Z%rV z8!yZBeRt8N9OC@p^&cT)FJ!}y>yH6&&c`!qXDfUk);@Zeh08f#kNY3yi)#n^u!qUC%;WRh@5lLJ?Kt=SX_^1XWij6S7ur7__wo2Kz>=KtBY!iJ2Qj|J zvm)(>_$$UYkI3_*nV)Q({&g)y^{Jb%tqQs8?hfkT$?Mut! z@cTW)DoPxAmPEcVejVERxc9>ef#-eaE&DLR_KqlzKc5l{dP~t*A*uwht+xjVP&VI;a`D*^i z?K8c=?dwV5U%Cf#l;o%6z1VKQFg{6sEPP6BZ^}=+&wh_;o&E*fX9i{d@VzgrpjjEo zH~jm^NL_&W>miI0J8|Ei@aNU{k@qDvegjUMo|E{E7;ByU1J?NOra4oon%hrNw^Gv} z!-IJ#&KyWh$61<>)7;zX>R=8>`4>1^#rt4O>I0hlB3)(UGEVVZ@cd0`D$QG^^Q)y@ zy#K1Mibl1*%XK?dBjxk@8P?7ybr)4EQ}Y{vqaJbkyuX@iMLm6nDsGhhgVcYX;$toJ zpP0G)>`kiZ)A>Gyqx__N*qnHeDtP}UXWtSHZ$uc2EGu*<)ZVxP19Xn)mJ^$t}y_;w|q^Y>1?TB!O$bw0c( zKRXrwpiQT0Q7gam*StimK!^C4Uj8_aaZZ0XURfM|sh1Cqv-uAq zJW5wSr1Kw8IP*DtCtZ11*Pl7I{5=TormN1UfKxs=&X)f$!g$!xg>#(E-;3}Ac{s<} z{6`VSAu0U-5xMfcPvdiV56!HlYaN_9w*37F@1>ggx_%sI%Rhwh!+H1<8viiD`||LE z5?>y{`Rk21JmGz+IZ9Pd{;*8QU*3oL?M)&NYd+P>2g|h6e-`0KY1XK2AII7HA3=CO z&H5X)IQDUz-^=|cGSQxHL%HEA`fvG(_li5HlKX#S z;qS;u6JAJ{=a)&0Wn-68#U8c)Bk&6(&hw*NevA7Wse*sMnd48Dc=HmRv3?=W_x*@G z)8+h;<+Ds7pT~#4X~cijE+bE!Dt|0L^{Ld$er}ib+ok&Ng|C4N-+v$b7cBq&AES@J z`Skq%)*^kzt0fNoMff9}ue{6FpYfU;PV27_@;rMTT*zektlygJFb*Fl5C6Xc%db6v z`{&8=`zZ2`$MD`w&ioBHy$PRTe^Y!uxfb|)&ittsWV}{mKhGL44GD!8EuP1I|JdMX?29#B8D*!ZRN^!aX=H^ zHWRnCcEp5`a3tQ*w$2I$LZOv`;OdxR%+}DZsA+a~#XBNlE8ZS8W9^Ypt6|L2?ueSL z-Qm_iIBo?)W+2)TUS$~78Xk*7s@2vJ3JGWiAf>*!)&wga4FpZYn4`t_n89w5BpTrG zD$|lGO0kM7r3Ty0;A$au0n>%NwoqVI%ub@vLu_0}7`m9kpg^kytGYW)E7l$BGQ%+L za@^6`5sLAjG3K*uJ%ZD0yeviGX{2)EEKH1=s-)~QkA=oZhL(lF2C+-MJd<8S}GhY?%<}J4SWw@CCyhwtdOBoY*X|C!?w5#ai>zQJ(^;y zXK{Pn6(FBdtiZS#x-I2qr+&m%PATT#LWZ77u>vFNeqN!`QYqISjl!lCx5r(Z^C`vbaWiyV&Qg7W z!}L~vv68MR-ILS(Fj= zmY0b(Br4htjAXcv#cw*Pn&9xYNwOH1zbieod>%}Zw&eS_v zUG1@*#OXdY6-u?!rxP(*TvLHXNl%DsDwd8*dSGj|x9=vdqkeC0Zdnc^l}@G-TeE_x zI>|g0z6ej`slc8no%zyq%@A%+PItT5ong79t~?b=bf~4+XC*#Q1yL3jsl}Oc@)nNC zp!=F5YKF5)==bj2S+0J0DlpCGQUU7Nn>eR)d1A1i*Q0nab|xwnQ{fDppp}a=tQyjN z+>qp{@Fl4cXsEHW8prBoxw$#H`|`ZN!nEOytc8h8W+-E&dI$Rl5*b&6T{!OfKeQ>L z!ny9Q@>KYev|)=tBXRcYf=n?l zBRKNwT_e7T3dvsAGU8k}%$z)5N(DKa$3x2Yyhc4(;Y>p_U*-8LZI^bN=i3{w#kW`| z*g|Ef#5QQ@x#X!P%$vV0{smNKhj)=>ZP})#|5yeX*jo0JDtP=w$v_{=LeQ@cj%+EL zuWRAc)vyxV(^ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 00000000..c552249b --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,7 @@ + +

~19-GGbe|o0+Ku@q`nnj(=fOhjI1H{%<$xfZ~ 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